* Make the tests independent of the default precision.

* Change the default precision to 28 (to match VB's decimal type).
This commit is contained in:
Raymond Hettinger 2004-07-03 12:26:21 +00:00
parent 17c52d8493
commit 6ea4845822
2 changed files with 127 additions and 119 deletions

View file

@ -10,7 +10,6 @@
# Todo: # Todo:
# Provide a clean way of attaching monetary format representations # Provide a clean way of attaching monetary format representations
# Make tests independent of DefaultContext.prec == 9
""" """
@ -41,6 +40,7 @@ of the expected Decimal("0.00") returned by decimal floating point).
Here are some examples of using the decimal module: Here are some examples of using the decimal module:
>>> from decimal import * >>> from decimal import *
>>> getcontext().prec=9
>>> Decimal(0) >>> Decimal(0)
Decimal("0") Decimal("0")
>>> Decimal("1") >>> Decimal("1")
@ -129,7 +129,7 @@ __all__ = [
'Underflow', 'Underflow',
# Module parameters # Module parameters
'SINGLE_PRECISION', 'DEFAULT_MAX_EXPONENT', 'DEFAULT_MIN_EXPONENT', 'DEFAULT_MAX_EXPONENT', 'DEFAULT_MIN_EXPONENT',
# Constants for use in setting up contexts # Constants for use in setting up contexts
'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING', 'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
@ -149,9 +149,6 @@ import math
import operator import operator
xor = operator.xor xor = operator.xor
#Precision
SINGLE_PRECISION = 9
#Exponent Range #Exponent Range
DEFAULT_MAX_EXPONENT = 999999999 DEFAULT_MAX_EXPONENT = 999999999
DEFAULT_MIN_EXPONENT = -999999999 DEFAULT_MIN_EXPONENT = -999999999
@ -425,6 +422,8 @@ if hasattr(threading.currentThread(), '__decimal_context__'):
def setcontext(context): def setcontext(context):
"""Set this thread's context to context.""" """Set this thread's context to context."""
if context == DefaultContext:
context = Context()
threading.currentThread().__decimal_context__ = context threading.currentThread().__decimal_context__ = context
def getcontext(): def getcontext():
@ -2265,13 +2264,13 @@ class Context(object):
operation on the operand. Otherwise, the result is the same as using operation on the operand. Otherwise, the result is the same as using
the plus operation on the operand. the plus operation on the operand.
>>> DefaultContext.abs(Decimal('2.1')) >>> ExtendedDefaultContext.abs(Decimal('2.1'))
Decimal("2.1") Decimal("2.1")
>>> DefaultContext.abs(Decimal('-100')) >>> ExtendedDefaultContext.abs(Decimal('-100'))
Decimal("100") Decimal("100")
>>> DefaultContext.abs(Decimal('101.5')) >>> ExtendedDefaultContext.abs(Decimal('101.5'))
Decimal("101.5") Decimal("101.5")
>>> DefaultContext.abs(Decimal('-101.5')) >>> ExtendedDefaultContext.abs(Decimal('-101.5'))
Decimal("101.5") Decimal("101.5")
""" """
return a.__abs__(context=self) return a.__abs__(context=self)
@ -2279,9 +2278,9 @@ class Context(object):
def add(self, a, b): def add(self, a, b):
"""Return the sum of the two operands. """Return the sum of the two operands.
>>> DefaultContext.add(Decimal('12'), Decimal('7.00')) >>> ExtendedDefaultContext.add(Decimal('12'), Decimal('7.00'))
Decimal("19.00") Decimal("19.00")
>>> DefaultContext.add(Decimal('1E+2'), Decimal('1.01E+4')) >>> ExtendedDefaultContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
Decimal("1.02E+4") Decimal("1.02E+4")
""" """
return a.__add__(b, context=self) return a.__add__(b, context=self)
@ -2303,17 +2302,17 @@ class Context(object):
subtraction: '-1' if the result is less than zero, '0' if the result is subtraction: '-1' if the result is less than zero, '0' if the result is
zero or negative zero, or '1' if the result is greater than zero. zero or negative zero, or '1' if the result is greater than zero.
>>> DefaultContext.compare(Decimal('2.1'), Decimal('3')) >>> ExtendedDefaultContext.compare(Decimal('2.1'), Decimal('3'))
Decimal("-1") Decimal("-1")
>>> DefaultContext.compare(Decimal('2.1'), Decimal('2.1')) >>> ExtendedDefaultContext.compare(Decimal('2.1'), Decimal('2.1'))
Decimal("0") Decimal("0")
>>> DefaultContext.compare(Decimal('2.1'), Decimal('2.10')) >>> ExtendedDefaultContext.compare(Decimal('2.1'), Decimal('2.10'))
Decimal("0") Decimal("0")
>>> DefaultContext.compare(Decimal('3'), Decimal('2.1')) >>> ExtendedDefaultContext.compare(Decimal('3'), Decimal('2.1'))
Decimal("1") Decimal("1")
>>> DefaultContext.compare(Decimal('2.1'), Decimal('-3')) >>> ExtendedDefaultContext.compare(Decimal('2.1'), Decimal('-3'))
Decimal("1") Decimal("1")
>>> DefaultContext.compare(Decimal('-3'), Decimal('2.1')) >>> ExtendedDefaultContext.compare(Decimal('-3'), Decimal('2.1'))
Decimal("-1") Decimal("-1")
""" """
return a.compare(b, context=self) return a.compare(b, context=self)
@ -2321,25 +2320,25 @@ class Context(object):
def divide(self, a, b): def divide(self, a, b):
"""Decimal division in a specified context. """Decimal division in a specified context.
>>> DefaultContext.divide(Decimal('1'), Decimal('3')) >>> ExtendedDefaultContext.divide(Decimal('1'), Decimal('3'))
Decimal("0.333333333") Decimal("0.333333333")
>>> DefaultContext.divide(Decimal('2'), Decimal('3')) >>> ExtendedDefaultContext.divide(Decimal('2'), Decimal('3'))
Decimal("0.666666667") Decimal("0.666666667")
>>> DefaultContext.divide(Decimal('5'), Decimal('2')) >>> ExtendedDefaultContext.divide(Decimal('5'), Decimal('2'))
Decimal("2.5") Decimal("2.5")
>>> DefaultContext.divide(Decimal('1'), Decimal('10')) >>> ExtendedDefaultContext.divide(Decimal('1'), Decimal('10'))
Decimal("0.1") Decimal("0.1")
>>> DefaultContext.divide(Decimal('12'), Decimal('12')) >>> ExtendedDefaultContext.divide(Decimal('12'), Decimal('12'))
Decimal("1") Decimal("1")
>>> DefaultContext.divide(Decimal('8.00'), Decimal('2')) >>> ExtendedDefaultContext.divide(Decimal('8.00'), Decimal('2'))
Decimal("4.00") Decimal("4.00")
>>> DefaultContext.divide(Decimal('2.400'), Decimal('2.0')) >>> ExtendedDefaultContext.divide(Decimal('2.400'), Decimal('2.0'))
Decimal("1.20") Decimal("1.20")
>>> DefaultContext.divide(Decimal('1000'), Decimal('100')) >>> ExtendedDefaultContext.divide(Decimal('1000'), Decimal('100'))
Decimal("10") Decimal("10")
>>> DefaultContext.divide(Decimal('1000'), Decimal('1')) >>> ExtendedDefaultContext.divide(Decimal('1000'), Decimal('1'))
Decimal("1000") Decimal("1000")
>>> DefaultContext.divide(Decimal('2.40E+6'), Decimal('2')) >>> ExtendedDefaultContext.divide(Decimal('2.40E+6'), Decimal('2'))
Decimal("1.20E+6") Decimal("1.20E+6")
""" """
return a.__div__(b, context=self) return a.__div__(b, context=self)
@ -2347,11 +2346,11 @@ class Context(object):
def divide_int(self, a, b): def divide_int(self, a, b):
"""Divides two numbers and returns the integer part of the result. """Divides two numbers and returns the integer part of the result.
>>> DefaultContext.divide_int(Decimal('2'), Decimal('3')) >>> ExtendedDefaultContext.divide_int(Decimal('2'), Decimal('3'))
Decimal("0") Decimal("0")
>>> DefaultContext.divide_int(Decimal('10'), Decimal('3')) >>> ExtendedDefaultContext.divide_int(Decimal('10'), Decimal('3'))
Decimal("3") Decimal("3")
>>> DefaultContext.divide_int(Decimal('1'), Decimal('0.3')) >>> ExtendedDefaultContext.divide_int(Decimal('1'), Decimal('0.3'))
Decimal("3") Decimal("3")
""" """
return a.__floordiv__(b, context=self) return a.__floordiv__(b, context=self)
@ -2368,11 +2367,11 @@ class Context(object):
is chosen as the result. Otherwise the maximum (closer to positive is chosen as the result. Otherwise the maximum (closer to positive
infinity) of the two operands is chosen as the result. infinity) of the two operands is chosen as the result.
>>> DefaultContext.max(Decimal('3'), Decimal('2')) >>> ExtendedDefaultContext.max(Decimal('3'), Decimal('2'))
Decimal("3") Decimal("3")
>>> DefaultContext.max(Decimal('-10'), Decimal('3')) >>> ExtendedDefaultContext.max(Decimal('-10'), Decimal('3'))
Decimal("3") Decimal("3")
>>> DefaultContext.max(Decimal('1.0'), Decimal('1')) >>> ExtendedDefaultContext.max(Decimal('1.0'), Decimal('1'))
Decimal("1.0") Decimal("1.0")
""" """
return a.max(b, context=self) return a.max(b, context=self)
@ -2386,11 +2385,11 @@ class Context(object):
is chosen as the result. Otherwise the minimum (closer to negative is chosen as the result. Otherwise the minimum (closer to negative
infinity) of the two operands is chosen as the result. infinity) of the two operands is chosen as the result.
>>> DefaultContext.min(Decimal('3'), Decimal('2')) >>> ExtendedDefaultContext.min(Decimal('3'), Decimal('2'))
Decimal("2") Decimal("2")
>>> DefaultContext.min(Decimal('-10'), Decimal('3')) >>> ExtendedDefaultContext.min(Decimal('-10'), Decimal('3'))
Decimal("-10") Decimal("-10")
>>> DefaultContext.min(Decimal('1.0'), Decimal('1')) >>> ExtendedDefaultContext.min(Decimal('1.0'), Decimal('1'))
Decimal("1.0") Decimal("1.0")
""" """
return a.min(b, context=self) return a.min(b, context=self)
@ -2402,9 +2401,9 @@ class Context(object):
operation minus(a) is calculated as subtract('0', a) where the '0' operation minus(a) is calculated as subtract('0', a) where the '0'
has the same exponent as the operand. has the same exponent as the operand.
>>> DefaultContext.minus(Decimal('1.3')) >>> ExtendedDefaultContext.minus(Decimal('1.3'))
Decimal("-1.3") Decimal("-1.3")
>>> DefaultContext.minus(Decimal('-1.3')) >>> ExtendedDefaultContext.minus(Decimal('-1.3'))
Decimal("1.3") Decimal("1.3")
""" """
return a.__neg__(context=self) return a.__neg__(context=self)
@ -2417,15 +2416,15 @@ class Context(object):
resulting in a number which may be as long as the sum of the lengths resulting in a number which may be as long as the sum of the lengths
of the two operands. of the two operands.
>>> DefaultContext.multiply(Decimal('1.20'), Decimal('3')) >>> ExtendedDefaultContext.multiply(Decimal('1.20'), Decimal('3'))
Decimal("3.60") Decimal("3.60")
>>> DefaultContext.multiply(Decimal('7'), Decimal('3')) >>> ExtendedDefaultContext.multiply(Decimal('7'), Decimal('3'))
Decimal("21") Decimal("21")
>>> DefaultContext.multiply(Decimal('0.9'), Decimal('0.8')) >>> ExtendedDefaultContext.multiply(Decimal('0.9'), Decimal('0.8'))
Decimal("0.72") Decimal("0.72")
>>> DefaultContext.multiply(Decimal('0.9'), Decimal('-0')) >>> ExtendedDefaultContext.multiply(Decimal('0.9'), Decimal('-0'))
Decimal("-0.0") Decimal("-0.0")
>>> DefaultContext.multiply(Decimal('654321'), Decimal('654321')) >>> ExtendedDefaultContext.multiply(Decimal('654321'), Decimal('654321'))
Decimal("4.28135971E+11") Decimal("4.28135971E+11")
""" """
return a.__mul__(b, context=self) return a.__mul__(b, context=self)
@ -2436,17 +2435,17 @@ class Context(object):
Essentially a plus operation with all trailing zeros removed from the Essentially a plus operation with all trailing zeros removed from the
result. result.
>>> DefaultContext.normalize(Decimal('2.1')) >>> ExtendedDefaultContext.normalize(Decimal('2.1'))
Decimal("2.1") Decimal("2.1")
>>> DefaultContext.normalize(Decimal('-2.0')) >>> ExtendedDefaultContext.normalize(Decimal('-2.0'))
Decimal("-2") Decimal("-2")
>>> DefaultContext.normalize(Decimal('1.200')) >>> ExtendedDefaultContext.normalize(Decimal('1.200'))
Decimal("1.2") Decimal("1.2")
>>> DefaultContext.normalize(Decimal('-120')) >>> ExtendedDefaultContext.normalize(Decimal('-120'))
Decimal("-1.2E+2") Decimal("-1.2E+2")
>>> DefaultContext.normalize(Decimal('120.00')) >>> ExtendedDefaultContext.normalize(Decimal('120.00'))
Decimal("1.2E+2") Decimal("1.2E+2")
>>> DefaultContext.normalize(Decimal('0.00')) >>> ExtendedDefaultContext.normalize(Decimal('0.00'))
Decimal("0") Decimal("0")
""" """
return a.normalize(context=self) return a.normalize(context=self)
@ -2458,9 +2457,9 @@ class Context(object):
operation plus(a) is calculated as add('0', a) where the '0' operation plus(a) is calculated as add('0', a) where the '0'
has the same exponent as the operand. has the same exponent as the operand.
>>> DefaultContext.plus(Decimal('1.3')) >>> ExtendedDefaultContext.plus(Decimal('1.3'))
Decimal("1.3") Decimal("1.3")
>>> DefaultContext.plus(Decimal('-1.3')) >>> ExtendedDefaultContext.plus(Decimal('-1.3'))
Decimal("-1.3") Decimal("-1.3")
""" """
return a.__pos__(context=self) return a.__pos__(context=self)
@ -2483,33 +2482,33 @@ class Context(object):
division into 1, the operation is not halted at that point but division into 1, the operation is not halted at that point but
continues. continues.
>>> DefaultContext.power(Decimal('2'), Decimal('3')) >>> ExtendedDefaultContext.power(Decimal('2'), Decimal('3'))
Decimal("8") Decimal("8")
>>> DefaultContext.power(Decimal('2'), Decimal('-3')) >>> ExtendedDefaultContext.power(Decimal('2'), Decimal('-3'))
Decimal("0.125") Decimal("0.125")
>>> DefaultContext.power(Decimal('1.7'), Decimal('8')) >>> ExtendedDefaultContext.power(Decimal('1.7'), Decimal('8'))
Decimal("69.7575744") Decimal("69.7575744")
>>> DefaultContext.power(Decimal('Infinity'), Decimal('-2')) >>> ExtendedDefaultContext.power(Decimal('Infinity'), Decimal('-2'))
Decimal("0") Decimal("0")
>>> DefaultContext.power(Decimal('Infinity'), Decimal('-1')) >>> ExtendedDefaultContext.power(Decimal('Infinity'), Decimal('-1'))
Decimal("0") Decimal("0")
>>> DefaultContext.power(Decimal('Infinity'), Decimal('0')) >>> ExtendedDefaultContext.power(Decimal('Infinity'), Decimal('0'))
Decimal("1") Decimal("1")
>>> DefaultContext.power(Decimal('Infinity'), Decimal('1')) >>> ExtendedDefaultContext.power(Decimal('Infinity'), Decimal('1'))
Decimal("Infinity") Decimal("Infinity")
>>> DefaultContext.power(Decimal('Infinity'), Decimal('2')) >>> ExtendedDefaultContext.power(Decimal('Infinity'), Decimal('2'))
Decimal("Infinity") Decimal("Infinity")
>>> DefaultContext.power(Decimal('-Infinity'), Decimal('-2')) >>> ExtendedDefaultContext.power(Decimal('-Infinity'), Decimal('-2'))
Decimal("0") Decimal("0")
>>> DefaultContext.power(Decimal('-Infinity'), Decimal('-1')) >>> ExtendedDefaultContext.power(Decimal('-Infinity'), Decimal('-1'))
Decimal("-0") Decimal("-0")
>>> DefaultContext.power(Decimal('-Infinity'), Decimal('0')) >>> ExtendedDefaultContext.power(Decimal('-Infinity'), Decimal('0'))
Decimal("1") Decimal("1")
>>> DefaultContext.power(Decimal('-Infinity'), Decimal('1')) >>> ExtendedDefaultContext.power(Decimal('-Infinity'), Decimal('1'))
Decimal("-Infinity") Decimal("-Infinity")
>>> DefaultContext.power(Decimal('-Infinity'), Decimal('2')) >>> ExtendedDefaultContext.power(Decimal('-Infinity'), Decimal('2'))
Decimal("Infinity") Decimal("Infinity")
>>> DefaultContext.power(Decimal('0'), Decimal('0')) >>> ExtendedDefaultContext.power(Decimal('0'), Decimal('0'))
Decimal("NaN") Decimal("NaN")
""" """
return a.__pow__(b, modulo, context=self) return a.__pow__(b, modulo, context=self)
@ -2532,35 +2531,35 @@ class Context(object):
Also unlike other operations, quantize will never raise Underflow, even Also unlike other operations, quantize will never raise Underflow, even
if the result is subnormal and inexact. if the result is subnormal and inexact.
>>> DefaultContext.quantize(Decimal('2.17'), Decimal('0.001')) >>> ExtendedDefaultContext.quantize(Decimal('2.17'), Decimal('0.001'))
Decimal("2.170") Decimal("2.170")
>>> DefaultContext.quantize(Decimal('2.17'), Decimal('0.01')) >>> ExtendedDefaultContext.quantize(Decimal('2.17'), Decimal('0.01'))
Decimal("2.17") Decimal("2.17")
>>> DefaultContext.quantize(Decimal('2.17'), Decimal('0.1')) >>> ExtendedDefaultContext.quantize(Decimal('2.17'), Decimal('0.1'))
Decimal("2.2") Decimal("2.2")
>>> DefaultContext.quantize(Decimal('2.17'), Decimal('1e+0')) >>> ExtendedDefaultContext.quantize(Decimal('2.17'), Decimal('1e+0'))
Decimal("2") Decimal("2")
>>> DefaultContext.quantize(Decimal('2.17'), Decimal('1e+1')) >>> ExtendedDefaultContext.quantize(Decimal('2.17'), Decimal('1e+1'))
Decimal("0E+1") Decimal("0E+1")
>>> DefaultContext.quantize(Decimal('-Inf'), Decimal('Infinity')) >>> ExtendedDefaultContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
Decimal("-Infinity") Decimal("-Infinity")
>>> DefaultContext.quantize(Decimal('2'), Decimal('Infinity')) >>> ExtendedDefaultContext.quantize(Decimal('2'), Decimal('Infinity'))
Decimal("NaN") Decimal("NaN")
>>> DefaultContext.quantize(Decimal('-0.1'), Decimal('1')) >>> ExtendedDefaultContext.quantize(Decimal('-0.1'), Decimal('1'))
Decimal("-0") Decimal("-0")
>>> DefaultContext.quantize(Decimal('-0'), Decimal('1e+5')) >>> ExtendedDefaultContext.quantize(Decimal('-0'), Decimal('1e+5'))
Decimal("-0E+5") Decimal("-0E+5")
>>> DefaultContext.quantize(Decimal('+35236450.6'), Decimal('1e-2')) >>> ExtendedDefaultContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
Decimal("NaN") Decimal("NaN")
>>> DefaultContext.quantize(Decimal('-35236450.6'), Decimal('1e-2')) >>> ExtendedDefaultContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
Decimal("NaN") Decimal("NaN")
>>> DefaultContext.quantize(Decimal('217'), Decimal('1e-1')) >>> ExtendedDefaultContext.quantize(Decimal('217'), Decimal('1e-1'))
Decimal("217.0") Decimal("217.0")
>>> DefaultContext.quantize(Decimal('217'), Decimal('1e-0')) >>> ExtendedDefaultContext.quantize(Decimal('217'), Decimal('1e-0'))
Decimal("217") Decimal("217")
>>> DefaultContext.quantize(Decimal('217'), Decimal('1e+1')) >>> ExtendedDefaultContext.quantize(Decimal('217'), Decimal('1e+1'))
Decimal("2.2E+2") Decimal("2.2E+2")
>>> DefaultContext.quantize(Decimal('217'), Decimal('1e+2')) >>> ExtendedDefaultContext.quantize(Decimal('217'), Decimal('1e+2'))
Decimal("2E+2") Decimal("2E+2")
""" """
return a.quantize(b, context=self) return a.quantize(b, context=self)
@ -2577,17 +2576,17 @@ class Context(object):
(that is, if integer division on the same two operands would fail, the (that is, if integer division on the same two operands would fail, the
remainder cannot be calculated). remainder cannot be calculated).
>>> DefaultContext.remainder(Decimal('2.1'), Decimal('3')) >>> ExtendedDefaultContext.remainder(Decimal('2.1'), Decimal('3'))
Decimal("2.1") Decimal("2.1")
>>> DefaultContext.remainder(Decimal('10'), Decimal('3')) >>> ExtendedDefaultContext.remainder(Decimal('10'), Decimal('3'))
Decimal("1") Decimal("1")
>>> DefaultContext.remainder(Decimal('-10'), Decimal('3')) >>> ExtendedDefaultContext.remainder(Decimal('-10'), Decimal('3'))
Decimal("-1") Decimal("-1")
>>> DefaultContext.remainder(Decimal('10.2'), Decimal('1')) >>> ExtendedDefaultContext.remainder(Decimal('10.2'), Decimal('1'))
Decimal("0.2") Decimal("0.2")
>>> DefaultContext.remainder(Decimal('10'), Decimal('0.3')) >>> ExtendedDefaultContext.remainder(Decimal('10'), Decimal('0.3'))
Decimal("0.1") Decimal("0.1")
>>> DefaultContext.remainder(Decimal('3.6'), Decimal('1.3')) >>> ExtendedDefaultContext.remainder(Decimal('3.6'), Decimal('1.3'))
Decimal("1.0") Decimal("1.0")
""" """
return a.__mod__(b, context=self) return a.__mod__(b, context=self)
@ -2602,19 +2601,19 @@ class Context(object):
(that is, if integer division on the same two operands would fail, the (that is, if integer division on the same two operands would fail, the
remainder cannot be calculated). remainder cannot be calculated).
>>> DefaultContext.remainder_near(Decimal('2.1'), Decimal('3')) >>> ExtendedDefaultContext.remainder_near(Decimal('2.1'), Decimal('3'))
Decimal("-0.9") Decimal("-0.9")
>>> DefaultContext.remainder_near(Decimal('10'), Decimal('6')) >>> ExtendedDefaultContext.remainder_near(Decimal('10'), Decimal('6'))
Decimal("-2") Decimal("-2")
>>> DefaultContext.remainder_near(Decimal('10'), Decimal('3')) >>> ExtendedDefaultContext.remainder_near(Decimal('10'), Decimal('3'))
Decimal("1") Decimal("1")
>>> DefaultContext.remainder_near(Decimal('-10'), Decimal('3')) >>> ExtendedDefaultContext.remainder_near(Decimal('-10'), Decimal('3'))
Decimal("-1") Decimal("-1")
>>> DefaultContext.remainder_near(Decimal('10.2'), Decimal('1')) >>> ExtendedDefaultContext.remainder_near(Decimal('10.2'), Decimal('1'))
Decimal("0.2") Decimal("0.2")
>>> DefaultContext.remainder_near(Decimal('10'), Decimal('0.3')) >>> ExtendedDefaultContext.remainder_near(Decimal('10'), Decimal('0.3'))
Decimal("0.1") Decimal("0.1")
>>> DefaultContext.remainder_near(Decimal('3.6'), Decimal('1.3')) >>> ExtendedDefaultContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
Decimal("-0.3") Decimal("-0.3")
""" """
return a.remainder_near(b, context=self) return a.remainder_near(b, context=self)
@ -2625,13 +2624,13 @@ class Context(object):
The result is never affected by either the sign or the coefficient of The result is never affected by either the sign or the coefficient of
either operand. either operand.
>>> DefaultContext.same_quantum(Decimal('2.17'), Decimal('0.001')) >>> ExtendedDefaultContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
False False
>>> DefaultContext.same_quantum(Decimal('2.17'), Decimal('0.01')) >>> ExtendedDefaultContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
True True
>>> DefaultContext.same_quantum(Decimal('2.17'), Decimal('1')) >>> ExtendedDefaultContext.same_quantum(Decimal('2.17'), Decimal('1'))
False False
>>> DefaultContext.same_quantum(Decimal('Inf'), Decimal('-Inf')) >>> ExtendedDefaultContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
True True
""" """
return a.same_quantum(b) return a.same_quantum(b)
@ -2642,35 +2641,37 @@ class Context(object):
If the result must be inexact, it is rounded using the round-half-even If the result must be inexact, it is rounded using the round-half-even
algorithm. algorithm.
>>> DefaultContext.sqrt(Decimal('0')) >>> ExtendedDefaultContext.sqrt(Decimal('0'))
Decimal("0") Decimal("0")
>>> DefaultContext.sqrt(Decimal('-0')) >>> ExtendedDefaultContext.sqrt(Decimal('-0'))
Decimal("-0") Decimal("-0")
>>> DefaultContext.sqrt(Decimal('0.39')) >>> ExtendedDefaultContext.sqrt(Decimal('0.39'))
Decimal("0.624499800") Decimal("0.624499800")
>>> DefaultContext.sqrt(Decimal('100')) >>> ExtendedDefaultContext.sqrt(Decimal('100'))
Decimal("10") Decimal("10")
>>> DefaultContext.sqrt(Decimal('1')) >>> ExtendedDefaultContext.sqrt(Decimal('1'))
Decimal("1") Decimal("1")
>>> DefaultContext.sqrt(Decimal('1.0')) >>> ExtendedDefaultContext.sqrt(Decimal('1.0'))
Decimal("1.0") Decimal("1.0")
>>> DefaultContext.sqrt(Decimal('1.00')) >>> ExtendedDefaultContext.sqrt(Decimal('1.00'))
Decimal("1.0") Decimal("1.0")
>>> DefaultContext.sqrt(Decimal('7')) >>> ExtendedDefaultContext.sqrt(Decimal('7'))
Decimal("2.64575131") Decimal("2.64575131")
>>> DefaultContext.sqrt(Decimal('10')) >>> ExtendedDefaultContext.sqrt(Decimal('10'))
Decimal("3.16227766") Decimal("3.16227766")
>>> ExtendedDefaultContext.prec
9
""" """
return a.sqrt(context=self) return a.sqrt(context=self)
def subtract(self, a, b): def subtract(self, a, b):
"""Return the sum of the two operands. """Return the sum of the two operands.
>>> DefaultContext.subtract(Decimal('1.3'), Decimal('1.07')) >>> ExtendedDefaultContext.subtract(Decimal('1.3'), Decimal('1.07'))
Decimal("0.23") Decimal("0.23")
>>> DefaultContext.subtract(Decimal('1.3'), Decimal('1.30')) >>> ExtendedDefaultContext.subtract(Decimal('1.3'), Decimal('1.30'))
Decimal("0.00") Decimal("0.00")
>>> DefaultContext.subtract(Decimal('1.3'), Decimal('2.07')) >>> ExtendedDefaultContext.subtract(Decimal('1.3'), Decimal('2.07'))
Decimal("-0.77") Decimal("-0.77")
""" """
return a.__sub__(b, context=self) return a.__sub__(b, context=self)
@ -2698,21 +2699,21 @@ class Context(object):
of the operand as the precision setting, except that no flags will of the operand as the precision setting, except that no flags will
be set. The rounding mode is taken from the context. be set. The rounding mode is taken from the context.
>>> DefaultContext.to_integral(Decimal('2.1')) >>> ExtendedDefaultContext.to_integral(Decimal('2.1'))
Decimal("2") Decimal("2")
>>> DefaultContext.to_integral(Decimal('100')) >>> ExtendedDefaultContext.to_integral(Decimal('100'))
Decimal("100") Decimal("100")
>>> DefaultContext.to_integral(Decimal('100.0')) >>> ExtendedDefaultContext.to_integral(Decimal('100.0'))
Decimal("100") Decimal("100")
>>> DefaultContext.to_integral(Decimal('101.5')) >>> ExtendedDefaultContext.to_integral(Decimal('101.5'))
Decimal("102") Decimal("102")
>>> DefaultContext.to_integral(Decimal('-101.5')) >>> ExtendedDefaultContext.to_integral(Decimal('-101.5'))
Decimal("-102") Decimal("-102")
>>> DefaultContext.to_integral(Decimal('10E+5')) >>> ExtendedDefaultContext.to_integral(Decimal('10E+5'))
Decimal("1.0E+6") Decimal("1.0E+6")
>>> DefaultContext.to_integral(Decimal('7.89E+77')) >>> ExtendedDefaultContext.to_integral(Decimal('7.89E+77'))
Decimal("7.89E+77") Decimal("7.89E+77")
>>> DefaultContext.to_integral(Decimal('-Inf')) >>> ExtendedDefaultContext.to_integral(Decimal('-Inf'))
Decimal("-Infinity") Decimal("-Infinity")
""" """
return a.to_integral(context=self) return a.to_integral(context=self)
@ -2962,7 +2963,7 @@ _basic_traps.update({Inexact:0, Rounded:0, Subnormal:0})
# Is mutable, so than new contexts can have different default values # Is mutable, so than new contexts can have different default values
DefaultContext = Context( DefaultContext = Context(
prec=SINGLE_PRECISION, rounding=ROUND_HALF_EVEN, prec=28, rounding=ROUND_HALF_EVEN,
trap_enablers=dict.fromkeys(Signals, 0), trap_enablers=dict.fromkeys(Signals, 0),
flags=None, flags=None,
_rounding_decision=ALWAYS_ROUND, _rounding_decision=ALWAYS_ROUND,
@ -2981,7 +2982,7 @@ BasicDefaultContext = Context(
) )
ExtendedDefaultContext = Context( ExtendedDefaultContext = Context(
prec=SINGLE_PRECISION, rounding=ROUND_HALF_EVEN, prec=9, rounding=ROUND_HALF_EVEN,
trap_enablers=dict.fromkeys(Signals, 0), trap_enablers=dict.fromkeys(Signals, 0),
flags=None, flags=None,
_rounding_decision=ALWAYS_ROUND, _rounding_decision=ALWAYS_ROUND,

View file

@ -34,6 +34,13 @@ from decimal import *
from test.test_support import TestSkipped, run_unittest, run_doctest, is_resource_enabled from test.test_support import TestSkipped, run_unittest, run_doctest, is_resource_enabled
import threading import threading
# Tests are built around these assumed context defaults
DefaultContext.prec=9
DefaultContext.rounding=ROUND_HALF_EVEN
DefaultContext.trap_enablers=dict.fromkeys(Signals, 0)
setcontext(DefaultContext)
TESTDATADIR = 'decimaltestdata' TESTDATADIR = 'decimaltestdata'
if __name__ == '__main__': if __name__ == '__main__':
file = sys.argv[0] file = sys.argv[0]