Index: Doc/library/decimal.rst =================================================================== --- Doc/library/decimal.rst (revisión: 77330) +++ Doc/library/decimal.rst (copia de trabajo) @@ -999,8 +999,9 @@ a large number of methods for doing arithmetic directly in a given context. In addition, for each of the :class:`Decimal` methods described above (with the exception of the :meth:`adjusted` and :meth:`as_tuple` methods) there is - a corresponding :class:`Context` method. For example, ``C.exp(x)`` is - equivalent to ``x.exp(context=C)``. + a corresponding :class:`Context` method. For example, if you can do + ``x.exp(context=C)``, you can do ``C.exp(x)``. In every method you can + pass a decimal, integer, or any data type that would work in Decimal(). .. method:: clear_flags() Index: Lib/decimal.py =================================================================== --- Lib/decimal.py (revisión: 77330) +++ Lib/decimal.py (copia de trabajo) @@ -3838,7 +3838,8 @@ # Methods def abs(self, a): - """Returns the absolute value of the operand. + """Returns the absolute value of the operand. Operand can be Decimal + or int. If the operand is negative, the result is the same as using the minus operation on the operand. Otherwise, the result is the same as using @@ -3852,18 +3853,32 @@ Decimal('101.5') >>> ExtendedContext.abs(Decimal('-101.5')) Decimal('101.5') + >>> ExtendedContext.abs(-1) + Decimal('1') """ + a = _convert_other(a, raiseit=True) return a.__abs__(context=self) def add(self, a, b): - """Return the sum of the two operands. + """Return the sum of the two operands. They can be Decimal or int. >>> ExtendedContext.add(Decimal('12'), Decimal('7.00')) Decimal('19.00') >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4')) Decimal('1.02E+4') + >>> ExtendedContext.add(1, Decimal(2)) + Decimal('3') + >>> ExtendedContext.add(Decimal(8), 5) + Decimal('13') + >>> ExtendedContext.add(5, 5) + Decimal('10') """ - return a.__add__(b, context=self) + a = _convert_other(a, raiseit=True) + r = a.__add__(b, context=self) + if r is NotImplemented: + raise TypeError("Unable to convert %s to Decimal" % b) + else: + return r def _apply(self, a): return str(a._fix(self)) @@ -3873,14 +3888,19 @@ As we do not have different encodings for the same number, the received object already is in its canonical form. + + The operand can be an int. >>> ExtendedContext.canonical(Decimal('2.50')) Decimal('2.50') + >>> ExtendedContext.canonical(-1) + Decimal('-1') """ + a = _convert_other(a, raiseit=True) return a.canonical(context=self) def compare(self, a, b): - """Compares values numerically. + """Compares values numerically. The operands can be Decimal or int. If the signs of the operands differ, a value representing each operand ('-1' if the operand is less than zero, '0' if the operand is zero or @@ -3905,11 +3925,19 @@ Decimal('1') >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1')) Decimal('-1') + >>> ExtendedContext.compare(1, 2) + Decimal('-1') + >>> ExtendedContext.compare(Decimal(1), 2) + Decimal('-1') + >>> ExtendedContext.compare(1, Decimal(2)) + Decimal('-1') """ + a = _convert_other(a, raiseit=True) return a.compare(b, context=self) def compare_signal(self, a, b): """Compares the values of the two operands numerically. + The operands can be Decimal or int. It's pretty much like compare(), but all NaNs signal, with signaling NaNs taking precedence over quiet NaNs. @@ -3933,11 +3961,19 @@ Decimal('NaN') >>> print c.flags[InvalidOperation] 1 + >>> c.compare_signal(-1, 2) + Decimal('-1') + >>> c.compare_signal(Decimal(-1), 2) + Decimal('-1') + >>> c.compare_signal(-1, Decimal(2)) + Decimal('-1') """ + a = _convert_other(a, raiseit=True) return a.compare_signal(b, context=self) def compare_total(self, a, b): """Compares two operands using their abstract representation. + Operands can be Decimal or int. This is not like the standard compare, which use their numerical value. Note that a total ordering is defined for all possible abstract @@ -3955,7 +3991,14 @@ Decimal('1') >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN')) Decimal('-1') + >>> ExtendedContext.compare_total(1, 2) + Decimal('-1') + >>> ExtendedContext.compare_total(Decimal(1), 2) + Decimal('-1') + >>> ExtendedContext.compare_total(1, Decimal(2)) + Decimal('-1') """ + a = _convert_other(a, raiseit=True) return a.compare_total(b) def compare_total_mag(self, a, b): @@ -3963,40 +4006,53 @@ Like compare_total, but with operand's sign ignored and assumed to be 0. """ + a = _convert_other(a, raiseit=True) return a.compare_total_mag(b) def copy_abs(self, a): - """Returns a copy of the operand with the sign set to 0. + """Returns a copy of the operand with the sign set to 0. The operand + can be Decimal or int. >>> ExtendedContext.copy_abs(Decimal('2.1')) Decimal('2.1') >>> ExtendedContext.copy_abs(Decimal('-100')) Decimal('100') + >>> ExtendedContext.copy_abs(-1) + Decimal('1') """ + a = _convert_other(a, raiseit=True) return a.copy_abs() def copy_decimal(self, a): - """Returns a copy of the decimal objet. + """Returns a copy of the decimal object. Operand can also be a int. >>> ExtendedContext.copy_decimal(Decimal('2.1')) Decimal('2.1') >>> ExtendedContext.copy_decimal(Decimal('-1.00')) Decimal('-1.00') + >>> ExtendedContext.copy_decimal(1) + Decimal('1') """ + a = _convert_other(a) return Decimal(a) def copy_negate(self, a): """Returns a copy of the operand with the sign inverted. + Operand can be Decimal or int. >>> ExtendedContext.copy_negate(Decimal('101.5')) Decimal('-101.5') >>> ExtendedContext.copy_negate(Decimal('-101.5')) Decimal('101.5') + >>> ExtendedContext.copy_negate(1) + Decimal('-1') """ + a = _convert_other(a, raiseit=True) return a.copy_negate() def copy_sign(self, a, b): - """Copies the second operand's sign to the first one. + """Copies the second operand's sign to the first one. Operands can be + Decimal or int. In detail, it returns a copy of the first operand with the sign equal to the sign of the second operand. @@ -4009,11 +4065,20 @@ Decimal('-1.50') >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33')) Decimal('-1.50') + >>> ExtendedContext.copy_sign(1, -2) + Decimal('-1') + >>> ExtendedContext.copy_sign(Decimal(1), -2) + Decimal('-1') + >>> ExtendedContext.copy_sign(1, Decimal(-2)) + Decimal('-1') """ + b = _convert_other(b, raiseit=True) + a = _convert_other(a, raiseit=True) return a.copy_sign(b) def divide(self, a, b): - """Decimal division in a specified context. + """Decimal division in a specified context. + Operands can be Decimal or int. >>> ExtendedContext.divide(Decimal('1'), Decimal('3')) Decimal('0.333333333') @@ -4035,11 +4100,23 @@ Decimal('1000') >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2')) Decimal('1.20E+6') + >>> ExtendedContext.divide(5, 5) + Decimal('1') + >>> ExtendedContext.divide(Decimal(5), 5) + Decimal('1') + >>> ExtendedContext.divide(5, Decimal(5)) + Decimal('1') """ - return a.__div__(b, context=self) + a = _convert_other(a, raiseit=True) + r = a.__div__(b, context=self) + if r is NotImplemented: + raise TypeError("Unable to convert %s to Decimal" % b) + else: + return r def divide_int(self, a, b): """Divides two numbers and returns the integer part of the result. + Operands can be Decimal or int. >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3')) Decimal('0') @@ -4047,21 +4124,43 @@ Decimal('3') >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3')) Decimal('3') + >>> ExtendedContext.divide_int(10, 3) + Decimal('3') + >>> ExtendedContext.divide_int(Decimal(10), 3) + Decimal('3') + >>> ExtendedContext.divide_int(10, Decimal(3)) + Decimal('3') """ - return a.__floordiv__(b, context=self) - + a = _convert_other(a, raiseit=True) + r = a.__floordiv__(b, context=self) + if r is NotImplemented: + raise TypeError("Unable to convert %s to Decimal" % b) + else: + return r + def divmod(self, a, b): - """Return (a // b, a % b) - + """Return (a // b, a % b). Operands can be Decimal or int. + >>> ExtendedContext.divmod(Decimal(8), Decimal(3)) (Decimal('2'), Decimal('2')) >>> ExtendedContext.divmod(Decimal(8), Decimal(4)) (Decimal('2'), Decimal('0')) + >>> ExtendedContext.divmod(8, 4) + (Decimal('2'), Decimal('0')) + >>> ExtendedContext.divmod(Decimal(8), 4) + (Decimal('2'), Decimal('0')) + >>> ExtendedContext.divmod(8, Decimal(4)) + (Decimal('2'), Decimal('0')) """ - return a.__divmod__(b, context=self) - + a = _convert_other(a, raiseit=True) + r = a.__divmod__(b, context=self) + if r is NotImplemented: + raise TypeError("Unable to convert %s to Decimal" % b) + else: + return r + def exp(self, a): - """Returns e ** a. + """Returns e ** a. Operand can be Decimal or int. >>> c = ExtendedContext.copy() >>> c.Emin = -999 @@ -4078,11 +4177,14 @@ Decimal('2.00000000') >>> c.exp(Decimal('+Infinity')) Decimal('Infinity') + >>> c.exp(10) + Decimal('22026.4658') """ + a =_convert_other(a, raiseit=True) return a.exp(context=self) def fma(self, a, b, c): - """Returns a multiplied by b, plus c. + """Returns a multiplied by b, plus c. Operands can be Decimal or int. The first two operands are multiplied together, using multiply, the third operand is then added to the result of that @@ -4094,7 +4196,14 @@ Decimal('-8') >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578')) Decimal('1.38435736E+12') + >>> ExtendedContext.fma(1, 3, 4) + Decimal('7') + >>> ExtendedContext.fma(1, Decimal(3), 4) + Decimal('7') + >>> ExtendedContext.fma(1, 3, Decimal(4)) + Decimal('7') """ + a = _convert_other(a, raiseit=True) return a.fma(b, c, context=self) def is_canonical(self, a): @@ -4113,6 +4222,8 @@ A Decimal instance is considered finite if it is neither infinite nor a NaN. + + Operand can be int. >>> ExtendedContext.is_finite(Decimal('2.50')) True @@ -4124,11 +4235,18 @@ False >>> ExtendedContext.is_finite(Decimal('NaN')) False + >>> ExtendedContext.is_finite(1) + True """ + a = _convert_other(a, raiseit=True) return a.is_finite() def is_infinite(self, a): """Return True if the operand is infinite; otherwise return False. + + A Decimal instance is considered infinite if it is infinite or a NaN. + + Operand can be int. >>> ExtendedContext.is_infinite(Decimal('2.50')) False @@ -4136,12 +4254,17 @@ True >>> ExtendedContext.is_infinite(Decimal('NaN')) False + >>> ExtendedContext.is_infinite(1) + False """ + a = _convert_other(a, raiseit=True) return a.is_infinite() def is_nan(self, a): """Return True if the operand is a qNaN or sNaN; otherwise return False. + + Operand can be Decimal or int. >>> ExtendedContext.is_nan(Decimal('2.50')) False @@ -4149,12 +4272,17 @@ True >>> ExtendedContext.is_nan(Decimal('-sNaN')) True + >>> ExtendedContext.is_nan(1) + False """ + a = _convert_other(a, raiseit=True) return a.is_nan() def is_normal(self, a): """Return True if the operand is a normal number; otherwise return False. + + Operand can be Decimal or int. >>> c = ExtendedContext.copy() >>> c.Emin = -999 @@ -4169,11 +4297,16 @@ False >>> c.is_normal(Decimal('NaN')) False + >>> c.is_normal(1) + True """ + a = _convert_other(a, raiseit=True) return a.is_normal(context=self) def is_qnan(self, a): """Return True if the operand is a quiet NaN; otherwise return False. + + Operand can be Decimal or int. >>> ExtendedContext.is_qnan(Decimal('2.50')) False @@ -4181,11 +4314,16 @@ True >>> ExtendedContext.is_qnan(Decimal('sNaN')) False + >>> ExtendedContext.is_qnan(1) + False """ + a = _convert_other(a, raiseit=True) return a.is_qnan() def is_signed(self, a): """Return True if the operand is negative; otherwise return False. + + Operand can be Decimal or int. >>> ExtendedContext.is_signed(Decimal('2.50')) False @@ -4193,12 +4331,19 @@ True >>> ExtendedContext.is_signed(Decimal('-0')) True + >>> ExtendedContext.is_signed(8) + False + >>> ExtendedContext.is_signed(-8) + True """ + a = _convert_other(a, raiseit=True) return a.is_signed() def is_snan(self, a): """Return True if the operand is a signaling NaN; otherwise return False. + + Operand can be Decimal or int. >>> ExtendedContext.is_snan(Decimal('2.50')) False @@ -4206,11 +4351,16 @@ False >>> ExtendedContext.is_snan(Decimal('sNaN')) True + >>> ExtendedContext.is_snan(1) + False """ + a = _convert_other(a, raiseit=True) return a.is_snan() def is_subnormal(self, a): """Return True if the operand is subnormal; otherwise return False. + + Operand can be Decimal or int. >>> c = ExtendedContext.copy() >>> c.Emin = -999 @@ -4225,11 +4375,16 @@ False >>> c.is_subnormal(Decimal('NaN')) False + >>> c.is_subnormal(1) + False """ + a = _convert_other(a, raiseit=True) return a.is_subnormal(context=self) def is_zero(self, a): """Return True if the operand is a zero; otherwise return False. + + Operand can be Decimal or int. >>> ExtendedContext.is_zero(Decimal('0')) True @@ -4237,11 +4392,18 @@ False >>> ExtendedContext.is_zero(Decimal('-0E+2')) True + >>> ExtendedContext.is_zero(1) + False + >>> ExtendedContext.is_zero(0) + True """ + a = _convert_other(a, raiseit=True) return a.is_zero() def ln(self, a): """Returns the natural (base e) logarithm of the operand. + + Operand can be Decimal or int. >>> c = ExtendedContext.copy() >>> c.Emin = -999 @@ -4256,12 +4418,17 @@ Decimal('2.30258509') >>> c.ln(Decimal('+Infinity')) Decimal('Infinity') + >>> c.ln(1) + Decimal('0') """ + a = _convert_other(a, raiseit=True) return a.ln(context=self) def log10(self, a): """Returns the base 10 logarithm of the operand. + Operand can be Decimal or int. + >>> c = ExtendedContext.copy() >>> c.Emin = -999 >>> c.Emax = 999 @@ -4279,11 +4446,18 @@ Decimal('1.84509804') >>> c.log10(Decimal('+Infinity')) Decimal('Infinity') + >>> c.log10(0) + Decimal('-Infinity') + >>> c.log10(1) + Decimal('0') """ + a = _convert_other(a, raiseit=True) return a.log10(context=self) def logb(self, a): """ Returns the exponent of the magnitude of the operand's MSD. + + Operand can Decimal or int. The result is the integer which is the exponent of the magnitude of the most significant digit of the operand (as though the @@ -4298,13 +4472,20 @@ Decimal('-2') >>> ExtendedContext.logb(Decimal('0')) Decimal('-Infinity') + >>> ExtendedContext.logb(1) + Decimal('0') + >>> ExtendedContext.logb(10) + Decimal('1') + >>> ExtendedContext.logb(100) + Decimal('2') """ + a = _convert_other(a, raiseit=True) return a.logb(context=self) def logical_and(self, a, b): """Applies the logical operation 'and' between each operand's digits. - The operands must be both logical numbers. + The operands must be both logical numbers. They can be Decimal or int. >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0')) Decimal('0') @@ -4318,7 +4499,14 @@ Decimal('1000') >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10')) Decimal('10') + >>> ExtendedContext.logical_and(10, 01) + Decimal('0') + >>> ExtendedContext.logical_and(Decimal(10), 01) + Decimal('0') + >>> ExtendedContext.logical_and(10, Decimal(01)) + Decimal('0') """ + a = _convert_other(a, raiseit=True) return a.logical_and(b, context=self) def logical_invert(self, a): @@ -4340,7 +4528,7 @@ def logical_or(self, a, b): """Applies the logical operation 'or' between each operand's digits. - The operands must be both logical numbers. + The operands must be both logical numbers. They can be Decimal or int. >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0')) Decimal('0') @@ -4354,13 +4542,20 @@ Decimal('1110') >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10')) Decimal('1110') + >>> ExtendedContext.logical_or(10, 01) + Decimal('11') + >>> ExtendedContext.logical_or(Decimal(10), 01) + Decimal('11') + >>> ExtendedContext.logical_or(10, Decimal(01)) + Decimal('11') """ + a = _convert_other(a, raiseit=True) return a.logical_or(b, context=self) def logical_xor(self, a, b): """Applies the logical operation 'xor' between each operand's digits. - The operands must be both logical numbers. + The operands must be both logical numbers. They can be Decimal or int. >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0')) Decimal('0') @@ -4374,11 +4569,19 @@ Decimal('110') >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10')) Decimal('1101') + >>> ExtendedContext.logical_xor(10, 01) + Decimal('11') + >>> ExtendedContext.logical_xor(Decimal(10), 01) + Decimal('11') + >>> ExtendedContext.logical_xor(10, Decimal(01)) + Decimal('11') """ + a = _convert_other(a, raiseit=True) return a.logical_xor(b, context=self) - def max(self, a,b): + def max(self, a, b): """max compares two values numerically and returns the maximum. + Operands can be Decimal or int. If either operand is a NaN then the general rules apply. Otherwise, the operands are compared as though by the compare @@ -4394,15 +4597,37 @@ Decimal('1') >>> ExtendedContext.max(Decimal('7'), Decimal('NaN')) Decimal('7') + >>> ExtendedContext.max(1, 2) + Decimal('2') + >>> ExtendedContext.max(Decimal(1), 2) + Decimal('2') + >>> ExtendedContext.max(1, Decimal(2)) + Decimal('2') """ + a = _convert_other(a, raiseit=True) return a.max(b, context=self) def max_mag(self, a, b): - """Compares the values numerically with their sign ignored.""" + """Compares the values numerically with their sign ignored. + Operands can be Decimal or int. + + >>> ExtendedContext.max_mag(Decimal('7'), Decimal('NaN')) + Decimal('7') + >>> ExtendedContext.max_mag(Decimal('7'), Decimal('-10')) + Decimal('-10') + >>> ExtendedContext.max_mag(1, -2) + Decimal('-2') + >>> ExtendedContext.max_mag(Decimal(1), -2) + Decimal('-2') + >>> ExtendedContext.max_mag(1, Decimal(-2)) + Decimal('-2') + """ + a = _convert_other(a, raiseit=True) return a.max_mag(b, context=self) - def min(self, a,b): + def min(self, a, b): """min compares two values numerically and returns the minimum. + Operands can ben Decimal or int. If either operand is a NaN then the general rules apply. Otherwise, the operands are compared as though by the compare @@ -4418,15 +4643,38 @@ Decimal('1.0') >>> ExtendedContext.min(Decimal('7'), Decimal('NaN')) Decimal('7') + >>> ExtendedContext.min(1, 2) + Decimal('1') + >>> ExtendedContext.min(Decimal(1), 2) + Decimal('1') + >>> ExtendedContext.min(1, Decimal(29)) + Decimal('1') """ + a = _convert_other(a, raiseit=True) return a.min(b, context=self) def min_mag(self, a, b): - """Compares the values numerically with their sign ignored.""" + """Compares the values numerically with their sign ignored. + Operands can ben Decimal or int. + + >>> ExtendedContext.min_mag(Decimal('3'), Decimal('-2')) + Decimal('-2') + >>> ExtendedContext.min_mag(Decimal('-3'), Decimal('NaN')) + Decimal('-3') + >>> ExtendedContext.min_mag(1, -2) + Decimal('1') + >>> ExtendedContext.min_mag(Decimal(1), -2) + Decimal('1') + >>> ExtendedContext.min_mag(1, Decimal(-2)) + Decimal('1') + """ + a = _convert_other(a, raiseit=True) return a.min_mag(b, context=self) def minus(self, a): """Minus corresponds to unary prefix minus in Python. + + Operand can be Decimal or int. The operation is evaluated using the same rules as subtract; the operation minus(a) is calculated as subtract('0', a) where the '0' @@ -4436,16 +4684,19 @@ Decimal('-1.3') >>> ExtendedContext.minus(Decimal('-1.3')) Decimal('1.3') + >>> ExtendedContext.minus(1) + Decimal('-1') """ - return a.__neg__(context=self) + a = _convert_other(a, raiseit=True) + return a.__neg__(context=self) def multiply(self, a, b): - """multiply multiplies two operands. + """multiply multiplies two operands. Operands can be Decimal or int. If either operand is a special value then the general rules apply. - Otherwise, the operands are multiplied together ('long multiplication'), - resulting in a number which may be as long as the sum of the lengths - of the two operands. + Otherwise, the operands are multiplied together + ('long multiplication'), resulting in a number which may be as long as + the sum of the lengths of the two operands. >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3')) Decimal('3.60') @@ -4457,12 +4708,25 @@ Decimal('-0.0') >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321')) Decimal('4.28135971E+11') + >>> ExtendedContext.multiply(7, 7) + Decimal('49') + >>> ExtendedContext.multiply(Decimal(7), 7) + Decimal('49') + >>> ExtendedContext.multiply(7, Decimal(7)) + Decimal('49') """ - return a.__mul__(b, context=self) - + a = _convert_other(a, raiseit=True) + r = a.__mul__(b, context=self) + if r is NotImplemented: + raise TypeError("Unable to convert %s to Decimal" % b) + else: + return r + def next_minus(self, a): """Returns the largest representable number smaller than a. + Operand can be Decimal or int. + >>> c = ExtendedContext.copy() >>> c.Emin = -999 >>> c.Emax = 999 @@ -4474,12 +4738,17 @@ Decimal('-1.00000004') >>> c.next_minus(Decimal('Infinity')) Decimal('9.99999999E+999') + >>> c.next_minus(1) + Decimal('0.999999999') """ + a = _convert_other(a, raiseit=True) return a.next_minus(context=self) def next_plus(self, a): """Returns the smallest representable number larger than a. + Operand can be Decimal or int. + >>> c = ExtendedContext.copy() >>> c.Emin = -999 >>> c.Emax = 999 @@ -4491,11 +4760,16 @@ Decimal('-1.00000002') >>> c.next_plus(Decimal('-Infinity')) Decimal('-9.99999999E+999') + >>> c.next_plus(1) + Decimal('1.00000001') """ + a = _convert_other(a, raiseit=True) return a.next_plus(context=self) def next_toward(self, a, b): """Returns the number closest to a, in direction towards b. + + Operands can be Decimal or int. The result is the closest representable number from the first operand (but not the first operand) that is in the direction @@ -4519,7 +4793,14 @@ Decimal('-1.00000004') >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000')) Decimal('-0.00') + >>> c.next_toward(0, 1) + Decimal('1E-1007') + >>> c.next_toward(Decimal(0), 1) + Decimal('1E-1007') + >>> c.next_toward(0, Decimal(1)) + Decimal('1E-1007') """ + a = _convert_other(a, raiseit=True) return a.next_toward(b, context=self) def normalize(self, a): @@ -4527,6 +4808,8 @@ Essentially a plus operation with all trailing zeros removed from the result. + + Operand can be Decimal or int. >>> ExtendedContext.normalize(Decimal('2.1')) Decimal('2.1') @@ -4540,7 +4823,10 @@ Decimal('1.2E+2') >>> ExtendedContext.normalize(Decimal('0.00')) Decimal('0') + >>> ExtendedContext.normalize(6) + Decimal('6') """ + a = _convert_other(a, raiseit=True) return a.normalize(context=self) def number_class(self, a): @@ -4592,6 +4878,8 @@ def plus(self, a): """Plus corresponds to unary prefix plus in Python. + + Operand can be Decimal or int. The operation is evaluated using the same rules as add; the operation plus(a) is calculated as add('0', a) where the '0' @@ -4601,11 +4889,15 @@ Decimal('1.3') >>> ExtendedContext.plus(Decimal('-1.3')) Decimal('-1.3') + >>> ExtendedContext.plus(-1) + Decimal('-1') """ + a = _convert_other(a, raiseit=True) return a.__pos__(context=self) def power(self, a, b, modulo=None): """Raises a to the power of b, to modulo if given. + Operands can be Decimal or int. With two arguments, compute a**b. If a is negative then b must be integral. The result will be inexact unless b is @@ -4670,11 +4962,23 @@ Decimal('-0') >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537')) Decimal('1') + >>> ExtendedContext.power(7, 7) + Decimal('823543') + >>> ExtendedContext.power(Decimal(7), 7) + Decimal('823543') + >>> ExtendedContext.power(7, Decimal(7), 2) + Decimal('1') """ - return a.__pow__(b, modulo, context=self) + a = _convert_other(a, raiseit=True) + r = a.__pow__(b, modulo, context=self) + if r is NotImplemented: + raise TypeError("Unable to convert %s to Decimal" % b) + else: + return r def quantize(self, a, b): """Returns a value equal to 'a' (rounded), having the exponent of 'b'. + Operands can be Decimal or int. The coefficient of the result is derived from that of the left-hand operand. It may be rounded using the current rounding setting (if the @@ -4721,7 +5025,14 @@ Decimal('2.2E+2') >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2')) Decimal('2E+2') + >>> ExtendedContext.quantize(1, 2) + Decimal('1') + >>> ExtendedContext.quantize(Decimal(1), 2) + Decimal('1') + >>> ExtendedContext.quantize(1, Decimal(2)) + Decimal('1') """ + a = _convert_other(a, raiseit=True) return a.quantize(b, context=self) def radix(self): @@ -4733,7 +5044,8 @@ return Decimal(10) def remainder(self, a, b): - """Returns the remainder from integer division. + """Returns the remainder from integer division. Operands can be Decimal + or int. The result is the residue of the dividend after the operation of calculating integer division as described for divide-integer, rounded @@ -4756,14 +5068,26 @@ Decimal('0.1') >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3')) Decimal('1.0') + >>> ExtendedContext.remainder(22, 6) + Decimal('4') + >>> ExtendedContext.remainder(Decimal(22), 6) + Decimal('4') + >>> ExtendedContext.remainder(22, Decimal(6)) + Decimal('4') """ - return a.__mod__(b, context=self) - + a = _convert_other(a, raiseit=True) + r = a.__mod__(b, context=self) + if r is NotImplemented: + raise TypeError("Unable to convert %s to Decimal" % b) + else: + return r + def remainder_near(self, a, b): """Returns to be "a - b * n", where n is the integer nearest the exact value of "x / b" (if two integers are equally near then the even one is chosen). If the result is equal to 0 then its sign will be the sign of a. + Operands can be Decimal or int. This operation will fail under the same conditions as integer division (that is, if integer division on the same two operands would fail, the @@ -4783,11 +5107,19 @@ Decimal('0.1') >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3')) Decimal('-0.3') + >>> ExtendedContext.remainder_near(3, 11) + Decimal('3') + >>> ExtendedContext.remainder_near(Decimal(3), 11) + Decimal('3') + >>> ExtendedContext.remainder_near(3, Decimal(11)) + Decimal('3') """ + a = _convert_other(a, raiseit=True) return a.remainder_near(b, context=self) def rotate(self, a, b): - """Returns a rotated copy of a, b times. + """Returns a rotated copy of a, b times. Operands can be Decimal + or int. The coefficient of the result is a rotated copy of the digits in the coefficient of the first operand. The number of places of @@ -4805,11 +5137,19 @@ Decimal('123456789') >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2')) Decimal('345678912') + >>> ExtendedContext.rotate(1333333, 1) + Decimal('13333330') + >>> ExtendedContext.rotate(Decimal(1333333), 1) + Decimal('13333330') + >>> ExtendedContext.rotate(1333333, Decimal(1)) + Decimal('13333330') """ + a = _convert_other(a, raiseit=True) return a.rotate(b, context=self) def same_quantum(self, a, b): """Returns True if the two operands have the same exponent. + Operands can be Decimal or int. The result is never affected by either the sign or the coefficient of either operand. @@ -4822,11 +5162,19 @@ False >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf')) True + >>> ExtendedContext.same_quantum(10000, -1) + True + >>> ExtendedContext.same_quantum(Decimal(10000), -1) + True + >>> ExtendedContext.same_quantum(10000, Decimal(-1)) + True """ + a = _convert_other(a, raiseit=True) return a.same_quantum(b) def scaleb (self, a, b): """Returns the first operand after adding the second value its exp. + Operands can be Decimal or int. >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2')) Decimal('0.0750') @@ -4834,11 +5182,19 @@ Decimal('7.50') >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3')) Decimal('7.50E+3') + >>> ExtendedContext.scaleb(1, 4) + Decimal('1E+4') + >>> ExtendedContext.scaleb(Decimal(1), 4) + Decimal('1E+4') + >>> ExtendedContext.scaleb(1, Decimal(4)) + Decimal('1E+4') """ - return a.scaleb (b, context=self) + a = _convert_other(a, raiseit=True) + return a.scaleb(b, context=self) def shift(self, a, b): - """Returns a shifted copy of a, b times. + """Returns a shifted copy of a, b times. Operands can be Decimal or + int. The coefficient of the result is a shifted copy of the digits in the coefficient of the first operand. The number of places @@ -4857,11 +5213,20 @@ Decimal('123456789') >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2')) Decimal('345678900') + >>> ExtendedContext.shift(88888888, 2) + Decimal('888888800') + >>> ExtendedContext.shift(Decimal(88888888), 2) + Decimal('888888800') + >>> ExtendedContext.shift(88888888, Decimal(2)) + Decimal('888888800') """ + a = _convert_other(a, raiseit=True) return a.shift(b, context=self) def sqrt(self, a): """Square root of a non-negative number to context precision. + + Operand can be Decimal or int. If the result must be inexact, it is rounded using the round-half-even algorithm. @@ -4884,13 +5249,17 @@ Decimal('2.64575131') >>> ExtendedContext.sqrt(Decimal('10')) Decimal('3.16227766') + >>> ExtendedContext.sqrt(2) + Decimal('1.41421356') >>> ExtendedContext.prec 9 """ + a = _convert_other(a, raiseit=True) return a.sqrt(context=self) def subtract(self, a, b): """Return the difference between the two operands. + Operands can be Decimal or int. >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07')) Decimal('0.23') @@ -4898,25 +5267,44 @@ Decimal('0.00') >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07')) Decimal('-0.77') + >>> ExtendedContext.subtract(8, 5) + Decimal('3') + >>> ExtendedContext.subtract(Decimal(8), 5) + Decimal('3') + >>> ExtendedContext.subtract(8, Decimal(5)) + Decimal('3') """ - return a.__sub__(b, context=self) - + a = _convert_other(a, raiseit=True) + r = a.__sub__(b, context=self) + if r is NotImplemented: + raise TypeError("Unable to convert %s to Decimal" % b) + else: + return r + def to_eng_string(self, a): """Converts a number to a string, using scientific notation. + + Operand can be Decimal or int. The operation is not affected by the context. """ + a = _convert_other(a, raiseit=True) return a.to_eng_string(context=self) def to_sci_string(self, a): """Converts a number to a string, using scientific notation. + Operand can be Decimal or int. + The operation is not affected by the context. """ + a = _convert_other(a, raiseit=True) return a.__str__(context=self) def to_integral_exact(self, a): """Rounds to an integer. + + Operand can be Decimal or int. When the operand has a negative exponent, the result is the same as using the quantize() operation using the given operand as the @@ -4942,10 +5330,13 @@ >>> ExtendedContext.to_integral_exact(Decimal('-Inf')) Decimal('-Infinity') """ + a = _convert_other(a, raiseit=True) return a.to_integral_exact(context=self) def to_integral_value(self, a): """Rounds to an integer. + + Operand can be Decimal or int. When the operand has a negative exponent, the result is the same as using the quantize() operation using the given operand as the @@ -4970,6 +5361,7 @@ >>> ExtendedContext.to_integral_value(Decimal('-Inf')) Decimal('-Infinity') """ + a = _convert_other(a, raiseit=True) return a.to_integral_value(context=self) # the method name changed, but we provide also the old one, for compatibility Index: Lib/test/test_decimal.py =================================================================== --- Lib/test/test_decimal.py (revisión: 77330) +++ Lib/test/test_decimal.py (copia de trabajo) @@ -1639,6 +1639,432 @@ self.assertNotEqual(id(c.flags), id(d.flags)) self.assertNotEqual(id(c.traps), id(d.traps)) + def test_abs(self): + c = Context() + d = c.abs(Decimal(-1)) + self.assertEqual(c.abs(-1), d) + self.assertRaises(TypeError, c.abs, '-1') + + def test_add(self): + c = Context() + d = c.add(Decimal(1), Decimal(1)) + self.assertEqual(c.add(1, 1), d) + self.assertEqual(c.add(Decimal(1), 1), d) + self.assertEqual(c.add(1, Decimal(1)), d) + self.assertRaises(TypeError, c.add, '1', 1) + self.assertRaises(TypeError, c.add, 1, '1') + + def test_canonical(self): + c = Context() + d = c.canonical(Decimal(-1)) + self.assertEqual(c.canonical(-1), d) + self.assertRaises(TypeError, c.canonical, '-1') + + def test_compare(self): + c = Context() + d = c.compare(Decimal(1), Decimal(1)) + self.assertEqual(c.compare(1, 1), d) + self.assertEqual(c.compare(Decimal(1), 1), d) + self.assertEqual(c.compare(1, Decimal(1)), d) + self.assertRaises(TypeError, c.compare, '1', 1) + self.assertRaises(TypeError, c.compare, 1, '1') + + def test_compare_signal(self): + c = Context() + d = c.compare_signal(Decimal(1), Decimal(1)) + self.assertEqual(c.compare_signal(1, 1), d) + self.assertEqual(c.compare_signal(Decimal(1), 1), d) + self.assertEqual(c.compare_signal(1, Decimal(1)), d) + self.assertRaises(TypeError, c.compare_signal, '1', 1) + self.assertRaises(TypeError, c.compare_signal, 1, '1') + + def test_compare_total(self): + c = Context() + d = c.compare_total(Decimal(1), Decimal(1)) + self.assertEqual(c.compare_total(1, 1), d) + self.assertEqual(c.compare_total(Decimal(1), 1), d) + self.assertEqual(c.compare_total(1, Decimal(1)), d) + self.assertRaises(TypeError, c.compare_total, '1', 1) + self.assertRaises(TypeError, c.compare_total, 1, '1') + + def test_compare_total_mag(self): + c = Context() + d = c.compare_total_mag(Decimal(1), Decimal(1)) + self.assertEqual(c.compare_total_mag(1, 1), d) + self.assertEqual(c.compare_total_mag(Decimal(1), 1), d) + self.assertEqual(c.compare_total_mag(1, Decimal(1)), d) + self.assertRaises(TypeError, c.compare_total_mag, '1', 1) + self.assertRaises(TypeError, c.compare_total_mag, 1, '1') + + def test_copy_abs(self): + c = Context() + d = c.copy_abs(Decimal(-1)) + self.assertEqual(c.copy_abs(-1), d) + self.assertRaises(TypeError, c.copy_abs, '-1') + + def test_copy_decimal(self): + c = Context() + d = c.copy_decimal(Decimal(-1)) + self.assertEqual(c.copy_decimal(-1), d) + self.assertRaises(TypeError, c.copy_decimal, '-1') + + def test_copy_negate(self): + c = Context() + d = c.copy_negate(Decimal(-1)) + self.assertEqual(c.copy_negate(-1), d) + self.assertRaises(TypeError, c.copy_negate, '-1') + + def test_copy_sign(self): + c = Context() + d = c.copy_sign(Decimal(1), Decimal(-2)) + self.assertEqual(c.copy_sign(1, -2), d) + self.assertEqual(c.copy_sign(Decimal(1), -2), d) + self.assertEqual(c.copy_sign(1, Decimal(-2)), d) + self.assertRaises(TypeError, c.copy_sign, '1', -2) + self.assertRaises(TypeError, c.copy_sign, 1, '-2') + + def test_divide(self): + c = Context() + d = c.divide(Decimal(1), Decimal(2)) + self.assertEqual(c.divide(1, 2), d) + self.assertEqual(c.divide(Decimal(1), 2), d) + self.assertEqual(c.divide(1, Decimal(2)), d) + self.assertRaises(TypeError, c.divide, '1', 2) + self.assertRaises(TypeError, c.divide, 1, '2') + + def test_divide_int(self): + c = Context() + d = c.divide_int(Decimal(1), Decimal(2)) + self.assertEqual(c.divide_int(1, 2), d) + self.assertEqual(c.divide_int(Decimal(1), 2), d) + self.assertEqual(c.divide_int(1, Decimal(2)), d) + self.assertRaises(TypeError, c.divide_int, '1', 2) + self.assertRaises(TypeError, c.divide_int, 1, '2') + + def test_divmod(self): + c = Context() + d = c.divmod(Decimal(1), Decimal(2)) + self.assertEqual(c.divmod(1, 2), d) + self.assertEqual(c.divmod(Decimal(1), 2), d) + self.assertEqual(c.divmod(1, Decimal(2)), d) + self.assertRaises(TypeError, c.divmod, '1', 2) + self.assertRaises(TypeError, c.divmod, 1, '2') + + def test_exp(self): + c = Context() + d = c.exp(Decimal(10)) + self.assertEqual(c.exp(10), d) + self.assertRaises(TypeError, c.exp, '10') + + def test_fma(self): + c = Context() + d = c.fma(Decimal(2), Decimal(3), Decimal(4)) + self.assertEqual(c.fma(2, 3, 4), d) + self.assertEqual(c.fma(Decimal(2), 3, 4), d) + self.assertEqual(c.fma(2, Decimal(3), 4), d) + self.assertEqual(c.fma(2, 3, Decimal(4)), d) + self.assertEqual(c.fma(Decimal(2), Decimal(3), 4), d) + self.assertRaises(TypeError, c.fma, '2', 3, 4) + self.assertRaises(TypeError, c.fma, 2, '3', 4) + self.assertRaises(TypeError, c.fma, 2, 3, '4') + + def test_is_finite(self): + c = Context() + d = c.is_finite(Decimal(10)) + self.assertEqual(c.is_finite(10), d) + self.assertRaises(TypeError, c.is_finite, '10') + + def test_is_infinite(self): + c = Context() + d = c.is_infinite(Decimal(10)) + self.assertEqual(c.is_infinite(10), d) + self.assertRaises(TypeError, c.is_infinite, '10') + + def test_is_nan(self): + c = Context() + d = c.is_nan(Decimal(10)) + self.assertEqual(c.is_nan(10), d) + self.assertRaises(TypeError, c.is_nan, '10') + + def test_is_normal(self): + c = Context() + d = c.is_normal(Decimal(10)) + self.assertEqual(c.is_normal(10), d) + self.assertRaises(TypeError, c.is_normal, '10') + + def test_is_qnan(self): + c = Context() + d = c.is_qnan(Decimal(10)) + self.assertEqual(c.is_qnan(10), d) + self.assertRaises(TypeError, c.is_qnan, '10') + + def test_is_signed(self): + c = Context() + d = c.is_signed(Decimal(10)) + self.assertEqual(c.is_signed(10), d) + self.assertRaises(TypeError, c.is_signed, '10') + + def test_is_snan(self): + c = Context() + d = c.is_snan(Decimal(10)) + self.assertEqual(c.is_snan(10), d) + self.assertRaises(TypeError, c.is_snan, '10') + + def test_is_subnormal(self): + c = Context() + d = c.is_subnormal(Decimal(10)) + self.assertEqual(c.is_subnormal(10), d) + self.assertRaises(TypeError, c.is_subnormal, '10') + + def test_is_zero(self): + c = Context() + d = c.is_zero(Decimal(10)) + self.assertEqual(c.is_zero(10), d) + self.assertRaises(TypeError, c.is_zero, '10') + + def test_ln(self): + c = Context() + d = c.ln(Decimal(10)) + self.assertEqual(c.ln(10), d) + self.assertRaises(TypeError, c.ln, '10') + + def test_log10(self): + c = Context() + d = c.log10(Decimal(10)) + self.assertEqual(c.log10(10), d) + self.assertRaises(TypeError, c.log10, '10') + + def test_logb(self): + c = Context() + d = c.logb(Decimal(10)) + self.assertEqual(c.logb(10), d) + self.assertRaises(TypeError, c.logb, '10') + + def test_logical_and(self): + c = Context() + d = c.logical_and(Decimal(1), Decimal(1)) + self.assertEqual(c.logical_and(1, 1), d) + self.assertEqual(c.logical_and(Decimal(1), 1), d) + self.assertEqual(c.logical_and(1, Decimal(1)), d) + self.assertRaises(TypeError, c.logical_and, '1', 1) + self.assertRaises(TypeError, c.logical_and, 1, '1') + + def test_logical_or(self): + c = Context() + d = c.logical_or(Decimal(1), Decimal(1)) + self.assertEqual(c.logical_or(1, 1), d) + self.assertEqual(c.logical_or(Decimal(1), 1), d) + self.assertEqual(c.logical_or(1, Decimal(1)), d) + self.assertRaises(TypeError, c.logical_or, '1', 1) + self.assertRaises(TypeError, c.logical_or, 1, '1') + + def test_logical_xor(self): + c = Context() + d = c.logical_xor(Decimal(1), Decimal(1)) + self.assertEqual(c.logical_xor(1, 1), d) + self.assertEqual(c.logical_xor(Decimal(1), 1), d) + self.assertEqual(c.logical_xor(1, Decimal(1)), d) + self.assertRaises(TypeError, c.logical_xor, '1', 1) + self.assertRaises(TypeError, c.logical_xor, 1, '1') + + def test_max(self): + c = Context() + d = c.max(Decimal(1), Decimal(2)) + self.assertEqual(c.max(1, 2), d) + self.assertEqual(c.max(Decimal(1), 2), d) + self.assertEqual(c.max(1, Decimal(2)), d) + self.assertRaises(TypeError, c.max, '1', 2) + self.assertRaises(TypeError, c.max, 1, '2') + + def test_max_mag(self): + c = Context() + d = c.max_mag(Decimal(1), Decimal(2)) + self.assertEqual(c.max_mag(1, 2), d) + self.assertEqual(c.max_mag(Decimal(1), 2), d) + self.assertEqual(c.max_mag(1, Decimal(2)), d) + self.assertRaises(TypeError, c.max_mag, '1', 2) + self.assertRaises(TypeError, c.max_mag, 1, '2') + + def test_min(self): + c = Context() + d = c.min(Decimal(1), Decimal(2)) + self.assertEqual(c.min(1, 2), d) + self.assertEqual(c.min(Decimal(1), 2), d) + self.assertEqual(c.min(1, Decimal(2)), d) + self.assertRaises(TypeError, c.min, '1', 2) + self.assertRaises(TypeError, c.min, 1, '2') + + def test_min_mag(self): + c = Context() + d = c.min_mag(Decimal(1), Decimal(2)) + self.assertEqual(c.min_mag(1, 2), d) + self.assertEqual(c.min_mag(Decimal(1), 2), d) + self.assertEqual(c.min_mag(1, Decimal(2)), d) + self.assertRaises(TypeError, c.min_mag, '1', 2) + self.assertRaises(TypeError, c.min_mag, 1, '2') + + def test_minus(self): + c = Context() + d = c.minus(Decimal(10)) + self.assertEqual(c.minus(10), d) + self.assertRaises(TypeError, c.minus, '10') + + def test_multiply(self): + c = Context() + d = c.multiply(Decimal(1), Decimal(2)) + self.assertEqual(c.multiply(1, 2), d) + self.assertEqual(c.multiply(Decimal(1), 2), d) + self.assertEqual(c.multiply(1, Decimal(2)), d) + self.assertRaises(TypeError, c.multiply, '1', 2) + self.assertRaises(TypeError, c.multiply, 1, '2') + + def test_next_minus(self): + c = Context() + d = c.next_minus(Decimal(10)) + self.assertEqual(c.next_minus(10), d) + self.assertRaises(TypeError, c.next_minus, '10') + + def test_next_plus(self): + c = Context() + d = c.next_plus(Decimal(10)) + self.assertEqual(c.next_plus(10), d) + self.assertRaises(TypeError, c.next_plus, '10') + + def test_next_toward(self): + c = Context() + d = c.next_toward(Decimal(1), Decimal(2)) + self.assertEqual(c.next_toward(1, 2), d) + self.assertEqual(c.next_toward(Decimal(1), 2), d) + self.assertEqual(c.next_toward(1, Decimal(2)), d) + self.assertRaises(TypeError, c.next_toward, '1', 2) + self.assertRaises(TypeError, c.next_toward, 1, '2') + + def test_normalize(self): + c = Context() + d = c.normalize(Decimal(10)) + self.assertEqual(c.normalize(10), d) + self.assertRaises(TypeError, c.normalize, '10') + + def test_power(self): + c = Context() + d = c.power(Decimal(1), Decimal(4), Decimal(2)) + self.assertEqual(c.power(1, 4, 2), d) + self.assertEqual(c.power(Decimal(1), 4, 2), d) + self.assertEqual(c.power(1, Decimal(4), 2), d) + self.assertEqual(c.power(1, 4, Decimal(2)), d) + self.assertEqual(c.power(Decimal(1), Decimal(4), 2), d) + self.assertRaises(TypeError, c.power, '1', 4, 2) + self.assertRaises(TypeError, c.power, 1, '4', 2) + self.assertRaises(TypeError, c.power, 1, 4, '2') + + def test_plus(self): + c = Context() + d = c.plus(Decimal(10)) + self.assertEqual(c.plus(10), d) + self.assertRaises(TypeError, c.plus, '10') + + def test_quantize(self): + c = Context() + d = c.quantize(Decimal(1), Decimal(2)) + self.assertEqual(c.quantize(1, 2), d) + self.assertEqual(c.quantize(Decimal(1), 2), d) + self.assertEqual(c.quantize(1, Decimal(2)), d) + self.assertRaises(TypeError, c.quantize, '1', 2) + self.assertRaises(TypeError, c.quantize, 1, '2') + + def test_remainder(self): + c = Context() + d = c.remainder(Decimal(1), Decimal(2)) + self.assertEqual(c.remainder(1, 2), d) + self.assertEqual(c.remainder(Decimal(1), 2), d) + self.assertEqual(c.remainder(1, Decimal(2)), d) + self.assertRaises(TypeError, c.remainder, '1', 2) + self.assertRaises(TypeError, c.remainder, 1, '2') + + def test_remainder_near(self): + c = Context() + d = c.remainder_near(Decimal(1), Decimal(2)) + self.assertEqual(c.remainder_near(1, 2), d) + self.assertEqual(c.remainder_near(Decimal(1), 2), d) + self.assertEqual(c.remainder_near(1, Decimal(2)), d) + self.assertRaises(TypeError, c.remainder_near, '1', 2) + self.assertRaises(TypeError, c.remainder_near, 1, '2') + + def test_rotate(self): + c = Context() + d = c.rotate(Decimal(1), Decimal(2)) + self.assertEqual(c.rotate(1, 2), d) + self.assertEqual(c.rotate(Decimal(1), 2), d) + self.assertEqual(c.rotate(1, Decimal(2)), d) + self.assertRaises(TypeError, c.rotate, '1', 2) + self.assertRaises(TypeError, c.rotate, 1, '2') + + def test_sqrt(self): + c = Context() + d = c.sqrt(Decimal(10)) + self.assertEqual(c.sqrt(10), d) + self.assertRaises(TypeError, c.sqrt, '10') + + def test_same_quantum(self): + c = Context() + d = c.same_quantum(Decimal(1), Decimal(2)) + self.assertEqual(c.same_quantum(1, 2), d) + self.assertEqual(c.same_quantum(Decimal(1), 2), d) + self.assertEqual(c.same_quantum(1, Decimal(2)), d) + self.assertRaises(TypeError, c.same_quantum, '1', 2) + self.assertRaises(TypeError, c.same_quantum, 1, '2') + + def test_scaleb(self): + c = Context() + d = c.scaleb(Decimal(1), Decimal(2)) + self.assertEqual(c.scaleb(1, 2), d) + self.assertEqual(c.scaleb(Decimal(1), 2), d) + self.assertEqual(c.scaleb(1, Decimal(2)), d) + self.assertRaises(TypeError, c.scaleb, '1', 2) + self.assertRaises(TypeError, c.scaleb, 1, '2') + + def test_shift(self): + c = Context() + d = c.shift(Decimal(1), Decimal(2)) + self.assertEqual(c.shift(1, 2), d) + self.assertEqual(c.shift(Decimal(1), 2), d) + self.assertEqual(c.shift(1, Decimal(2)), d) + self.assertRaises(TypeError, c.shift, '1', 2) + self.assertRaises(TypeError, c.shift, 1, '2') + + def test_subtract(self): + c = Context() + d = c.subtract(Decimal(1), Decimal(2)) + self.assertEqual(c.subtract(1, 2), d) + self.assertEqual(c.subtract(Decimal(1), 2), d) + self.assertEqual(c.subtract(1, Decimal(2)), d) + self.assertRaises(TypeError, c.subtract, '1', 2) + self.assertRaises(TypeError, c.subtract, 1, '2') + + def test_to_eng_string(self): + c = Context() + d = c.to_eng_string(Decimal(10)) + self.assertEqual(c.to_eng_string(10), d) + self.assertRaises(TypeError, c.to_eng_string, '10') + + def test_to_sci_string(self): + c = Context() + d = c.to_sci_string(Decimal(10)) + self.assertEqual(c.to_sci_string(10), d) + self.assertRaises(TypeError, c.to_sci_string, '10') + + def test_to_integral_exact(self): + c = Context() + d = c.to_integral_exact(Decimal(10)) + self.assertEqual(c.to_integral_exact(10), d) + self.assertRaises(TypeError, c.to_integral_exact, '10') + + def test_to_integral_value(self): + c = Context() + d = c.to_integral_value(Decimal(10)) + self.assertEqual(c.to_integral_value(10), d) + self.assertRaises(TypeError, c.to_integral_value, '10') + class WithStatementTest(unittest.TestCase): # Can't do these as docstrings until Python 2.6 # as doctest can't handle __future__ statements