summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/decimal.py525
-rw-r--r--Lib/doctest.py13
-rw-r--r--Lib/test/decimaltestdata/abs.decTest2
-rw-r--r--Lib/test/decimaltestdata/add.decTest31
-rw-r--r--Lib/test/decimaltestdata/and.decTest2
-rw-r--r--Lib/test/decimaltestdata/base.decTest2
-rw-r--r--Lib/test/decimaltestdata/clamp.decTest2
-rw-r--r--Lib/test/decimaltestdata/class.decTest2
-rw-r--r--Lib/test/decimaltestdata/compare.decTest2
-rw-r--r--Lib/test/decimaltestdata/comparetotal.decTest2
-rw-r--r--Lib/test/decimaltestdata/comparetotmag.decTest2
-rw-r--r--Lib/test/decimaltestdata/copy.decTest2
-rw-r--r--Lib/test/decimaltestdata/copyabs.decTest2
-rw-r--r--Lib/test/decimaltestdata/copynegate.decTest2
-rw-r--r--Lib/test/decimaltestdata/copysign.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddAbs.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddAdd.decTest12
-rw-r--r--Lib/test/decimaltestdata/ddAnd.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddBase.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddCanonical.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddClass.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddCompare.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddCompareSig.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddCompareTotal.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddCompareTotalMag.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddCopy.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddCopyAbs.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddCopyNegate.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddCopySign.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddDivide.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddDivideInt.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddEncode.decTest5
-rw-r--r--Lib/test/decimaltestdata/ddFMA.decTest30
-rw-r--r--Lib/test/decimaltestdata/ddInvert.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddLogB.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddMax.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddMaxMag.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddMin.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddMinMag.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddMinus.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddMultiply.decTest89
-rw-r--r--Lib/test/decimaltestdata/ddNextMinus.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddNextPlus.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddNextToward.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddOr.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddPlus.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddQuantize.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddReduce.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddRemainder.decTest15
-rw-r--r--Lib/test/decimaltestdata/ddRemainderNear.decTest16
-rw-r--r--Lib/test/decimaltestdata/ddRotate.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddSameQuantum.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddScaleB.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddShift.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddSubtract.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddToIntegral.decTest2
-rw-r--r--Lib/test/decimaltestdata/ddXor.decTest2
-rw-r--r--Lib/test/decimaltestdata/decDouble.decTest2
-rw-r--r--Lib/test/decimaltestdata/decQuad.decTest2
-rw-r--r--Lib/test/decimaltestdata/decSingle.decTest2
-rw-r--r--Lib/test/decimaltestdata/divide.decTest2
-rw-r--r--Lib/test/decimaltestdata/divideint.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqAbs.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqAdd.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqAnd.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqBase.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqCanonical.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqClass.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqCompare.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqCompareSig.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqCompareTotal.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqCompareTotalMag.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqCopy.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqCopyAbs.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqCopyNegate.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqCopySign.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqDivide.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqDivideInt.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqEncode.decTest9
-rw-r--r--Lib/test/decimaltestdata/dqFMA.decTest27
-rw-r--r--Lib/test/decimaltestdata/dqInvert.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqLogB.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqMax.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqMaxMag.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqMin.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqMinMag.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqMinus.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqMultiply.decTest130
-rw-r--r--Lib/test/decimaltestdata/dqNextMinus.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqNextPlus.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqNextToward.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqOr.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqPlus.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqQuantize.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqReduce.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqRemainder.decTest13
-rw-r--r--Lib/test/decimaltestdata/dqRemainderNear.decTest15
-rw-r--r--Lib/test/decimaltestdata/dqRotate.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqSameQuantum.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqScaleB.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqShift.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqSubtract.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqToIntegral.decTest2
-rw-r--r--Lib/test/decimaltestdata/dqXor.decTest2
-rw-r--r--Lib/test/decimaltestdata/dsBase.decTest5
-rw-r--r--Lib/test/decimaltestdata/dsEncode.decTest5
-rw-r--r--Lib/test/decimaltestdata/exp.decTest2
-rw-r--r--Lib/test/decimaltestdata/fma.decTest2
-rw-r--r--Lib/test/decimaltestdata/inexact.decTest2
-rw-r--r--Lib/test/decimaltestdata/invert.decTest2
-rw-r--r--Lib/test/decimaltestdata/ln.decTest2
-rw-r--r--Lib/test/decimaltestdata/log10.decTest2
-rw-r--r--Lib/test/decimaltestdata/logb.decTest2
-rw-r--r--Lib/test/decimaltestdata/max.decTest2
-rw-r--r--Lib/test/decimaltestdata/maxmag.decTest2
-rw-r--r--Lib/test/decimaltestdata/min.decTest2
-rw-r--r--Lib/test/decimaltestdata/minmag.decTest2
-rw-r--r--Lib/test/decimaltestdata/minus.decTest2
-rw-r--r--Lib/test/decimaltestdata/multiply.decTest2
-rw-r--r--Lib/test/decimaltestdata/nextminus.decTest2
-rw-r--r--Lib/test/decimaltestdata/nextplus.decTest2
-rw-r--r--Lib/test/decimaltestdata/nexttoward.decTest2
-rw-r--r--Lib/test/decimaltestdata/or.decTest2
-rw-r--r--Lib/test/decimaltestdata/plus.decTest2
-rw-r--r--Lib/test/decimaltestdata/power.decTest2
-rw-r--r--Lib/test/decimaltestdata/powersqrt.decTest2
-rw-r--r--Lib/test/decimaltestdata/quantize.decTest2
-rw-r--r--Lib/test/decimaltestdata/randomBound32.decTest2
-rw-r--r--Lib/test/decimaltestdata/randoms.decTest2
-rw-r--r--Lib/test/decimaltestdata/reduce.decTest2
-rw-r--r--Lib/test/decimaltestdata/remainder.decTest2
-rw-r--r--Lib/test/decimaltestdata/remainderNear.decTest14
-rw-r--r--Lib/test/decimaltestdata/rescale.decTest2
-rw-r--r--Lib/test/decimaltestdata/rotate.decTest2
-rw-r--r--Lib/test/decimaltestdata/rounding.decTest2
-rw-r--r--Lib/test/decimaltestdata/samequantum.decTest2
-rw-r--r--Lib/test/decimaltestdata/scaleb.decTest2
-rw-r--r--Lib/test/decimaltestdata/shift.decTest2
-rw-r--r--Lib/test/decimaltestdata/squareroot.decTest2
-rw-r--r--Lib/test/decimaltestdata/subtract.decTest2
-rw-r--r--Lib/test/decimaltestdata/testall.decTest2
-rw-r--r--Lib/test/decimaltestdata/tointegral.decTest2
-rw-r--r--Lib/test/decimaltestdata/tointegralx.decTest2
-rw-r--r--Lib/test/decimaltestdata/xor.decTest2
-rw-r--r--Lib/test/test_decimal.py1
-rw-r--r--Lib/test/test_doctest.py1
-rw-r--r--Lib/test/test_funcattrs.py12
-rw-r--r--Lib/trace.py2
148 files changed, 758 insertions, 466 deletions
diff --git a/Lib/decimal.py b/Lib/decimal.py
index faf9bf7..7842cb2 100644
--- a/Lib/decimal.py
+++ b/Lib/decimal.py
@@ -214,10 +214,10 @@ class InvalidOperation(DecimalException):
def handle(self, context, *args):
if args:
if args[0] == 1: # sNaN, must drop 's' but keep diagnostics
- ans = Decimal((args[1]._sign, args[1]._int, 'n'))
+ ans = _dec_from_triple(args[1]._sign, args[1]._int, 'n', True)
return ans._fix_nan(context)
elif args[0] == 2:
- return Decimal( (args[1], args[2], 'n') )
+ return _dec_from_triple(args[1], args[2], 'n', True)
return NaN
@@ -350,13 +350,13 @@ class Overflow(Inexact, Rounded):
if sign == 0:
if context.rounding == ROUND_CEILING:
return Infsign[sign]
- return Decimal((sign, (9,)*context.prec,
- context.Emax-context.prec+1))
+ return _dec_from_triple(sign, '9'*context.prec,
+ context.Emax-context.prec+1)
if sign == 1:
if context.rounding == ROUND_FLOOR:
return Infsign[sign]
- return Decimal( (sign, (9,)*context.prec,
- context.Emax-context.prec+1))
+ return _dec_from_triple(sign, '9'*context.prec,
+ context.Emax-context.prec+1)
class Underflow(Inexact, Rounded, Subnormal):
@@ -531,13 +531,21 @@ class Decimal(object):
Decimal("314")
"""
+ # Note that the coefficient, self._int, is actually stored as
+ # a string rather than as a tuple of digits. This speeds up
+ # the "digits to integer" and "integer to digits" conversions
+ # that are used in almost every arithmetic operation on
+ # Decimals. This is an internal detail: the as_tuple function
+ # and the Decimal constructor still deal with tuples of
+ # digits.
+
self = object.__new__(cls)
self._is_special = False
# From an internal working value
if isinstance(value, _WorkRep):
self._sign = value.sign
- self._int = tuple(map(int, str(value.int)))
+ self._int = str(value.int)
self._exp = int(value.exp)
return self
@@ -556,7 +564,7 @@ class Decimal(object):
else:
self._sign = 1
self._exp = 0
- self._int = tuple(map(int, str(abs(value))))
+ self._int = str(abs(value))
return self
# tuple/list conversion (possibly from as_tuple())
@@ -573,7 +581,7 @@ class Decimal(object):
self._sign = value[0]
if value[2] == 'F':
# infinity: value[1] is ignored
- self._int = (0,)
+ self._int = '0'
self._exp = value[2]
self._is_special = True
else:
@@ -590,12 +598,12 @@ class Decimal(object):
"0 through 9.")
if value[2] in ('n', 'N'):
# NaN: digits form the diagnostic
- self._int = tuple(digits)
+ self._int = ''.join(map(str, digits))
self._exp = value[2]
self._is_special = True
elif isinstance(value[2], int):
# finite number: digits give the coefficient
- self._int = tuple(digits or [0])
+ self._int = ''.join(map(str, digits or [0]))
self._exp = value[2]
self._is_special = False
else:
@@ -608,38 +616,46 @@ class Decimal(object):
raise TypeError("Cannot convert float to Decimal. " +
"First convert the float to a string")
- # Other argument types may require the context during interpretation
- if context is None:
- context = getcontext()
-
# From a string
# REs insist on real strings, so we can too.
if isinstance(value, str):
- if _isinfinity(value):
- self._exp = 'F'
- self._int = (0,)
- self._is_special = True
- if _isinfinity(value) == 1:
- self._sign = 0
+ m = _parser(value)
+ if m is None:
+ if context is None:
+ context = getcontext()
+ return context._raise_error(ConversionSyntax,
+ "Invalid literal for Decimal: %r" % value)
+
+ if m.group('sign') == "-":
+ self._sign = 1
+ else:
+ self._sign = 0
+ intpart = m.group('int')
+ if intpart is not None:
+ # finite number
+ fracpart = m.group('frac')
+ exp = int(m.group('exp') or '0')
+ if fracpart is not None:
+ self._int = (intpart+fracpart).lstrip('0') or '0'
+ self._exp = exp - len(fracpart)
else:
- self._sign = 1
- return self
- if _isnan(value):
- sig, sign, diag = _isnan(value)
- self._is_special = True
- if sig == 1:
- self._exp = 'n' # qNaN
- else: # sig == 2
- self._exp = 'N' # sNaN
- self._sign = sign
- self._int = tuple(map(int, diag)) # Diagnostic info
- return self
- try:
- self._sign, self._int, self._exp = _string2exact(value)
- except ValueError:
+ self._int = intpart.lstrip('0') or '0'
+ self._exp = exp
+ self._is_special = False
+ else:
+ diag = m.group('diag')
+ if diag is not None:
+ # NaN
+ self._int = diag.lstrip('0')
+ if m.group('signal'):
+ self._exp = 'N'
+ else:
+ self._exp = 'n'
+ else:
+ # infinity
+ self._int = '0'
+ self._exp = 'F'
self._is_special = True
- return context._raise_error(ConversionSyntax,
- "Invalid literal for Decimal: %r" % value)
return self
raise TypeError("Cannot convert %r to Decimal" % value)
@@ -709,7 +725,7 @@ class Decimal(object):
NaNs and infinities are considered nonzero.
"""
- return self._is_special or self._int[0] != 0
+ return self._is_special or self._int != '0'
def __cmp__(self, other):
other = _convert_other(other)
@@ -743,8 +759,8 @@ class Decimal(object):
self_adjusted = self.adjusted()
other_adjusted = other.adjusted()
if self_adjusted == other_adjusted:
- self_padded = self._int + (0,)*(self._exp - other._exp)
- other_padded = other._int + (0,)*(other._exp - self._exp)
+ self_padded = self._int + '0'*(self._exp - other._exp)
+ other_padded = other._int + '0'*(other._exp - self._exp)
return cmp(self_padded, other_padded) * (-1)**self._sign
elif self_adjusted > other_adjusted:
return (-1)**self._sign
@@ -827,7 +843,7 @@ class Decimal(object):
To show the internals exactly as they are.
"""
- return (self._sign, self._int, self._exp)
+ return (self._sign, tuple(map(int, self._int)), self._exp)
def __repr__(self):
"""Represents the number as an instance of Decimal."""
@@ -843,10 +859,10 @@ class Decimal(object):
if self._is_special:
if self._isnan():
minus = '-'*self._sign
- if self._int == (0,):
+ if self._int == '0':
info = ''
else:
- info = ''.join(map(str, self._int))
+ info = self._int
if self._isnan() == 2:
return minus + 'sNaN' + info
return minus + 'NaN' + info
@@ -857,7 +873,7 @@ class Decimal(object):
if context is None:
context = getcontext()
- tmp = list(map(str, self._int))
+ tmp = list(self._int)
numdigits = len(self._int)
leftdigits = self._exp + numdigits
if eng and not self: # self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY
@@ -1030,7 +1046,7 @@ class Decimal(object):
sign = min(self._sign, other._sign)
if negativezero:
sign = 1
- ans = Decimal( (sign, (0,), exp))
+ ans = _dec_from_triple(sign, '0', exp)
if shouldround:
ans = ans._fix(context)
return ans
@@ -1055,7 +1071,7 @@ class Decimal(object):
if op1.sign != op2.sign:
# Equal and opposite
if op1.int == op2.int:
- ans = Decimal((negativezero, (0,), exp))
+ ans = _dec_from_triple(negativezero, '0', exp)
if shouldround:
ans = ans._fix(context)
return ans
@@ -1121,7 +1137,7 @@ class Decimal(object):
For example:
Decimal('5.624e10')._increment() == Decimal('5.625e10')
"""
- L = list(self._int)
+ L = list(map(int, self._int))
L[-1] += 1
spot = len(L)-1
while L[spot] == 10:
@@ -1131,7 +1147,7 @@ class Decimal(object):
break
L[spot-1] += 1
spot -= 1
- return Decimal((self._sign, L, self._exp))
+ return _dec_from_triple(self._sign, "".join(map(str, L)), self._exp)
def __mul__(self, other, context=None):
"""Return self * other.
@@ -1167,20 +1183,20 @@ class Decimal(object):
# Special case for multiplying by zero
if not self or not other:
- ans = Decimal((resultsign, (0,), resultexp))
+ ans = _dec_from_triple(resultsign, '0', resultexp)
if shouldround:
# Fixing in case the exponent is out of bounds
ans = ans._fix(context)
return ans
# Special case for multiplying by power of 10
- if self._int == (1,):
- ans = Decimal((resultsign, other._int, resultexp))
+ if self._int == '1':
+ ans = _dec_from_triple(resultsign, other._int, resultexp)
if shouldround:
ans = ans._fix(context)
return ans
- if other._int == (1,):
- ans = Decimal((resultsign, self._int, resultexp))
+ if other._int == '1':
+ ans = _dec_from_triple(resultsign, self._int, resultexp)
if shouldround:
ans = ans._fix(context)
return ans
@@ -1188,9 +1204,7 @@ class Decimal(object):
op1 = _WorkRep(self)
op2 = _WorkRep(other)
- ans = Decimal((resultsign,
- tuple(map(int, str(op1.int * op2.int))),
- resultexp))
+ ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
if shouldround:
ans = ans._fix(context)
@@ -1221,7 +1235,7 @@ class Decimal(object):
if other._isinfinity():
context._raise_error(Clamped, 'Division by infinity')
- return Decimal((sign, (0,), context.Etiny()))
+ return _dec_from_triple(sign, '0', context.Etiny())
# Special cases for zeroes
if not other:
@@ -1253,7 +1267,7 @@ class Decimal(object):
coeff //= 10
exp += 1
- ans = Decimal((sign, list(map(int, str(coeff))), exp))
+ ans = _dec_from_triple(sign, str(coeff), exp)
return ans._fix(context)
def _divide(self, other, context):
@@ -1270,7 +1284,7 @@ class Decimal(object):
expdiff = self.adjusted() - other.adjusted()
if not self or other._isinfinity() or expdiff <= -2:
- return (Decimal((sign, (0,), 0)),
+ return (_dec_from_triple(sign, '0', 0),
self._rescale(ideal_exp, context.rounding))
if expdiff <= context.prec:
op1 = _WorkRep(self)
@@ -1281,9 +1295,8 @@ class Decimal(object):
op2.int *= 10**(op2.exp - op1.exp)
q, r = divmod(op1.int, op2.int)
if q < 10**context.prec:
- return (Decimal((sign, list(map(int, str(q))), 0)),
- Decimal((self._sign, list(map(int, str(r))),
- ideal_exp)))
+ return (_dec_from_triple(sign, str(q), 0),
+ _dec_from_triple(self._sign, str(r), ideal_exp))
# Here the quotient is too large to be representable
ans = context._raise_error(DivisionImpossible,
@@ -1411,7 +1424,7 @@ class Decimal(object):
# self = 0 -> remainder = self, with ideal exponent
ideal_exponent = min(self._exp, other._exp)
if not self:
- ans = Decimal((self._sign, (0,), ideal_exponent))
+ ans = _dec_from_triple(self._sign, '0', ideal_exponent)
return ans._fix(context)
# catch most cases of large or small quotient
@@ -1448,7 +1461,7 @@ class Decimal(object):
sign = 1-sign
r = -r
- ans = Decimal((sign, list(map(int, str(r))), ideal_exponent))
+ ans = _dec_from_triple(sign, str(r), ideal_exponent)
return ans._fix(context)
def __floordiv__(self, other, context=None):
@@ -1500,9 +1513,9 @@ class Decimal(object):
raise OverflowError("Cannot convert infinity to int")
s = (-1)**self._sign
if self._exp >= 0:
- return s*int(''.join(map(str, self._int)))*10**self._exp
+ return s*int(self._int)*10**self._exp
else:
- return s*int(''.join(map(str, self._int))[:self._exp] or '0')
+ return s*int(self._int[:self._exp] or '0')
def _fix_nan(self, context):
"""Decapitate the payload of a NaN to fit the context"""
@@ -1512,11 +1525,8 @@ class Decimal(object):
# precision-1 if _clamp=1.
max_payload_len = context.prec - context._clamp
if len(payload) > max_payload_len:
- pos = len(payload)-max_payload_len
- while pos < len(payload) and payload[pos] == 0:
- pos += 1
- payload = payload[pos:]
- return Decimal((self._sign, payload, self._exp))
+ payload = payload[len(payload)-max_payload_len:].lstrip('0')
+ return _dec_from_triple(self._sign, payload, self._exp, True)
return Decimal(self)
def _fix(self, context):
@@ -1549,7 +1559,7 @@ class Decimal(object):
new_exp = min(max(self._exp, Etiny), exp_max)
if new_exp != self._exp:
context._raise_error(Clamped)
- return Decimal((self._sign, (0,), new_exp))
+ return _dec_from_triple(self._sign, '0', new_exp)
else:
return Decimal(self)
@@ -1581,7 +1591,8 @@ class Decimal(object):
# we get here only if rescaling rounds the
# cofficient up to exactly 10**context.prec
if ans._exp < Etop:
- ans = Decimal((ans._sign, ans._int[:-1], ans._exp+1))
+ ans = _dec_from_triple(ans._sign,
+ ans._int[:-1], ans._exp+1)
else:
# Inexact and Rounded have already been raised
ans = context._raise_error(Overflow, 'above Emax',
@@ -1591,8 +1602,8 @@ class Decimal(object):
# fold down if _clamp == 1 and self has too few digits
if context._clamp == 1 and self._exp > Etop:
context._raise_error(Clamped)
- self_padded = self._int + (0,)*(self._exp - Etop)
- return Decimal((self._sign, self_padded, Etop))
+ self_padded = self._int + '0'*(self._exp - Etop)
+ return _dec_from_triple(self._sign, self_padded, Etop)
# here self was representable to begin with; return unchanged
return Decimal(self)
@@ -1607,29 +1618,29 @@ class Decimal(object):
def _round_down(self, prec):
"""Also known as round-towards-0, truncate."""
newexp = self._exp + len(self._int) - prec
- return Decimal((self._sign, self._int[:prec] or (0,), newexp))
+ return _dec_from_triple(self._sign, self._int[:prec] or '0', newexp)
def _round_up(self, prec):
"""Rounds away from 0."""
newexp = self._exp + len(self._int) - prec
- tmp = Decimal((self._sign, self._int[:prec] or (0,), newexp))
+ tmp = _dec_from_triple(self._sign, self._int[:prec] or '0', newexp)
for digit in self._int[prec:]:
- if digit != 0:
+ if digit != '0':
return tmp._increment()
return tmp
def _round_half_up(self, prec):
"""Rounds 5 up (away from 0)"""
- if self._int[prec] >= 5:
+ if self._int[prec] in '56789':
return self._round_up(prec)
else:
return self._round_down(prec)
def _round_half_down(self, prec):
"""Round 5 down"""
- if self._int[prec] == 5:
+ if self._int[prec] == '5':
for digit in self._int[prec+1:]:
- if digit != 0:
+ if digit != '0':
break
else:
return self._round_down(prec)
@@ -1637,7 +1648,7 @@ class Decimal(object):
def _round_half_even(self, prec):
"""Round 5 to even, rest to nearest."""
- if prec and self._int[prec-1] & 1:
+ if prec and self._int[prec-1] in '13579':
return self._round_half_up(prec)
else:
return self._round_half_down(prec)
@@ -1658,7 +1669,7 @@ class Decimal(object):
def _round_05up(self, prec):
"""Round down unless digit prec-1 is 0 or 5."""
- if prec == 0 or self._int[prec-1] in (0, 5):
+ if prec == 0 or self._int[prec-1] in '05':
return self._round_up(prec)
else:
return self._round_down(prec)
@@ -1776,7 +1787,7 @@ class Decimal(object):
base = pow(base, 10, modulo)
base = pow(base, exponent.int, modulo)
- return Decimal((sign, list(map(int, str(base))), 0))
+ return _dec_from_triple(sign, str(base), 0)
def _power_exact(self, other, p):
"""Attempt to compute self**other exactly.
@@ -1866,7 +1877,7 @@ class Decimal(object):
zeros = min(exponent-ideal_exponent, p-1)
else:
zeros = 0
- return Decimal((0, (1,) + (0,)*zeros, exponent-zeros))
+ return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
# case where y is negative: xc must be either a power
# of 2 or a power of 5.
@@ -1927,7 +1938,7 @@ class Decimal(object):
if xc >= 10**p:
return None
xe = -e-xe
- return Decimal((0, list(map(int, str(xc))), xe))
+ return _dec_from_triple(0, str(xc), xe)
# now y is positive; find m and n such that y = m/n
if ye >= 0:
@@ -1989,7 +2000,7 @@ class Decimal(object):
zeros = min(xe-ideal_exponent, p-len(str_xc))
else:
zeros = 0
- return Decimal((0, list(map(int, str_xc))+[0,]*zeros, xe-zeros))
+ return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
def __pow__(self, other, modulo=None, context=None):
"""Return self ** other [ % modulo].
@@ -2050,12 +2061,12 @@ class Decimal(object):
return context._raise_error(InvalidOperation,
'x ** y with x negative and y not an integer')
# negate self, without doing any unwanted rounding
- self = Decimal((0, self._int, self._exp))
+ self = self.copy_negate()
# 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
if not self:
if other._sign == 0:
- return Decimal((result_sign, (0,), 0))
+ return _dec_from_triple(result_sign, '0', 0)
else:
return Infsign[result_sign]
@@ -2064,7 +2075,7 @@ class Decimal(object):
if other._sign == 0:
return Infsign[result_sign]
else:
- return Decimal((result_sign, (0,), 0))
+ return _dec_from_triple(result_sign, '0', 0)
# 1**other = 1, but the choice of exponent and the flags
# depend on the exponent of self, and on whether other is a
@@ -2091,7 +2102,7 @@ class Decimal(object):
context._raise_error(Rounded)
exp = 1-context.prec
- return Decimal((result_sign, (1,)+(0,)*-exp, exp))
+ return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
# compute adjusted exponent of self
self_adj = self.adjusted()
@@ -2100,7 +2111,7 @@ class Decimal(object):
# self ** -infinity is infinity if self < 1, 0 if self > 1
if other._isinfinity():
if (other._sign == 0) == (self_adj < 0):
- return Decimal((result_sign, (0,), 0))
+ return _dec_from_triple(result_sign, '0', 0)
else:
return Infsign[result_sign]
@@ -2118,19 +2129,19 @@ class Decimal(object):
# self > 1 and other +ve, or self < 1 and other -ve
# possibility of overflow
if bound >= len(str(context.Emax)):
- ans = Decimal((result_sign, (1,), context.Emax+1))
+ ans = _dec_from_triple(result_sign, '1', context.Emax+1)
else:
# self > 1 and other -ve, or self < 1 and other +ve
# possibility of underflow to 0
Etiny = context.Etiny()
if bound >= len(str(-Etiny)):
- ans = Decimal((result_sign, (1,), Etiny-1))
+ ans = _dec_from_triple(result_sign, '1', Etiny-1)
# try for an exact result with precision +1
if ans is None:
ans = self._power_exact(other, context.prec + 1)
if ans is not None and result_sign == 1:
- ans = Decimal((1, ans._int, ans._exp))
+ ans = _dec_from_triple(1, ans._int, ans._exp)
# usual case: inexact result, x**y computed directly as exp(y*log(x))
if ans is None:
@@ -2151,7 +2162,7 @@ class Decimal(object):
break
extra += 3
- ans = Decimal((result_sign, list(map(int, str(coeff))), exp))
+ ans = _dec_from_triple(result_sign, str(coeff), exp)
# the specification says that for non-integer other we need to
# raise Inexact, even when the result is actually exact. In
@@ -2163,7 +2174,8 @@ class Decimal(object):
# pad with zeros up to length context.prec+1 if necessary
if len(ans._int) <= context.prec:
expdiff = context.prec+1 - len(ans._int)
- ans = Decimal((ans._sign, ans._int+(0,)*expdiff, ans._exp-expdiff))
+ ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
+ ans._exp-expdiff)
if ans.adjusted() < context.Emin:
context._raise_error(Underflow)
@@ -2195,14 +2207,14 @@ class Decimal(object):
return dup
if not dup:
- return Decimal( (dup._sign, (0,), 0) )
+ return _dec_from_triple(dup._sign, '0', 0)
exp_max = [context.Emax, context.Etop()][context._clamp]
end = len(dup._int)
exp = dup._exp
- while dup._int[end-1] == 0 and exp < exp_max:
+ while dup._int[end-1] == '0' and exp < exp_max:
exp += 1
end -= 1
- return Decimal( (dup._sign, dup._int[:end], exp) )
+ return _dec_from_triple(dup._sign, dup._int[:end], exp)
def quantize(self, exp, rounding=None, context=None, watchexp=True):
"""Quantize self so its exponent is the same as that of exp.
@@ -2243,7 +2255,7 @@ class Decimal(object):
'target exponent out of bounds in quantize')
if not self:
- ans = Decimal((self._sign, (0,), exp._exp))
+ ans = _dec_from_triple(self._sign, '0', exp._exp)
return ans._fix(context)
self_adjusted = self.adjusted()
@@ -2303,17 +2315,18 @@ class Decimal(object):
if self._is_special:
return Decimal(self)
if not self:
- return Decimal((self._sign, (0,), exp))
+ return _dec_from_triple(self._sign, '0', exp)
if self._exp >= exp:
# pad answer with zeros if necessary
- return Decimal((self._sign, self._int + (0,)*(self._exp - exp), exp))
+ return _dec_from_triple(self._sign,
+ self._int + '0'*(self._exp - exp), exp)
# too many digits; round and lose data. If self.adjusted() <
# exp-1, replace self by 10**(exp-1) before rounding
digits = len(self._int) + self._exp - exp
if digits < 0:
- self = Decimal((self._sign, (1,), exp-1))
+ self = _dec_from_triple(self._sign, '1', exp-1)
digits = 0
this_function = getattr(self, self._pick_rounding_function[rounding])
return this_function(digits)
@@ -2336,7 +2349,7 @@ class Decimal(object):
if self._exp >= 0:
return Decimal(self)
if not self:
- return Decimal((self._sign, (0,), 0))
+ return _dec_from_triple(self._sign, '0', 0)
if context is None:
context = getcontext()
if rounding is None:
@@ -2378,7 +2391,7 @@ class Decimal(object):
if not self:
# exponent = self._exp // 2. sqrt(-0) = -0
- ans = Decimal((self._sign, (0,), self._exp // 2))
+ ans = _dec_from_triple(self._sign, '0', self._exp // 2)
return ans._fix(context)
if context is None:
@@ -2455,7 +2468,7 @@ class Decimal(object):
if n % 5 == 0:
n += 1
- ans = Decimal((0, list(map(int, str(n))), e))
+ ans = _dec_from_triple(0, str(n), e)
# round, and fit to current context
context = context._shallow_copy()
@@ -2552,13 +2565,13 @@ class Decimal(object):
if self._exp >= 0:
return True
rest = self._int[self._exp:]
- return rest == (0,)*len(rest)
+ return rest == '0'*len(rest)
def _iseven(self):
"""Returns True if self is even. Assumes self is an integer."""
if not self or self._exp > 0:
return True
- return self._int[-1+self._exp] & 1 == 0
+ return self._int[-1+self._exp] in '02468'
def adjusted(self):
"""Return the adjusted exponent of self"""
@@ -2680,18 +2693,19 @@ class Decimal(object):
def copy_abs(self):
"""Returns a copy with the sign set to 0. """
- return Decimal((0, self._int, self._exp))
+ return _dec_from_triple(0, self._int, self._exp, self._is_special)
def copy_negate(self):
"""Returns a copy with the sign inverted."""
if self._sign:
- return Decimal((0, self._int, self._exp))
+ return _dec_from_triple(0, self._int, self._exp, self._is_special)
else:
- return Decimal((1, self._int, self._exp))
+ return _dec_from_triple(1, self._int, self._exp, self._is_special)
def copy_sign(self, other):
"""Returns self with the sign of other."""
- return Decimal((other._sign, self._int, self._exp))
+ return _dec_from_triple(other._sign, self._int,
+ self._exp, self._is_special)
def exp(self, context=None):
"""Returns e ** self."""
@@ -2730,16 +2744,16 @@ class Decimal(object):
# larger exponent the result either overflows or underflows.
if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
# overflow
- ans = Decimal((0, (1,), context.Emax+1))
+ ans = _dec_from_triple(0, '1', context.Emax+1)
elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
# underflow to 0
- ans = Decimal((0, (1,), context.Etiny()-1))
+ ans = _dec_from_triple(0, '1', context.Etiny()-1)
elif self._sign == 0 and adj < -p:
# p+1 digits; final round will raise correct flags
- ans = Decimal((0, (1,) + (0,)*(p-1) + (1,), -p))
+ ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
elif self._sign == 1 and adj < -p-1:
# p+1 digits; final round will raise correct flags
- ans = Decimal((0, (9,)*(p+1), -p-1))
+ ans = _dec_from_triple(0, '9'*(p+1), -p-1)
# general case
else:
op = _WorkRep(self)
@@ -2757,7 +2771,7 @@ class Decimal(object):
break
extra += 3
- ans = Decimal((0, list(map(int, str(coeff))), exp))
+ ans = _dec_from_triple(0, str(coeff), exp)
# at this stage, ans should round correctly with *any*
# rounding mode, not just with ROUND_HALF_EVEN
@@ -2822,7 +2836,7 @@ class Decimal(object):
def is_zero(self):
"""Return True if self is a zero; otherwise return False."""
- return not self._is_special and self._int[0] == 0
+ return not self._is_special and self._int == '0'
def _ln_exp_bound(self):
"""Compute a lower bound for the adjusted exponent of self.ln().
@@ -2891,7 +2905,7 @@ class Decimal(object):
if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
break
places += 3
- ans = Decimal((int(coeff<0), list(map(int, str(abs(coeff)))), -places))
+ ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
context = context._shallow_copy()
rounding = context._set_rounding(ROUND_HALF_EVEN)
@@ -2954,7 +2968,7 @@ class Decimal(object):
'log10 of a negative value')
# log10(10**n) = n
- if self._int[0] == 1 and self._int[1:] == (0,)*(len(self._int) - 1):
+ if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
# answer may need rounding
ans = Decimal(self._exp + len(self._int) - 1)
else:
@@ -2972,8 +2986,7 @@ class Decimal(object):
if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
break
places += 3
- ans = Decimal((int(coeff<0), list(map(int, str(abs(coeff)))),
- -places))
+ ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
context = context._shallow_copy()
rounding = context._set_rounding(ROUND_HALF_EVEN)
@@ -3020,19 +3033,19 @@ class Decimal(object):
if self._sign != 0 or self._exp != 0:
return False
for dig in self._int:
- if dig not in (0, 1):
+ if dig not in '01':
return False
return True
def _fill_logical(self, context, opa, opb):
dif = context.prec - len(opa)
if dif > 0:
- opa = (0,)*dif + opa
+ opa = '0'*dif + opa
elif dif < 0:
opa = opa[-context.prec:]
dif = context.prec - len(opb)
if dif > 0:
- opb = (0,)*dif + opb
+ opb = '0'*dif + opb
elif dif < 0:
opb = opb[-context.prec:]
return opa, opb
@@ -3048,22 +3061,15 @@ class Decimal(object):
(opa, opb) = self._fill_logical(context, self._int, other._int)
# make the operation, and clean starting zeroes
- result = [a&b for a,b in zip(opa,opb)]
- for i,d in enumerate(result):
- if d == 1:
- break
- result = tuple(result[i:])
-
- # if empty, we must have at least a zero
- if not result:
- result = (0,)
- return Decimal((0, result, 0))
+ result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
+ return _dec_from_triple(0, result.lstrip('0') or '0', 0)
def logical_invert(self, context=None):
"""Invert all its digits."""
if context is None:
context = getcontext()
- return self.logical_xor(Decimal((0,(1,)*context.prec,0)), context)
+ return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
+ context)
def logical_or(self, other, context=None):
"""Applies an 'or' operation between self and other's digits."""
@@ -3076,16 +3082,8 @@ class Decimal(object):
(opa, opb) = self._fill_logical(context, self._int, other._int)
# make the operation, and clean starting zeroes
- result = [a|b for a,b in zip(opa,opb)]
- for i,d in enumerate(result):
- if d == 1:
- break
- result = tuple(result[i:])
-
- # if empty, we must have at least a zero
- if not result:
- result = (0,)
- return Decimal((0, result, 0))
+ result = "".join(str(int(a)|int(b)) for a,b in zip(opa,opb))
+ return _dec_from_triple(0, result.lstrip('0') or '0', 0)
def logical_xor(self, other, context=None):
"""Applies an 'xor' operation between self and other's digits."""
@@ -3098,16 +3096,8 @@ class Decimal(object):
(opa, opb) = self._fill_logical(context, self._int, other._int)
# make the operation, and clean starting zeroes
- result = [a^b for a,b in zip(opa,opb)]
- for i,d in enumerate(result):
- if d == 1:
- break
- result = tuple(result[i:])
-
- # if empty, we must have at least a zero
- if not result:
- result = (0,)
- return Decimal((0, result, 0))
+ result = "".join(str(int(a)^int(b)) for a,b in zip(opa,opb))
+ return _dec_from_triple(0, result.lstrip('0') or '0', 0)
def max_mag(self, other, context=None):
"""Compares the values numerically with their sign ignored."""
@@ -3185,7 +3175,7 @@ class Decimal(object):
if self._isinfinity() == -1:
return negInf
if self._isinfinity() == 1:
- return Decimal((0, (9,)*context.prec, context.Etop()))
+ return _dec_from_triple(0, '9'*context.prec, context.Etop())
context = context.copy()
context._set_rounding(ROUND_FLOOR)
@@ -3193,7 +3183,8 @@ class Decimal(object):
new_self = self._fix(context)
if new_self != self:
return new_self
- return self.__sub__(Decimal((0, (1,), context.Etiny()-1)), context)
+ return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
+ context)
def next_plus(self, context=None):
"""Returns the smallest representable number larger than itself."""
@@ -3207,7 +3198,7 @@ class Decimal(object):
if self._isinfinity() == 1:
return Inf
if self._isinfinity() == -1:
- return Decimal((1, (9,)*context.prec, context.Etop()))
+ return _dec_from_triple(1, '9'*context.prec, context.Etop())
context = context.copy()
context._set_rounding(ROUND_CEILING)
@@ -3215,7 +3206,8 @@ class Decimal(object):
new_self = self._fix(context)
if new_self != self:
return new_self
- return self.__add__(Decimal((0, (1,), context.Etiny()-1)), context)
+ return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
+ context)
def next_toward(self, other, context=None):
"""Returns the number closest to self, in the direction towards other.
@@ -3237,7 +3229,7 @@ class Decimal(object):
comparison = self.__cmp__(other)
if comparison == 0:
- return Decimal((other._sign, self._int, self._exp))
+ return self.copy_sign(other)
if comparison == -1:
ans = self.next_plus(context)
@@ -3331,19 +3323,12 @@ class Decimal(object):
rotdig = self._int
topad = context.prec - len(rotdig)
if topad:
- rotdig = ((0,)*topad) + rotdig
+ rotdig = '0'*topad + rotdig
# let's rotate!
rotated = rotdig[torot:] + rotdig[:torot]
-
- # clean starting zeroes
- for i,d in enumerate(rotated):
- if d != 0:
- break
- rotated = rotated[i:]
-
- return Decimal((self._sign, rotated, self._exp))
-
+ return _dec_from_triple(self._sign,
+ rotated.lstrip('0') or '0', self._exp)
def scaleb (self, other, context=None):
"""Returns self operand after adding the second value to its exp."""
@@ -3364,7 +3349,7 @@ class Decimal(object):
if self._isinfinity():
return Decimal(self)
- d = Decimal((self._sign, self._int, self._exp + int(other)))
+ d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
d = d._fix(context)
return d
@@ -3392,26 +3377,17 @@ class Decimal(object):
rotdig = self._int
topad = context.prec - len(rotdig)
if topad:
- rotdig = ((0,)*topad) + rotdig
+ rotdig = '0'*topad + rotdig
# let's shift!
if torot < 0:
rotated = rotdig[:torot]
else:
- rotated = (rotdig + ((0,) * torot))
+ rotated = rotdig + '0'*torot
rotated = rotated[-context.prec:]
- # clean starting zeroes
- if rotated:
- for i,d in enumerate(rotated):
- if d != 0:
- break
- rotated = rotated[i:]
- else:
- rotated = (0,)
-
- return Decimal((self._sign, rotated, self._exp))
-
+ return _dec_from_triple(self._sign,
+ rotated.lstrip('0') or '0', self._exp)
# Support for pickling, copy, and deepcopy
def __reduce__(self):
@@ -3427,6 +3403,22 @@ class Decimal(object):
return self # My components are also immutable
return self.__class__(str(self))
+def _dec_from_triple(sign, coefficient, exponent, special=False):
+ """Create a decimal instance directly, without any validation,
+ normalization (e.g. removal of leading zeros) or argument
+ conversion.
+
+ This function is for *internal use only*.
+ """
+
+ self = object.__new__(Decimal)
+ self._sign = sign
+ self._int = coefficient
+ self._exp = exponent
+ self._is_special = special
+
+ return self
+
##### Context class #######################################################
@@ -4775,10 +4767,7 @@ class _WorkRep(object):
self.exp = None
elif isinstance(value, Decimal):
self.sign = value._sign
- cum = 0
- for digit in value._int:
- cum = cum * 10 + digit
- self.int = cum
+ self.int = int(value._int)
self.exp = value._exp
else:
# assert isinstance(value, tuple)
@@ -5175,53 +5164,6 @@ def _convert_other(other, raiseit=False):
raise TypeError("Unable to convert %s to Decimal" % other)
return NotImplemented
-_infinity_map = {
- 'inf' : 1,
- 'infinity' : 1,
- '+inf' : 1,
- '+infinity' : 1,
- '-inf' : -1,
- '-infinity' : -1
-}
-
-def _isinfinity(num):
- """Determines whether a string or float is infinity.
-
- +1 for negative infinity; 0 for finite ; +1 for positive infinity
- """
- num = str(num).lower()
- return _infinity_map.get(num, 0)
-
-def _isnan(num):
- """Determines whether a string or float is NaN
-
- (1, sign, diagnostic info as string) => NaN
- (2, sign, diagnostic info as string) => sNaN
- 0 => not a NaN
- """
- num = str(num).lower()
- if not num:
- return 0
-
- # Get the sign, get rid of trailing [+-]
- sign = 0
- if num[0] == '+':
- num = num[1:]
- elif num[0] == '-': # elif avoids '+-nan'
- num = num[1:]
- sign = 1
-
- if num.startswith('nan'):
- if len(num) > 3 and not num[3:].isdigit(): # diagnostic info
- return 0
- return (1, sign, num[3:].lstrip('0'))
- if num.startswith('snan'):
- if len(num) > 4 and not num[4:].isdigit():
- return 0
- return (2, sign, num[4:].lstrip('0'))
- return 0
-
-
##### Setup Specific Contexts ############################################
# The default context prototype used by Context()
@@ -5255,91 +5197,62 @@ ExtendedContext = Context(
)
-##### Useful Constants (internal use only) ################################
-
-# Reusable defaults
-Inf = Decimal('Inf')
-negInf = Decimal('-Inf')
-NaN = Decimal('NaN')
-Dec_0 = Decimal(0)
-Dec_p1 = Decimal(1)
-Dec_n1 = Decimal(-1)
-Dec_p2 = Decimal(2)
-Dec_n2 = Decimal(-2)
-
-# Infsign[sign] is infinity w/ that sign
-Infsign = (Inf, negInf)
-
-
##### crud for parsing strings #############################################
import re
-# There's an optional sign at the start, and an optional exponent
-# at the end. The exponent has an optional sign and at least one
-# digit. In between, must have either at least one digit followed
-# by an optional fraction, or a decimal point followed by at least
-# one digit. Yuck.
+# Regular expression used for parsing numeric strings. Additional
+# comments:
+#
+# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
+# whitespace. But note that the specification disallows whitespace in
+# a numeric string.
+#
+# 2. For finite numbers (not infinities and NaNs) the body of the
+# number between the optional sign and the optional exponent must have
+# at least one decimal digit, possibly after the decimal point. The
+# lookahead expression '(?=\d|\.\d)' checks this.
+#
+# As the flag UNICODE is not enabled here, we're explicitly avoiding any
+# other meaning for \d than the numbers [0-9].
-_parser = re.compile(r"""
+import re
+_parser = re.compile(r""" # A numeric string consists of:
# \s*
- (?P<sign>[-+])?
+ (?P<sign>[-+])? # an optional sign, followed by either...
(
- (?P<int>\d+) (\. (?P<frac>\d*))?
+ (?=\d|\.\d) # ...a number (with at least one digit)
+ (?P<int>\d*) # consisting of a (possibly empty) integer part
+ (\.(?P<frac>\d*))? # followed by an optional fractional part
+ (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
|
- \. (?P<onlyfrac>\d+)
+ Inf(inity)? # ...an infinity, or...
+ |
+ (?P<signal>s)? # ...an (optionally signaling)
+ NaN # NaN
+ (?P<diag>\d*) # with (possibly empty) diagnostic information.
)
- ([eE](?P<exp>[-+]? \d+))?
# \s*
$
-""", re.VERBOSE).match # Uncomment the \s* to allow leading or trailing spaces.
+""", re.VERBOSE | re.IGNORECASE).match
del re
-def _string2exact(s):
- """Return sign, n, p s.t.
- Float string value == -1**sign * n * 10**p exactly
- """
- m = _parser(s)
- if m is None:
- raise ValueError("invalid literal for Decimal: %r" % s)
+##### Useful Constants (internal use only) ################################
- if m.group('sign') == "-":
- sign = 1
- else:
- sign = 0
+# Reusable defaults
+Inf = Decimal('Inf')
+negInf = Decimal('-Inf')
+NaN = Decimal('NaN')
+Dec_0 = Decimal(0)
+Dec_p1 = Decimal(1)
+Dec_n1 = Decimal(-1)
+Dec_p2 = Decimal(2)
+Dec_n2 = Decimal(-2)
- exp = m.group('exp')
- if exp is None:
- exp = 0
- else:
- exp = int(exp)
+# Infsign[sign] is infinity w/ that sign
+Infsign = (Inf, negInf)
- intpart = m.group('int')
- if intpart is None:
- intpart = ""
- fracpart = m.group('onlyfrac')
- else:
- fracpart = m.group('frac')
- if fracpart is None:
- fracpart = ""
-
- exp -= len(fracpart)
-
- mantissa = intpart + fracpart
- tmp = list(map(int, mantissa))
- backup = tmp
- while tmp and tmp[0] == 0:
- del tmp[0]
-
- # It's a zero
- if not tmp:
- if backup:
- return (sign, tuple(backup), exp)
- return (sign, (0,), exp)
- mantissa = tuple(tmp)
-
- return (sign, mantissa, exp)
if __name__ == '__main__':
diff --git a/Lib/doctest.py b/Lib/doctest.py
index eee2f51..5b18073 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -315,8 +315,21 @@ class _OutputRedirectingPdb(pdb.Pdb):
"""
def __init__(self, out):
self.__out = out
+ self.__debugger_used = False
pdb.Pdb.__init__(self, stdout=out)
+ def set_trace(self, frame=None):
+ self.__debugger_used = True
+ if frame is None:
+ frame = sys._getframe().f_back
+ pdb.Pdb.set_trace(self, frame)
+
+ def set_continue(self):
+ # Calling set_continue unconditionally would break unit test
+ # coverage reporting, as Bdb.set_continue calls sys.settrace(None).
+ if self.__debugger_used:
+ pdb.Pdb.set_continue(self)
+
def trace_dispatch(self, *args):
# Redirect stdout to the given stream.
save_stdout = sys.stdout
diff --git a/Lib/test/decimaltestdata/abs.decTest b/Lib/test/decimaltestdata/abs.decTest
index ed4c46e..39f2dca 100644
--- a/Lib/test/decimaltestdata/abs.decTest
+++ b/Lib/test/decimaltestdata/abs.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests primarily tests the existence of the operator.
-- Additon, subtraction, rounding, and more overflows are tested
diff --git a/Lib/test/decimaltestdata/add.decTest b/Lib/test/decimaltestdata/add.decTest
index 3460aa4..8db222a 100644
--- a/Lib/test/decimaltestdata/add.decTest
+++ b/Lib/test/decimaltestdata/add.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 9
rounding: half_up
@@ -1122,6 +1122,15 @@ addx1116 add -1e-3 +1e-383 -> -0.0009999999999999999 Rounded Inexact
addx1117 add -1e-4 +1e-383 -> -0.00009999999999999999 Rounded Inexact
addx1118 add -1e-5 +1e-383 -> -0.000009999999999999999 Rounded Inexact
addx1119 add -1e-6 +1e-383 -> -9.999999999999999E-7 Rounded Inexact
+addx1120 add +1e-383 -1e+2 -> -99.99999999999999 Rounded Inexact
+addx1121 add +1e-383 -1e+1 -> -9.999999999999999 Rounded Inexact
+addx1123 add +1e-383 -1 -> -0.9999999999999999 Rounded Inexact
+addx1124 add +1e-383 -1e-1 -> -0.09999999999999999 Rounded Inexact
+addx1125 add +1e-383 -1e-2 -> -0.009999999999999999 Rounded Inexact
+addx1126 add +1e-383 -1e-3 -> -0.0009999999999999999 Rounded Inexact
+addx1127 add +1e-383 -1e-4 -> -0.00009999999999999999 Rounded Inexact
+addx1128 add +1e-383 -1e-5 -> -0.000009999999999999999 Rounded Inexact
+addx1129 add +1e-383 -1e-6 -> -9.999999999999999E-7 Rounded Inexact
rounding: down
precision: 7
@@ -1658,17 +1667,19 @@ addx6056 add '1.3' '-2.07' -> '-0.77'
addx6057 add '1E+2' '1E+4' -> '1.01E+4'
-- from above
-addx6061 add 1 '0.1' -> '1.1'
-addx6062 add 1 '0.01' -> '1.01'
-addx6063 add 1 '0.001' -> '1.001'
-addx6064 add 1 '0.0001' -> '1.0001'
-addx6065 add 1 '0.00001' -> '1.00001'
-addx6066 add 1 '0.000001' -> '1.000001'
-addx6067 add 1 '0.0000001' -> '1.0000001'
-addx6068 add 1 '0.00000001' -> '1.00000001'
+addx6060 add 1 '0.1' -> '1.1'
+addx6061 add 1 '0.01' -> '1.01'
+addx6062 add 1 '0.001' -> '1.001'
+addx6063 add 1 '0.0001' -> '1.0001'
+addx6064 add 1 '0.00001' -> '1.00001'
+addx6065 add 1 '0.000001' -> '1.000001'
+addx6066 add 1 '0.0000001' -> '1.0000001'
+addx6067 add 1 '0.00000001' -> '1.00000001'
-- cancellation to integer
-addx6069 add 99999999999999123456789 -99999999999999E+9 -> 123456789
+addx6068 add 99999999999999123456789 -99999999999999E+9 -> 123456789
+-- similar from FMA fun
+addx6069 add "-1234567890123455.234567890123454" "1234567890123456" -> 0.765432109876546
-- some funny zeros [in case of bad signum]
addx6070 add 1 0 -> 1
diff --git a/Lib/test/decimaltestdata/and.decTest b/Lib/test/decimaltestdata/and.decTest
index 18ba881..90490a5 100644
--- a/Lib/test/decimaltestdata/and.decTest
+++ b/Lib/test/decimaltestdata/and.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/base.decTest b/Lib/test/decimaltestdata/base.decTest
index de0b813..58ce91c 100644
--- a/Lib/test/decimaltestdata/base.decTest
+++ b/Lib/test/decimaltestdata/base.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
-- This file tests base conversions from string to a decimal number
diff --git a/Lib/test/decimaltestdata/clamp.decTest b/Lib/test/decimaltestdata/clamp.decTest
index eca0cfb..48e27c0 100644
--- a/Lib/test/decimaltestdata/clamp.decTest
+++ b/Lib/test/decimaltestdata/clamp.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests uses the same limits as the 8-byte concrete
-- representation, but applies clamping without using format-specific
diff --git a/Lib/test/decimaltestdata/class.decTest b/Lib/test/decimaltestdata/class.decTest
index 77a22e3..61ad548 100644
--- a/Lib/test/decimaltestdata/class.decTest
+++ b/Lib/test/decimaltestdata/class.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- [New 2006.11.27]
diff --git a/Lib/test/decimaltestdata/compare.decTest b/Lib/test/decimaltestdata/compare.decTest
index 2d5e664..979cc52 100644
--- a/Lib/test/decimaltestdata/compare.decTest
+++ b/Lib/test/decimaltestdata/compare.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that we cannot assume add/subtract tests cover paths adequately,
-- here, because the code might be quite different (comparison cannot
diff --git a/Lib/test/decimaltestdata/comparetotal.decTest b/Lib/test/decimaltestdata/comparetotal.decTest
index 737293f..ef2914f 100644
--- a/Lib/test/decimaltestdata/comparetotal.decTest
+++ b/Lib/test/decimaltestdata/comparetotal.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that we cannot assume add/subtract tests cover paths adequately,
-- here, because the code might be quite different (comparison cannot
diff --git a/Lib/test/decimaltestdata/comparetotmag.decTest b/Lib/test/decimaltestdata/comparetotmag.decTest
index a12e614..4a51d7f 100644
--- a/Lib/test/decimaltestdata/comparetotmag.decTest
+++ b/Lib/test/decimaltestdata/comparetotmag.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that it cannot be assumed that add/subtract tests cover paths
-- for this operation adequately, here, because the code might be
diff --git a/Lib/test/decimaltestdata/copy.decTest b/Lib/test/decimaltestdata/copy.decTest
index 5d4065d..e6edac5 100644
--- a/Lib/test/decimaltestdata/copy.decTest
+++ b/Lib/test/decimaltestdata/copy.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/copyabs.decTest b/Lib/test/decimaltestdata/copyabs.decTest
index 7457552..4479888 100644
--- a/Lib/test/decimaltestdata/copyabs.decTest
+++ b/Lib/test/decimaltestdata/copyabs.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/copynegate.decTest b/Lib/test/decimaltestdata/copynegate.decTest
index 3e502be..7cf124c 100644
--- a/Lib/test/decimaltestdata/copynegate.decTest
+++ b/Lib/test/decimaltestdata/copynegate.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/copysign.decTest b/Lib/test/decimaltestdata/copysign.decTest
index 6b20fda..ed60893 100644
--- a/Lib/test/decimaltestdata/copysign.decTest
+++ b/Lib/test/decimaltestdata/copysign.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/ddAbs.decTest b/Lib/test/decimaltestdata/ddAbs.decTest
index 4da662c..58b7902 100644
--- a/Lib/test/decimaltestdata/ddAbs.decTest
+++ b/Lib/test/decimaltestdata/ddAbs.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddAdd.decTest b/Lib/test/decimaltestdata/ddAdd.decTest
index 49d89d4..38d511b 100644
--- a/Lib/test/decimaltestdata/ddAdd.decTest
+++ b/Lib/test/decimaltestdata/ddAdd.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests are for decDoubles only; all arguments are
-- representable in a decDouble
@@ -1029,6 +1029,16 @@ ddadd71706 add 130E-2 -12E-1 -> 0.10
ddadd71707 add 130E-2 -1E0 -> 0.30
ddadd71708 add 1E2 -1E4 -> -9.9E+3
+-- query from Vincent Kulandaisamy
+rounding: ceiling
+ddadd71801 add 7.8822773805862E+277 -5.1757503820663E-21 -> 7.882277380586200E+277 Inexact Rounded
+ddadd71802 add 7.882277380586200E+277 12.341 -> 7.882277380586201E+277 Inexact Rounded
+ddadd71803 add 7.882277380586201E+277 2.7270545046613E-31 -> 7.882277380586202E+277 Inexact Rounded
+
+ddadd71811 add 12.341 -5.1757503820663E-21 -> 12.34100000000000 Inexact Rounded
+ddadd71812 add 12.34100000000000 2.7270545046613E-31 -> 12.34100000000001 Inexact Rounded
+ddadd71813 add 12.34100000000001 7.8822773805862E+277 -> 7.882277380586201E+277 Inexact Rounded
+
-- Gappy coefficients; check residue handling even with full coefficient gap
rounding: half_even
diff --git a/Lib/test/decimaltestdata/ddAnd.decTest b/Lib/test/decimaltestdata/ddAnd.decTest
index e5fa38d..850da17 100644
--- a/Lib/test/decimaltestdata/ddAnd.decTest
+++ b/Lib/test/decimaltestdata/ddAnd.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddBase.decTest b/Lib/test/decimaltestdata/ddBase.decTest
index 431bce1..ddc8185 100644
--- a/Lib/test/decimaltestdata/ddBase.decTest
+++ b/Lib/test/decimaltestdata/ddBase.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This file tests base conversions from string to a decimal number
-- and back to a string (in Scientific form)
diff --git a/Lib/test/decimaltestdata/ddCanonical.decTest b/Lib/test/decimaltestdata/ddCanonical.decTest
index 308b9ff..4d659b0 100644
--- a/Lib/test/decimaltestdata/ddCanonical.decTest
+++ b/Lib/test/decimaltestdata/ddCanonical.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This file tests that copy operations leave uncanonical operands
-- unchanged, and vice versa
diff --git a/Lib/test/decimaltestdata/ddClass.decTest b/Lib/test/decimaltestdata/ddClass.decTest
index 0b1d1f3..8a38f4a 100644
--- a/Lib/test/decimaltestdata/ddClass.decTest
+++ b/Lib/test/decimaltestdata/ddClass.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- [New 2006.11.27]
precision: 16
diff --git a/Lib/test/decimaltestdata/ddCompare.decTest b/Lib/test/decimaltestdata/ddCompare.decTest
index b225d0d..5f6fba5 100644
--- a/Lib/test/decimaltestdata/ddCompare.decTest
+++ b/Lib/test/decimaltestdata/ddCompare.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that we cannot assume add/subtract tests cover paths adequately,
-- here, because the code might be quite different (comparison cannot
diff --git a/Lib/test/decimaltestdata/ddCompareSig.decTest b/Lib/test/decimaltestdata/ddCompareSig.decTest
index 388a656..b4895da 100644
--- a/Lib/test/decimaltestdata/ddCompareSig.decTest
+++ b/Lib/test/decimaltestdata/ddCompareSig.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that we cannot assume add/subtract tests cover paths adequately,
-- here, because the code might be quite different (comparison cannot
diff --git a/Lib/test/decimaltestdata/ddCompareTotal.decTest b/Lib/test/decimaltestdata/ddCompareTotal.decTest
index a8bf477..b86b8df 100644
--- a/Lib/test/decimaltestdata/ddCompareTotal.decTest
+++ b/Lib/test/decimaltestdata/ddCompareTotal.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that we cannot assume add/subtract tests cover paths adequately,
-- here, because the code might be quite different (comparison cannot
diff --git a/Lib/test/decimaltestdata/ddCompareTotalMag.decTest b/Lib/test/decimaltestdata/ddCompareTotalMag.decTest
index b19cf64..e93a749 100644
--- a/Lib/test/decimaltestdata/ddCompareTotalMag.decTest
+++ b/Lib/test/decimaltestdata/ddCompareTotalMag.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that we cannot assume add/subtract tests cover paths adequately,
-- here, because the code might be quite different (comparison cannot
diff --git a/Lib/test/decimaltestdata/ddCopy.decTest b/Lib/test/decimaltestdata/ddCopy.decTest
index 49c6824..9d82db7 100644
--- a/Lib/test/decimaltestdata/ddCopy.decTest
+++ b/Lib/test/decimaltestdata/ddCopy.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decDoubles.
precision: 16
diff --git a/Lib/test/decimaltestdata/ddCopyAbs.decTest b/Lib/test/decimaltestdata/ddCopyAbs.decTest
index b65f063..c60cc38 100644
--- a/Lib/test/decimaltestdata/ddCopyAbs.decTest
+++ b/Lib/test/decimaltestdata/ddCopyAbs.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decDoubles.
precision: 16
diff --git a/Lib/test/decimaltestdata/ddCopyNegate.decTest b/Lib/test/decimaltestdata/ddCopyNegate.decTest
index b111c9b..c2c6098 100644
--- a/Lib/test/decimaltestdata/ddCopyNegate.decTest
+++ b/Lib/test/decimaltestdata/ddCopyNegate.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decDoubles.
precision: 16
diff --git a/Lib/test/decimaltestdata/ddCopySign.decTest b/Lib/test/decimaltestdata/ddCopySign.decTest
index 7c83416..36b060e 100644
--- a/Lib/test/decimaltestdata/ddCopySign.decTest
+++ b/Lib/test/decimaltestdata/ddCopySign.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decDoubles.
precision: 16
diff --git a/Lib/test/decimaltestdata/ddDivide.decTest b/Lib/test/decimaltestdata/ddDivide.decTest
index 1a953f7..9069894 100644
--- a/Lib/test/decimaltestdata/ddDivide.decTest
+++ b/Lib/test/decimaltestdata/ddDivide.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddDivideInt.decTest b/Lib/test/decimaltestdata/ddDivideInt.decTest
index 782fe8d..7116841 100644
--- a/Lib/test/decimaltestdata/ddDivideInt.decTest
+++ b/Lib/test/decimaltestdata/ddDivideInt.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddEncode.decTest b/Lib/test/decimaltestdata/ddEncode.decTest
index 16264fc..3fa434c 100644
--- a/Lib/test/decimaltestdata/ddEncode.decTest
+++ b/Lib/test/decimaltestdata/ddEncode.decTest
@@ -18,7 +18,7 @@
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-- [Previously called decimal64.decTest]
-version: 2.56
+version: 2.57
-- This set of tests is for the eight-byte concrete representation.
-- Its characteristics are:
@@ -485,3 +485,6 @@ decd828 apply #2238000115afb55a -> 4294967294
decd829 apply #2238000115afb55b -> 4294967295
decd830 apply #2238000115afb57a -> 4294967296
decd831 apply #2238000115afb57b -> 4294967297
+
+-- for narrowing
+decd840 apply #2870000000000000 -> 2.000000000000000E-99
diff --git a/Lib/test/decimaltestdata/ddFMA.decTest b/Lib/test/decimaltestdata/ddFMA.decTest
index 946d680..bc44b6a 100644
--- a/Lib/test/decimaltestdata/ddFMA.decTest
+++ b/Lib/test/decimaltestdata/ddFMA.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
@@ -1663,6 +1663,34 @@ ddfma375087 fma 1 12345678 1E-33 -> 12345678.00000001 Inexac
ddfma375088 fma 1 12345678 1E-34 -> 12345678.00000001 Inexact Rounded
ddfma375089 fma 1 12345678 1E-35 -> 12345678.00000001 Inexact Rounded
+-- desctructive subtraction (from remainder tests)
+
+-- +++ some of these will be off-by-one remainder vs remainderNear
+
+ddfma4000 fma -1234567890123454 1.000000000000001 1234567890123456 -> 0.765432109876546
+ddfma4001 fma -1234567890123443 1.00000000000001 1234567890123456 -> 0.65432109876557
+ddfma4002 fma -1234567890123332 1.0000000000001 1234567890123456 -> 0.5432109876668
+ddfma4003 fma -308641972530863 4.000000000000001 1234567890123455 -> 2.691358027469137
+ddfma4004 fma -308641972530863 4.000000000000001 1234567890123456 -> 3.691358027469137
+ddfma4005 fma -246913578024696 4.9999999999999 1234567890123456 -> 0.6913578024696
+ddfma4006 fma -246913578024691 4.99999999999999 1234567890123456 -> 3.46913578024691
+ddfma4007 fma -246913578024691 4.999999999999999 1234567890123456 -> 1.246913578024691
+ddfma4008 fma -246913578024691 5.000000000000001 1234567890123456 -> 0.753086421975309
+ddfma4009 fma -246913578024690 5.00000000000001 1234567890123456 -> 3.53086421975310
+ddfma4010 fma -246913578024686 5.0000000000001 1234567890123456 -> 1.3086421975314
+ddfma4011 fma -1234567890123455 1.000000000000001 1234567890123456 -> -0.234567890123455
+ddfma4012 fma -1234567890123444 1.00000000000001 1234567890123456 -> -0.34567890123444
+ddfma4013 fma -1234567890123333 1.0000000000001 1234567890123456 -> -0.4567890123333
+ddfma4014 fma -308641972530864 4.000000000000001 1234567890123455 -> -1.308641972530864
+ddfma4015 fma -308641972530864 4.000000000000001 1234567890123456 -> -0.308641972530864
+ddfma4016 fma -246913578024696 4.9999999999999 1234567890123456 -> 0.6913578024696
+ddfma4017 fma -246913578024692 4.99999999999999 1234567890123456 -> -1.53086421975308
+ddfma4018 fma -246913578024691 4.999999999999999 1234567890123456 -> 1.246913578024691
+ddfma4019 fma -246913578024691 5.000000000000001 1234567890123456 -> 0.753086421975309
+ddfma4020 fma -246913578024691 5.00000000000001 1234567890123456 -> -1.46913578024691
+ddfma4021 fma -246913578024686 5.0000000000001 1234567890123456 -> 1.3086421975314
+
+
-- Null tests
ddfma39990 fma 1 10 # -> NaN Invalid_operation
ddfma39991 fma 1 # 10 -> NaN Invalid_operation
diff --git a/Lib/test/decimaltestdata/ddInvert.decTest b/Lib/test/decimaltestdata/ddInvert.decTest
index 2697f59..b4ae744 100644
--- a/Lib/test/decimaltestdata/ddInvert.decTest
+++ b/Lib/test/decimaltestdata/ddInvert.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddLogB.decTest b/Lib/test/decimaltestdata/ddLogB.decTest
index f18fd5e..99a3843 100644
--- a/Lib/test/decimaltestdata/ddLogB.decTest
+++ b/Lib/test/decimaltestdata/ddLogB.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddMax.decTest b/Lib/test/decimaltestdata/ddMax.decTest
index 5fe600f..515f79a 100644
--- a/Lib/test/decimaltestdata/ddMax.decTest
+++ b/Lib/test/decimaltestdata/ddMax.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/ddMaxMag.decTest b/Lib/test/decimaltestdata/ddMaxMag.decTest
index dbabc99..c43c460 100644
--- a/Lib/test/decimaltestdata/ddMaxMag.decTest
+++ b/Lib/test/decimaltestdata/ddMaxMag.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/ddMin.decTest b/Lib/test/decimaltestdata/ddMin.decTest
index 4ba27f7..c77a71e 100644
--- a/Lib/test/decimaltestdata/ddMin.decTest
+++ b/Lib/test/decimaltestdata/ddMin.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/ddMinMag.decTest b/Lib/test/decimaltestdata/ddMinMag.decTest
index cc5ccec0..9291abc 100644
--- a/Lib/test/decimaltestdata/ddMinMag.decTest
+++ b/Lib/test/decimaltestdata/ddMinMag.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/ddMinus.decTest b/Lib/test/decimaltestdata/ddMinus.decTest
index 9fe196b..07dfa7a 100644
--- a/Lib/test/decimaltestdata/ddMinus.decTest
+++ b/Lib/test/decimaltestdata/ddMinus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decDoubles.
precision: 16
diff --git a/Lib/test/decimaltestdata/ddMultiply.decTest b/Lib/test/decimaltestdata/ddMultiply.decTest
index 01e0ffe..f506ea2 100644
--- a/Lib/test/decimaltestdata/ddMultiply.decTest
+++ b/Lib/test/decimaltestdata/ddMultiply.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests are for decDoubles only; all arguments are
-- representable in a decDouble
@@ -454,9 +454,92 @@ ddmul908 multiply 9.999999999999999E-383 0.09999999999999999 -> 1.00000000
-- hugest
ddmul909 multiply 9999999999999999 9999999999999999 -> 9.999999999999998E+31 Inexact Rounded
+-- power-of-ten edge cases
+ddmul1001 multiply 1 10 -> 10
+ddmul1002 multiply 1 100 -> 100
+ddmul1003 multiply 1 1000 -> 1000
+ddmul1004 multiply 1 10000 -> 10000
+ddmul1005 multiply 1 100000 -> 100000
+ddmul1006 multiply 1 1000000 -> 1000000
+ddmul1007 multiply 1 10000000 -> 10000000
+ddmul1008 multiply 1 100000000 -> 100000000
+ddmul1009 multiply 1 1000000000 -> 1000000000
+ddmul1010 multiply 1 10000000000 -> 10000000000
+ddmul1011 multiply 1 100000000000 -> 100000000000
+ddmul1012 multiply 1 1000000000000 -> 1000000000000
+ddmul1013 multiply 1 10000000000000 -> 10000000000000
+ddmul1014 multiply 1 100000000000000 -> 100000000000000
+ddmul1015 multiply 1 1000000000000000 -> 1000000000000000
+ddmul1021 multiply 10 1 -> 10
+ddmul1022 multiply 10 10 -> 100
+ddmul1023 multiply 10 100 -> 1000
+ddmul1024 multiply 10 1000 -> 10000
+ddmul1025 multiply 10 10000 -> 100000
+ddmul1026 multiply 10 100000 -> 1000000
+ddmul1027 multiply 10 1000000 -> 10000000
+ddmul1028 multiply 10 10000000 -> 100000000
+ddmul1029 multiply 10 100000000 -> 1000000000
+ddmul1030 multiply 10 1000000000 -> 10000000000
+ddmul1031 multiply 10 10000000000 -> 100000000000
+ddmul1032 multiply 10 100000000000 -> 1000000000000
+ddmul1033 multiply 10 1000000000000 -> 10000000000000
+ddmul1034 multiply 10 10000000000000 -> 100000000000000
+ddmul1035 multiply 10 100000000000000 -> 1000000000000000
+ddmul1041 multiply 100 0.1 -> 10.0
+ddmul1042 multiply 100 1 -> 100
+ddmul1043 multiply 100 10 -> 1000
+ddmul1044 multiply 100 100 -> 10000
+ddmul1045 multiply 100 1000 -> 100000
+ddmul1046 multiply 100 10000 -> 1000000
+ddmul1047 multiply 100 100000 -> 10000000
+ddmul1048 multiply 100 1000000 -> 100000000
+ddmul1049 multiply 100 10000000 -> 1000000000
+ddmul1050 multiply 100 100000000 -> 10000000000
+ddmul1051 multiply 100 1000000000 -> 100000000000
+ddmul1052 multiply 100 10000000000 -> 1000000000000
+ddmul1053 multiply 100 100000000000 -> 10000000000000
+ddmul1054 multiply 100 1000000000000 -> 100000000000000
+ddmul1055 multiply 100 10000000000000 -> 1000000000000000
+ddmul1061 multiply 1000 0.01 -> 10.00
+ddmul1062 multiply 1000 0.1 -> 100.0
+ddmul1063 multiply 1000 1 -> 1000
+ddmul1064 multiply 1000 10 -> 10000
+ddmul1065 multiply 1000 100 -> 100000
+ddmul1066 multiply 1000 1000 -> 1000000
+ddmul1067 multiply 1000 10000 -> 10000000
+ddmul1068 multiply 1000 100000 -> 100000000
+ddmul1069 multiply 1000 1000000 -> 1000000000
+ddmul1070 multiply 1000 10000000 -> 10000000000
+ddmul1071 multiply 1000 100000000 -> 100000000000
+ddmul1072 multiply 1000 1000000000 -> 1000000000000
+ddmul1073 multiply 1000 10000000000 -> 10000000000000
+ddmul1074 multiply 1000 100000000000 -> 100000000000000
+ddmul1075 multiply 1000 1000000000000 -> 1000000000000000
+ddmul1081 multiply 10000 0.001 -> 10.000
+ddmul1082 multiply 10000 0.01 -> 100.00
+ddmul1083 multiply 10000 0.1 -> 1000.0
+ddmul1084 multiply 10000 1 -> 10000
+ddmul1085 multiply 10000 10 -> 100000
+ddmul1086 multiply 10000 100 -> 1000000
+ddmul1087 multiply 10000 1000 -> 10000000
+ddmul1088 multiply 10000 10000 -> 100000000
+ddmul1089 multiply 10000 100000 -> 1000000000
+ddmul1090 multiply 10000 1000000 -> 10000000000
+ddmul1091 multiply 10000 10000000 -> 100000000000
+ddmul1092 multiply 10000 100000000 -> 1000000000000
+ddmul1093 multiply 10000 1000000000 -> 10000000000000
+ddmul1094 multiply 10000 10000000000 -> 100000000000000
+ddmul1095 multiply 10000 100000000000 -> 1000000000000000
+
+ddmul1097 multiply 10000 99999999999 -> 999999999990000
+ddmul1098 multiply 10000 99999999999 -> 999999999990000
+
+
+
+
-- Null tests
-ddmul990 multiply 10 # -> NaN Invalid_operation
-ddmul991 multiply # 10 -> NaN Invalid_operation
+ddmul9990 multiply 10 # -> NaN Invalid_operation
+ddmul9991 multiply # 10 -> NaN Invalid_operation
diff --git a/Lib/test/decimaltestdata/ddNextMinus.decTest b/Lib/test/decimaltestdata/ddNextMinus.decTest
index 97c3b09..b9b0de5 100644
--- a/Lib/test/decimaltestdata/ddNextMinus.decTest
+++ b/Lib/test/decimaltestdata/ddNextMinus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decDoubles.
precision: 16
diff --git a/Lib/test/decimaltestdata/ddNextPlus.decTest b/Lib/test/decimaltestdata/ddNextPlus.decTest
index d01f3c3..2bb2641 100644
--- a/Lib/test/decimaltestdata/ddNextPlus.decTest
+++ b/Lib/test/decimaltestdata/ddNextPlus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decDoubles.
precision: 16
diff --git a/Lib/test/decimaltestdata/ddNextToward.decTest b/Lib/test/decimaltestdata/ddNextToward.decTest
index e00751b..80e4ac6 100644
--- a/Lib/test/decimaltestdata/ddNextToward.decTest
+++ b/Lib/test/decimaltestdata/ddNextToward.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decDoubles.
precision: 16
diff --git a/Lib/test/decimaltestdata/ddOr.decTest b/Lib/test/decimaltestdata/ddOr.decTest
index 3a8cdd6..903ced0 100644
--- a/Lib/test/decimaltestdata/ddOr.decTest
+++ b/Lib/test/decimaltestdata/ddOr.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddPlus.decTest b/Lib/test/decimaltestdata/ddPlus.decTest
index 962a656..0a2b838 100644
--- a/Lib/test/decimaltestdata/ddPlus.decTest
+++ b/Lib/test/decimaltestdata/ddPlus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decDoubles.
precision: 16
diff --git a/Lib/test/decimaltestdata/ddQuantize.decTest b/Lib/test/decimaltestdata/ddQuantize.decTest
index 234db92..8cd5287 100644
--- a/Lib/test/decimaltestdata/ddQuantize.decTest
+++ b/Lib/test/decimaltestdata/ddQuantize.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Most of the tests here assume a "regular pattern", where the
-- sign and coefficient are +1.
diff --git a/Lib/test/decimaltestdata/ddReduce.decTest b/Lib/test/decimaltestdata/ddReduce.decTest
index 71c82e1..545beeb 100644
--- a/Lib/test/decimaltestdata/ddReduce.decTest
+++ b/Lib/test/decimaltestdata/ddReduce.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddRemainder.decTest b/Lib/test/decimaltestdata/ddRemainder.decTest
index c7ea762..d805a48 100644
--- a/Lib/test/decimaltestdata/ddRemainder.decTest
+++ b/Lib/test/decimaltestdata/ddRemainder.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
@@ -581,6 +581,19 @@ ddrem1056 remainder 1e-277 -1e+311 -> 1E-277
ddrem1057 remainder -1e-277 1e+311 -> -1E-277
ddrem1058 remainder -1e-277 -1e+311 -> -1E-277
+-- destructive subtract
+ddrem1101 remainder 1234567890123456 1.000000000000001 -> 0.765432109876546
+ddrem1102 remainder 1234567890123456 1.00000000000001 -> 0.65432109876557
+ddrem1103 remainder 1234567890123456 1.0000000000001 -> 0.5432109876668
+ddrem1104 remainder 1234567890123455 4.000000000000001 -> 2.691358027469137
+ddrem1105 remainder 1234567890123456 4.000000000000001 -> 3.691358027469137
+ddrem1106 remainder 1234567890123456 4.9999999999999 -> 0.6913578024696
+ddrem1107 remainder 1234567890123456 4.99999999999999 -> 3.46913578024691
+ddrem1108 remainder 1234567890123456 4.999999999999999 -> 1.246913578024691
+ddrem1109 remainder 1234567890123456 5.000000000000001 -> 0.753086421975309
+ddrem1110 remainder 1234567890123456 5.00000000000001 -> 3.53086421975310
+ddrem1111 remainder 1234567890123456 5.0000000000001 -> 1.3086421975314
+
-- Null tests
ddrem1000 remainder 10 # -> NaN Invalid_operation
ddrem1001 remainder # 10 -> NaN Invalid_operation
diff --git a/Lib/test/decimaltestdata/ddRemainderNear.decTest b/Lib/test/decimaltestdata/ddRemainderNear.decTest
index 1f3bafd..dfcd3eb 100644
--- a/Lib/test/decimaltestdata/ddRemainderNear.decTest
+++ b/Lib/test/decimaltestdata/ddRemainderNear.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
@@ -599,6 +599,7 @@ ddrmn969 remaindernear 123e1 9876543210987654 -> 1230
ddrmn980 remaindernear 123e1 1000E299 -> 1.23E+3 -- 123E+1 internally
+
-- overflow and underflow tests [from divide]
ddrmn1051 remaindernear 1e+277 1e-311 -> NaN Division_impossible
ddrmn1052 remaindernear 1e+277 -1e-311 -> NaN Division_impossible
@@ -609,6 +610,19 @@ ddrmn1056 remaindernear 1e-277 -1e+311 -> 1E-277
ddrmn1057 remaindernear -1e-277 1e+311 -> -1E-277
ddrmn1058 remaindernear -1e-277 -1e+311 -> -1E-277
+-- destructive subtract
+ddrmn1100 remainderNear 1234567890123456 1.000000000000001 -> -0.234567890123455
+ddrmn1101 remainderNear 1234567890123456 1.00000000000001 -> -0.34567890123444
+ddrmn1102 remainderNear 1234567890123456 1.0000000000001 -> -0.4567890123333
+ddrmn1103 remainderNear 1234567890123455 4.000000000000001 -> -1.308641972530864
+ddrmn1104 remainderNear 1234567890123456 4.000000000000001 -> -0.308641972530864
+ddrmn1115 remainderNear 1234567890123456 4.9999999999999 -> 0.6913578024696
+ddrmn1116 remainderNear 1234567890123456 4.99999999999999 -> -1.53086421975308
+ddrmn1117 remainderNear 1234567890123456 4.999999999999999 -> 1.246913578024691
+ddrmn1118 remainderNear 1234567890123456 5.000000000000001 -> 0.753086421975309
+ddrmn1119 remainderNear 1234567890123456 5.00000000000001 -> -1.46913578024691
+ddrmn1110 remainderNear 1234567890123456 5.0000000000001 -> 1.3086421975314
+
-- Null tests
ddrmn1000 remaindernear 10 # -> NaN Invalid_operation
ddrmn1001 remaindernear # 10 -> NaN Invalid_operation
diff --git a/Lib/test/decimaltestdata/ddRotate.decTest b/Lib/test/decimaltestdata/ddRotate.decTest
index 473f2f6..e6294b3 100644
--- a/Lib/test/decimaltestdata/ddRotate.decTest
+++ b/Lib/test/decimaltestdata/ddRotate.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddSameQuantum.decTest b/Lib/test/decimaltestdata/ddSameQuantum.decTest
index a396cd1..6f7db15 100644
--- a/Lib/test/decimaltestdata/ddSameQuantum.decTest
+++ b/Lib/test/decimaltestdata/ddSameQuantum.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decDoubles.
precision: 16
diff --git a/Lib/test/decimaltestdata/ddScaleB.decTest b/Lib/test/decimaltestdata/ddScaleB.decTest
index 4091f86..d0b92b5 100644
--- a/Lib/test/decimaltestdata/ddScaleB.decTest
+++ b/Lib/test/decimaltestdata/ddScaleB.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddShift.decTest b/Lib/test/decimaltestdata/ddShift.decTest
index 2cbe06a..f2e80b3 100644
--- a/Lib/test/decimaltestdata/ddShift.decTest
+++ b/Lib/test/decimaltestdata/ddShift.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/ddSubtract.decTest b/Lib/test/decimaltestdata/ddSubtract.decTest
index 89895e9..b10f5e4 100644
--- a/Lib/test/decimaltestdata/ddSubtract.decTest
+++ b/Lib/test/decimaltestdata/ddSubtract.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests are for decDoubles only; all arguments are
-- representable in a decDouble
diff --git a/Lib/test/decimaltestdata/ddToIntegral.decTest b/Lib/test/decimaltestdata/ddToIntegral.decTest
index 1e3e573..438d347 100644
--- a/Lib/test/decimaltestdata/ddToIntegral.decTest
+++ b/Lib/test/decimaltestdata/ddToIntegral.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests tests the extended specification 'round-to-integral
-- value-exact' operations (from IEEE 854, later modified in 754r).
diff --git a/Lib/test/decimaltestdata/ddXor.decTest b/Lib/test/decimaltestdata/ddXor.decTest
index 783fc2b..78e9750 100644
--- a/Lib/test/decimaltestdata/ddXor.decTest
+++ b/Lib/test/decimaltestdata/ddXor.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
precision: 16
maxExponent: 384
diff --git a/Lib/test/decimaltestdata/decDouble.decTest b/Lib/test/decimaltestdata/decDouble.decTest
index d5205b7..bdbf678 100644
--- a/Lib/test/decimaltestdata/decDouble.decTest
+++ b/Lib/test/decimaltestdata/decDouble.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- decDouble tests
dectest: ddAbs
diff --git a/Lib/test/decimaltestdata/decQuad.decTest b/Lib/test/decimaltestdata/decQuad.decTest
index 4d10069..e9ec663 100644
--- a/Lib/test/decimaltestdata/decQuad.decTest
+++ b/Lib/test/decimaltestdata/decQuad.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- decQuad tests
dectest: dqAbs
diff --git a/Lib/test/decimaltestdata/decSingle.decTest b/Lib/test/decimaltestdata/decSingle.decTest
index c661fe4..aae9b37 100644
--- a/Lib/test/decimaltestdata/decSingle.decTest
+++ b/Lib/test/decimaltestdata/decSingle.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- decSingle tests
dectest: dsBase
diff --git a/Lib/test/decimaltestdata/divide.decTest b/Lib/test/decimaltestdata/divide.decTest
index 1cb82b4..ae2bc08 100644
--- a/Lib/test/decimaltestdata/divide.decTest
+++ b/Lib/test/decimaltestdata/divide.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/divideint.decTest b/Lib/test/decimaltestdata/divideint.decTest
index dfa17ca..1c940f5 100644
--- a/Lib/test/decimaltestdata/divideint.decTest
+++ b/Lib/test/decimaltestdata/divideint.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/dqAbs.decTest b/Lib/test/decimaltestdata/dqAbs.decTest
index 01d1f30..df010ac 100644
--- a/Lib/test/decimaltestdata/dqAbs.decTest
+++ b/Lib/test/decimaltestdata/dqAbs.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqAdd.decTest b/Lib/test/decimaltestdata/dqAdd.decTest
index 72238d3..256bc98 100644
--- a/Lib/test/decimaltestdata/dqAdd.decTest
+++ b/Lib/test/decimaltestdata/dqAdd.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests are for decQuads only; all arguments are
-- representable in a decQuad
diff --git a/Lib/test/decimaltestdata/dqAnd.decTest b/Lib/test/decimaltestdata/dqAnd.decTest
index be3fb34..e00d44d 100644
--- a/Lib/test/decimaltestdata/dqAnd.decTest
+++ b/Lib/test/decimaltestdata/dqAnd.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqBase.decTest b/Lib/test/decimaltestdata/dqBase.decTest
index 6cf2f7f..3f2569b 100644
--- a/Lib/test/decimaltestdata/dqBase.decTest
+++ b/Lib/test/decimaltestdata/dqBase.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This file tests base conversions from string to a decimal number
-- and back to a string (in Scientific form)
diff --git a/Lib/test/decimaltestdata/dqCanonical.decTest b/Lib/test/decimaltestdata/dqCanonical.decTest
index a6b801a..e13c347 100644
--- a/Lib/test/decimaltestdata/dqCanonical.decTest
+++ b/Lib/test/decimaltestdata/dqCanonical.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This file tests that copy operations leave uncanonical operands
-- unchanged, and vice versa
diff --git a/Lib/test/decimaltestdata/dqClass.decTest b/Lib/test/decimaltestdata/dqClass.decTest
index 185fbfc..a4703f7 100644
--- a/Lib/test/decimaltestdata/dqClass.decTest
+++ b/Lib/test/decimaltestdata/dqClass.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- [New 2006.11.27]
diff --git a/Lib/test/decimaltestdata/dqCompare.decTest b/Lib/test/decimaltestdata/dqCompare.decTest
index 8947280..7fccdf1 100644
--- a/Lib/test/decimaltestdata/dqCompare.decTest
+++ b/Lib/test/decimaltestdata/dqCompare.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that we cannot assume add/subtract tests cover paths adequately,
-- here, because the code might be quite different (comparison cannot
diff --git a/Lib/test/decimaltestdata/dqCompareSig.decTest b/Lib/test/decimaltestdata/dqCompareSig.decTest
index 43833ea..36d5e9b 100644
--- a/Lib/test/decimaltestdata/dqCompareSig.decTest
+++ b/Lib/test/decimaltestdata/dqCompareSig.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that we cannot assume add/subtract tests cover paths adequately,
-- here, because the code might be quite different (comparison cannot
diff --git a/Lib/test/decimaltestdata/dqCompareTotal.decTest b/Lib/test/decimaltestdata/dqCompareTotal.decTest
index d4a7c5a..f5cec06 100644
--- a/Lib/test/decimaltestdata/dqCompareTotal.decTest
+++ b/Lib/test/decimaltestdata/dqCompareTotal.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that we cannot assume add/subtract tests cover paths adequately,
-- here, because the code might be quite different (comparison cannot
diff --git a/Lib/test/decimaltestdata/dqCompareTotalMag.decTest b/Lib/test/decimaltestdata/dqCompareTotalMag.decTest
index 9461d6b..76c1089 100644
--- a/Lib/test/decimaltestdata/dqCompareTotalMag.decTest
+++ b/Lib/test/decimaltestdata/dqCompareTotalMag.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Note that we cannot assume add/subtract tests cover paths adequately,
-- here, because the code might be quite different (comparison cannot
diff --git a/Lib/test/decimaltestdata/dqCopy.decTest b/Lib/test/decimaltestdata/dqCopy.decTest
index b833776..b768801 100644
--- a/Lib/test/decimaltestdata/dqCopy.decTest
+++ b/Lib/test/decimaltestdata/dqCopy.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decQuads.
extended: 1
diff --git a/Lib/test/decimaltestdata/dqCopyAbs.decTest b/Lib/test/decimaltestdata/dqCopyAbs.decTest
index 91f4a68..427e6dd 100644
--- a/Lib/test/decimaltestdata/dqCopyAbs.decTest
+++ b/Lib/test/decimaltestdata/dqCopyAbs.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decQuads.
extended: 1
diff --git a/Lib/test/decimaltestdata/dqCopyNegate.decTest b/Lib/test/decimaltestdata/dqCopyNegate.decTest
index 22ac89c..34a6f3c 100644
--- a/Lib/test/decimaltestdata/dqCopyNegate.decTest
+++ b/Lib/test/decimaltestdata/dqCopyNegate.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decQuads.
extended: 1
diff --git a/Lib/test/decimaltestdata/dqCopySign.decTest b/Lib/test/decimaltestdata/dqCopySign.decTest
index 8f275cd..902c937 100644
--- a/Lib/test/decimaltestdata/dqCopySign.decTest
+++ b/Lib/test/decimaltestdata/dqCopySign.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decQuads.
extended: 1
diff --git a/Lib/test/decimaltestdata/dqDivide.decTest b/Lib/test/decimaltestdata/dqDivide.decTest
index a84e1d0..1ea6d31 100644
--- a/Lib/test/decimaltestdata/dqDivide.decTest
+++ b/Lib/test/decimaltestdata/dqDivide.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqDivideInt.decTest b/Lib/test/decimaltestdata/dqDivideInt.decTest
index 953c1e0..b5eec63 100644
--- a/Lib/test/decimaltestdata/dqDivideInt.decTest
+++ b/Lib/test/decimaltestdata/dqDivideInt.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqEncode.decTest b/Lib/test/decimaltestdata/dqEncode.decTest
index ed3f328..fcb512b 100644
--- a/Lib/test/decimaltestdata/dqEncode.decTest
+++ b/Lib/test/decimaltestdata/dqEncode.decTest
@@ -18,7 +18,7 @@
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-- [Previously called decimal128.decTest]
-version: 2.56
+version: 2.57
-- This set of tests is for the sixteen-byte concrete representation.
-- Its characteristics are:
@@ -468,3 +468,10 @@ decq828 apply #22080000000000000000000115afb55a -> 4294967294
decq829 apply #22080000000000000000000115afb55b -> 4294967295
decq830 apply #22080000000000000000000115afb57a -> 4294967296
decq831 apply #22080000000000000000000115afb57b -> 4294967297
+
+-- VG testcase
+decq840 apply #2080000000000000F294000000172636 -> 8.81125000000001349436E-1548
+decq841 apply #20800000000000008000000000000000 -> 8.000000000000000000E-1550
+decq842 apply #1EF98490000000010F6E4E0000000000 -> 7.049000000000010795488000000000000E-3097
+decq843 multiply #20800000000000008000000000000000 #2080000000000000F294000000172636 -> #1EF98490000000010F6E4E0000000000 Rounded
+
diff --git a/Lib/test/decimaltestdata/dqFMA.decTest b/Lib/test/decimaltestdata/dqFMA.decTest
index 37d7749..f68fdf9 100644
--- a/Lib/test/decimaltestdata/dqFMA.decTest
+++ b/Lib/test/decimaltestdata/dqFMA.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
@@ -1754,6 +1754,31 @@ dqadd375087 fma 1 12398765432112345678945678 1E-33 -> 123987
dqadd375088 fma 1 12398765432112345678945678 1E-34 -> 12398765432112345678945678.00000001 Inexact Rounded
dqadd375089 fma 1 12398765432112345678945678 1E-35 -> 12398765432112345678945678.00000001 Inexact Rounded
+-- Destructive subtract (from remainder tests)
+
+-- +++ some of these will be off-by-one remainder vs remainderNear
+
+dqfma4000 fma -1234567890123456789012345678901233 1.000000000000000000000000000000001 1234567890123456789012345678901234 -> -0.234567890123456789012345678901233
+dqfma4001 fma -1234567890123456789012345678901222 1.00000000000000000000000000000001 1234567890123456789012345678901234 -> -0.34567890123456789012345678901222
+dqfma4002 fma -1234567890123456789012345678901111 1.0000000000000000000000000000001 1234567890123456789012345678901234 -> -0.4567890123456789012345678901111
+dqfma4003 fma -308641972530864197253086419725314 4.000000000000000000000000000000001 1234567890123456789012345678901255 -> -1.308641972530864197253086419725314
+dqfma4004 fma -308641972530864197253086419725308 4.000000000000000000000000000000001 1234567890123456789012345678901234 -> 1.691358027469135802746913580274692
+dqfma4005 fma -246913578024691357802469135780252 4.9999999999999999999999999999999 1234567890123456789012345678901234 -> -1.3086421975308642197530864219748
+dqfma4006 fma -246913578024691357802469135780247 4.99999999999999999999999999999999 1234567890123456789012345678901234 -> 1.46913578024691357802469135780247
+dqfma4007 fma -246913578024691357802469135780247 4.999999999999999999999999999999999 1234567890123456789012345678901234 -> -0.753086421975308642197530864219753
+dqfma4008 fma -246913578024691357802469135780247 5.000000000000000000000000000000001 1234567890123456789012345678901234 -> -1.246913578024691357802469135780247
+dqfma4009 fma -246913578024691357802469135780246 5.00000000000000000000000000000001 1234567890123456789012345678901234 -> 1.53086421975308642197530864219754
+dqfma4010 fma -246913578024691357802469135780242 5.0000000000000000000000000000001 1234567890123456789012345678901234 -> -0.6913578024691357802469135780242
+dqfma4011 fma -1234567890123456789012345678901232 1.000000000000000000000000000000001 1234567890123456789012345678901234 -> 0.765432109876543210987654321098768
+dqfma4012 fma -1234567890123456789012345678901221 1.00000000000000000000000000000001 1234567890123456789012345678901234 -> 0.65432109876543210987654321098779
+dqfma4013 fma -1234567890123456789012345678901110 1.0000000000000000000000000000001 1234567890123456789012345678901234 -> 0.5432109876543210987654321098890
+dqfma4014 fma -308641972530864197253086419725313 4.000000000000000000000000000000001 1234567890123456789012345678901255 -> 2.691358027469135802746913580274687
+dqfma4015 fma -308641972530864197253086419725308 4.000000000000000000000000000000001 1234567890123456789012345678901234 -> 1.691358027469135802746913580274692
+dqfma4016 fma -246913578024691357802469135780251 4.9999999999999999999999999999999 1234567890123456789012345678901234 -> 3.6913578024691357802469135780251
+dqfma4017 fma -246913578024691357802469135780247 4.99999999999999999999999999999999 1234567890123456789012345678901234 -> 1.46913578024691357802469135780247
+dqfma4018 fma -246913578024691357802469135780246 4.999999999999999999999999999999999 1234567890123456789012345678901234 -> 4.246913578024691357802469135780246
+dqfma4019 fma -246913578024691357802469135780241 5.0000000000000000000000000000001 1234567890123456789012345678901234 -> 4.3086421975308642197530864219759
+
-- Null tests
dqadd39990 fma 1 10 # -> NaN Invalid_operation
dqadd39991 fma 1 # 10 -> NaN Invalid_operation
diff --git a/Lib/test/decimaltestdata/dqInvert.decTest b/Lib/test/decimaltestdata/dqInvert.decTest
index 94ba93c..19161c2 100644
--- a/Lib/test/decimaltestdata/dqInvert.decTest
+++ b/Lib/test/decimaltestdata/dqInvert.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqLogB.decTest b/Lib/test/decimaltestdata/dqLogB.decTest
index baa6d1e..d6cf831 100644
--- a/Lib/test/decimaltestdata/dqLogB.decTest
+++ b/Lib/test/decimaltestdata/dqLogB.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqMax.decTest b/Lib/test/decimaltestdata/dqMax.decTest
index a00ec1c..a3ba64c 100644
--- a/Lib/test/decimaltestdata/dqMax.decTest
+++ b/Lib/test/decimaltestdata/dqMax.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/dqMaxMag.decTest b/Lib/test/decimaltestdata/dqMaxMag.decTest
index 53eb82c..01b2793 100644
--- a/Lib/test/decimaltestdata/dqMaxMag.decTest
+++ b/Lib/test/decimaltestdata/dqMaxMag.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/dqMin.decTest b/Lib/test/decimaltestdata/dqMin.decTest
index 9e34694..1b82be2 100644
--- a/Lib/test/decimaltestdata/dqMin.decTest
+++ b/Lib/test/decimaltestdata/dqMin.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/dqMinMag.decTest b/Lib/test/decimaltestdata/dqMinMag.decTest
index 733acfd..6d5e4b5 100644
--- a/Lib/test/decimaltestdata/dqMinMag.decTest
+++ b/Lib/test/decimaltestdata/dqMinMag.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/dqMinus.decTest b/Lib/test/decimaltestdata/dqMinus.decTest
index 50ac85a..bf69938 100644
--- a/Lib/test/decimaltestdata/dqMinus.decTest
+++ b/Lib/test/decimaltestdata/dqMinus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decQuads.
extended: 1
diff --git a/Lib/test/decimaltestdata/dqMultiply.decTest b/Lib/test/decimaltestdata/dqMultiply.decTest
index a6f85e0..c87cc8f 100644
--- a/Lib/test/decimaltestdata/dqMultiply.decTest
+++ b/Lib/test/decimaltestdata/dqMultiply.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests are for decQuads only; all arguments are
-- representable in a decQuad
@@ -456,18 +456,134 @@ dqmul908 multiply 9.999999999999999999999999999999999E-6143 0.0999999999999999
-- hugest
dqmul909 multiply 9999999999999999999999999999999999 9999999999999999999999999999999999 -> 9.999999999999999999999999999999998E+67 Inexact Rounded
+-- VG case
+dqmul910 multiply 8.81125000000001349436E-1548 8.000000000000000000E-1550 -> 7.049000000000010795488000000000000E-3097 Rounded
-- Examples from SQL proposal (Krishna Kulkarni)
precision: 34
rounding: half_up
maxExponent: 6144
minExponent: -6143
-dqmul1001 multiply 130E-2 120E-2 -> 1.5600
-dqmul1002 multiply 130E-2 12E-1 -> 1.560
-dqmul1003 multiply 130E-2 1E0 -> 1.30
-dqmul1004 multiply 1E2 1E4 -> 1E+6
+dqmul911 multiply 130E-2 120E-2 -> 1.5600
+dqmul912 multiply 130E-2 12E-1 -> 1.560
+dqmul913 multiply 130E-2 1E0 -> 1.30
+dqmul914 multiply 1E2 1E4 -> 1E+6
+
+-- power-of-ten edge cases
+dqmul1001 multiply 1 10 -> 10
+dqmul1002 multiply 1 100 -> 100
+dqmul1003 multiply 1 1000 -> 1000
+dqmul1004 multiply 1 10000 -> 10000
+dqmul1005 multiply 1 100000 -> 100000
+dqmul1006 multiply 1 1000000 -> 1000000
+dqmul1007 multiply 1 10000000 -> 10000000
+dqmul1008 multiply 1 100000000 -> 100000000
+dqmul1009 multiply 1 1000000000 -> 1000000000
+dqmul1010 multiply 1 10000000000 -> 10000000000
+dqmul1011 multiply 1 100000000000 -> 100000000000
+dqmul1012 multiply 1 1000000000000 -> 1000000000000
+dqmul1013 multiply 1 10000000000000 -> 10000000000000
+dqmul1014 multiply 1 100000000000000 -> 100000000000000
+dqmul1015 multiply 1 1000000000000000 -> 1000000000000000
+
+dqmul1016 multiply 1 1000000000000000000 -> 1000000000000000000
+dqmul1017 multiply 1 100000000000000000000000000 -> 100000000000000000000000000
+dqmul1018 multiply 1 1000000000000000000000000000 -> 1000000000000000000000000000
+dqmul1019 multiply 1 10000000000000000000000000000 -> 10000000000000000000000000000
+dqmul1020 multiply 1 1000000000000000000000000000000000 -> 1000000000000000000000000000000000
+
+dqmul1021 multiply 10 1 -> 10
+dqmul1022 multiply 10 10 -> 100
+dqmul1023 multiply 10 100 -> 1000
+dqmul1024 multiply 10 1000 -> 10000
+dqmul1025 multiply 10 10000 -> 100000
+dqmul1026 multiply 10 100000 -> 1000000
+dqmul1027 multiply 10 1000000 -> 10000000
+dqmul1028 multiply 10 10000000 -> 100000000
+dqmul1029 multiply 10 100000000 -> 1000000000
+dqmul1030 multiply 10 1000000000 -> 10000000000
+dqmul1031 multiply 10 10000000000 -> 100000000000
+dqmul1032 multiply 10 100000000000 -> 1000000000000
+dqmul1033 multiply 10 1000000000000 -> 10000000000000
+dqmul1034 multiply 10 10000000000000 -> 100000000000000
+dqmul1035 multiply 10 100000000000000 -> 1000000000000000
+
+dqmul1036 multiply 10 100000000000000000 -> 1000000000000000000
+dqmul1037 multiply 10 10000000000000000000000000 -> 100000000000000000000000000
+dqmul1038 multiply 10 100000000000000000000000000 -> 1000000000000000000000000000
+dqmul1039 multiply 10 1000000000000000000000000000 -> 10000000000000000000000000000
+dqmul1040 multiply 10 100000000000000000000000000000000 -> 1000000000000000000000000000000000
+
+dqmul1041 multiply 100 0.1 -> 10.0
+dqmul1042 multiply 100 1 -> 100
+dqmul1043 multiply 100 10 -> 1000
+dqmul1044 multiply 100 100 -> 10000
+dqmul1045 multiply 100 1000 -> 100000
+dqmul1046 multiply 100 10000 -> 1000000
+dqmul1047 multiply 100 100000 -> 10000000
+dqmul1048 multiply 100 1000000 -> 100000000
+dqmul1049 multiply 100 10000000 -> 1000000000
+dqmul1050 multiply 100 100000000 -> 10000000000
+dqmul1051 multiply 100 1000000000 -> 100000000000
+dqmul1052 multiply 100 10000000000 -> 1000000000000
+dqmul1053 multiply 100 100000000000 -> 10000000000000
+dqmul1054 multiply 100 1000000000000 -> 100000000000000
+dqmul1055 multiply 100 10000000000000 -> 1000000000000000
+
+dqmul1056 multiply 100 10000000000000000 -> 1000000000000000000
+dqmul1057 multiply 100 1000000000000000000000000 -> 100000000000000000000000000
+dqmul1058 multiply 100 10000000000000000000000000 -> 1000000000000000000000000000
+dqmul1059 multiply 100 100000000000000000000000000 -> 10000000000000000000000000000
+dqmul1060 multiply 100 10000000000000000000000000000000 -> 1000000000000000000000000000000000
+
+dqmul1061 multiply 1000 0.01 -> 10.00
+dqmul1062 multiply 1000 0.1 -> 100.0
+dqmul1063 multiply 1000 1 -> 1000
+dqmul1064 multiply 1000 10 -> 10000
+dqmul1065 multiply 1000 100 -> 100000
+dqmul1066 multiply 1000 1000 -> 1000000
+dqmul1067 multiply 1000 10000 -> 10000000
+dqmul1068 multiply 1000 100000 -> 100000000
+dqmul1069 multiply 1000 1000000 -> 1000000000
+dqmul1070 multiply 1000 10000000 -> 10000000000
+dqmul1071 multiply 1000 100000000 -> 100000000000
+dqmul1072 multiply 1000 1000000000 -> 1000000000000
+dqmul1073 multiply 1000 10000000000 -> 10000000000000
+dqmul1074 multiply 1000 100000000000 -> 100000000000000
+dqmul1075 multiply 1000 1000000000000 -> 1000000000000000
+
+dqmul1076 multiply 1000 1000000000000000 -> 1000000000000000000
+dqmul1077 multiply 1000 100000000000000000000000 -> 100000000000000000000000000
+dqmul1078 multiply 1000 1000000000000000000000000 -> 1000000000000000000000000000
+dqmul1079 multiply 1000 10000000000000000000000000 -> 10000000000000000000000000000
+dqmul1080 multiply 1000 1000000000000000000000000000000 -> 1000000000000000000000000000000000
+
+dqmul1081 multiply 10000 0.001 -> 10.000
+dqmul1082 multiply 10000 0.01 -> 100.00
+dqmul1083 multiply 10000 0.1 -> 1000.0
+dqmul1084 multiply 10000 1 -> 10000
+dqmul1085 multiply 10000 10 -> 100000
+dqmul1086 multiply 10000 100 -> 1000000
+dqmul1087 multiply 10000 1000 -> 10000000
+dqmul1088 multiply 10000 10000 -> 100000000
+dqmul1089 multiply 10000 100000 -> 1000000000
+dqmul1090 multiply 10000 1000000 -> 10000000000
+dqmul1091 multiply 10000 10000000 -> 100000000000
+dqmul1092 multiply 10000 100000000 -> 1000000000000
+dqmul1093 multiply 10000 1000000000 -> 10000000000000
+dqmul1094 multiply 10000 10000000000 -> 100000000000000
+dqmul1095 multiply 10000 100000000000 -> 1000000000000000
+
+dqmul1096 multiply 10000 100000000000000 -> 1000000000000000000
+dqmul1097 multiply 10000 10000000000000000000000 -> 100000000000000000000000000
+dqmul1098 multiply 10000 100000000000000000000000 -> 1000000000000000000000000000
+dqmul1099 multiply 10000 1000000000000000000000000 -> 10000000000000000000000000000
+dqmul1100 multiply 10000 100000000000000000000000000000 -> 1000000000000000000000000000000000
+
+dqmul1107 multiply 10000 99999999999 -> 999999999990000
+dqmul1108 multiply 10000 99999999999 -> 999999999990000
-- Null tests
-dqmul990 multiply 10 # -> NaN Invalid_operation
-dqmul991 multiply # 10 -> NaN Invalid_operation
+dqmul9990 multiply 10 # -> NaN Invalid_operation
+dqmul9991 multiply # 10 -> NaN Invalid_operation
diff --git a/Lib/test/decimaltestdata/dqNextMinus.decTest b/Lib/test/decimaltestdata/dqNextMinus.decTest
index 4880816..e1e3b06 100644
--- a/Lib/test/decimaltestdata/dqNextMinus.decTest
+++ b/Lib/test/decimaltestdata/dqNextMinus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decQuads.
extended: 1
diff --git a/Lib/test/decimaltestdata/dqNextPlus.decTest b/Lib/test/decimaltestdata/dqNextPlus.decTest
index 8c0ac45..973c8eb 100644
--- a/Lib/test/decimaltestdata/dqNextPlus.decTest
+++ b/Lib/test/decimaltestdata/dqNextPlus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decQuads.
extended: 1
diff --git a/Lib/test/decimaltestdata/dqNextToward.decTest b/Lib/test/decimaltestdata/dqNextToward.decTest
index e534951..0eb6770 100644
--- a/Lib/test/decimaltestdata/dqNextToward.decTest
+++ b/Lib/test/decimaltestdata/dqNextToward.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decQuads.
extended: 1
diff --git a/Lib/test/decimaltestdata/dqOr.decTest b/Lib/test/decimaltestdata/dqOr.decTest
index 60470ea..093edcb 100644
--- a/Lib/test/decimaltestdata/dqOr.decTest
+++ b/Lib/test/decimaltestdata/dqOr.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqPlus.decTest b/Lib/test/decimaltestdata/dqPlus.decTest
index 5dc5a68..ad5b7be 100644
--- a/Lib/test/decimaltestdata/dqPlus.decTest
+++ b/Lib/test/decimaltestdata/dqPlus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decQuads.
extended: 1
diff --git a/Lib/test/decimaltestdata/dqQuantize.decTest b/Lib/test/decimaltestdata/dqQuantize.decTest
index aa8cf2e..4c3e1ea 100644
--- a/Lib/test/decimaltestdata/dqQuantize.decTest
+++ b/Lib/test/decimaltestdata/dqQuantize.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Most of the tests here assume a "regular pattern", where the
-- sign and coefficient are +1.
diff --git a/Lib/test/decimaltestdata/dqReduce.decTest b/Lib/test/decimaltestdata/dqReduce.decTest
index 183e9dc..c069040 100644
--- a/Lib/test/decimaltestdata/dqReduce.decTest
+++ b/Lib/test/decimaltestdata/dqReduce.decTest
@@ -18,7 +18,7 @@
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqRemainder.decTest b/Lib/test/decimaltestdata/dqRemainder.decTest
index e30fde7..14c358c 100644
--- a/Lib/test/decimaltestdata/dqRemainder.decTest
+++ b/Lib/test/decimaltestdata/dqRemainder.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
@@ -580,6 +580,17 @@ dqrem1058 remainder -1e-277 -1e+311 -> -1E-277
-- Gyuris example
dqrem1070 remainder 8.336804418094040989630006819881709E-6143 8.336804418094040989630006819889000E-6143 -> 8.336804418094040989630006819881709E-6143
+-- destructive subtract
+dqrem1120 remainder 1234567890123456789012345678901234 1.000000000000000000000000000000001 -> 0.765432109876543210987654321098768
+dqrem1121 remainder 1234567890123456789012345678901234 1.00000000000000000000000000000001 -> 0.65432109876543210987654321098779
+dqrem1122 remainder 1234567890123456789012345678901234 1.0000000000000000000000000000001 -> 0.5432109876543210987654321098890
+dqrem1123 remainder 1234567890123456789012345678901255 4.000000000000000000000000000000001 -> 2.691358027469135802746913580274687
+dqrem1124 remainder 1234567890123456789012345678901234 4.000000000000000000000000000000001 -> 1.691358027469135802746913580274692
+dqrem1125 remainder 1234567890123456789012345678901234 4.9999999999999999999999999999999 -> 3.6913578024691357802469135780251
+dqrem1126 remainder 1234567890123456789012345678901234 4.99999999999999999999999999999999 -> 1.46913578024691357802469135780247
+dqrem1127 remainder 1234567890123456789012345678901234 4.999999999999999999999999999999999 -> 4.246913578024691357802469135780246
+dqrem1128 remainder 1234567890123456789012345678901234 5.0000000000000000000000000000001 -> 4.3086421975308642197530864219759
+
-- Null tests
dqrem1000 remainder 10 # -> NaN Invalid_operation
dqrem1001 remainder # 10 -> NaN Invalid_operation
diff --git a/Lib/test/decimaltestdata/dqRemainderNear.decTest b/Lib/test/decimaltestdata/dqRemainderNear.decTest
index b62b79f..9074ec4 100644
--- a/Lib/test/decimaltestdata/dqRemainderNear.decTest
+++ b/Lib/test/decimaltestdata/dqRemainderNear.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
@@ -612,6 +612,19 @@ dqrmn1058 remaindernear -1e-277 -1e+311 -> -1E-277
-- Gyuris example
dqrmn1070 remainder 8.336804418094040989630006819881709E-6143 8.336804418094040989630006819889000E-6143 -> 8.336804418094040989630006819881709E-6143
+-- destructive subtract
+dqrmn1101 remaindernear 1234567890123456789012345678901234 1.000000000000000000000000000000001 -> -0.234567890123456789012345678901233
+dqrmn1102 remaindernear 1234567890123456789012345678901234 1.00000000000000000000000000000001 -> -0.34567890123456789012345678901222
+dqrmn1103 remaindernear 1234567890123456789012345678901234 1.0000000000000000000000000000001 -> -0.4567890123456789012345678901111
+dqrmn1104 remaindernear 1234567890123456789012345678901255 4.000000000000000000000000000000001 -> -1.308641972530864197253086419725314
+dqrmn1105 remaindernear 1234567890123456789012345678901234 4.000000000000000000000000000000001 -> 1.691358027469135802746913580274692
+dqrmn1106 remaindernear 1234567890123456789012345678901234 4.9999999999999999999999999999999 -> -1.3086421975308642197530864219748
+dqrmn1107 remaindernear 1234567890123456789012345678901234 4.99999999999999999999999999999999 -> 1.46913578024691357802469135780247
+dqrmn1108 remaindernear 1234567890123456789012345678901234 4.999999999999999999999999999999999 -> -0.753086421975308642197530864219753
+dqrmn1109 remaindernear 1234567890123456789012345678901234 5.000000000000000000000000000000001 -> -1.246913578024691357802469135780247
+dqrmn1110 remaindernear 1234567890123456789012345678901234 5.00000000000000000000000000000001 -> 1.53086421975308642197530864219754
+dqrmn1111 remaindernear 1234567890123456789012345678901234 5.0000000000000000000000000000001 -> -0.6913578024691357802469135780242
+
-- Null tests
dqrmn1000 remaindernear 10 # -> NaN Invalid_operation
dqrmn1001 remaindernear # 10 -> NaN Invalid_operation
diff --git a/Lib/test/decimaltestdata/dqRotate.decTest b/Lib/test/decimaltestdata/dqRotate.decTest
index f21813c..671cd95 100644
--- a/Lib/test/decimaltestdata/dqRotate.decTest
+++ b/Lib/test/decimaltestdata/dqRotate.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqSameQuantum.decTest b/Lib/test/decimaltestdata/dqSameQuantum.decTest
index e7264cb..acf7266 100644
--- a/Lib/test/decimaltestdata/dqSameQuantum.decTest
+++ b/Lib/test/decimaltestdata/dqSameQuantum.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- All operands and results are decQuads.
extended: 1
diff --git a/Lib/test/decimaltestdata/dqScaleB.decTest b/Lib/test/decimaltestdata/dqScaleB.decTest
index 88a3f9d..7355cf0 100644
--- a/Lib/test/decimaltestdata/dqScaleB.decTest
+++ b/Lib/test/decimaltestdata/dqScaleB.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqShift.decTest b/Lib/test/decimaltestdata/dqShift.decTest
index e728ec5..33df91f 100644
--- a/Lib/test/decimaltestdata/dqShift.decTest
+++ b/Lib/test/decimaltestdata/dqShift.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dqSubtract.decTest b/Lib/test/decimaltestdata/dqSubtract.decTest
index 923742c..d2df184 100644
--- a/Lib/test/decimaltestdata/dqSubtract.decTest
+++ b/Lib/test/decimaltestdata/dqSubtract.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests are for decQuads only; all arguments are
-- representable in a decQuad
diff --git a/Lib/test/decimaltestdata/dqToIntegral.decTest b/Lib/test/decimaltestdata/dqToIntegral.decTest
index ac50a4a..449dead 100644
--- a/Lib/test/decimaltestdata/dqToIntegral.decTest
+++ b/Lib/test/decimaltestdata/dqToIntegral.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests tests the extended specification 'round-to-integral
-- value-exact' operations (from IEEE 854, later modified in 754r).
diff --git a/Lib/test/decimaltestdata/dqXor.decTest b/Lib/test/decimaltestdata/dqXor.decTest
index 61bdbe2..d9e9af6 100644
--- a/Lib/test/decimaltestdata/dqXor.decTest
+++ b/Lib/test/decimaltestdata/dqXor.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
clamp: 1
diff --git a/Lib/test/decimaltestdata/dsBase.decTest b/Lib/test/decimaltestdata/dsBase.decTest
index d0632fd..e2fb4ba 100644
--- a/Lib/test/decimaltestdata/dsBase.decTest
+++ b/Lib/test/decimaltestdata/dsBase.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This file tests base conversions from string to a decimal number
-- and back to a string (in Scientific form)
@@ -1058,4 +1058,5 @@ dsbas1106 toSci +1E-398 -> 0E-101 Inexact Rounded Subnormal Underflow Clamped
dsbas1107 toSci +1E-383 -> 0E-101 Inexact Rounded Subnormal Underflow Clamped
dsbas1108 toSci +9.999999999999999E+384 -> Infinity Overflow Inexact Rounded
-
+-- narrowing case
+dsbas1110 toSci 2.000000000000000E-99 -> 2.00E-99 Rounded Subnormal
diff --git a/Lib/test/decimaltestdata/dsEncode.decTest b/Lib/test/decimaltestdata/dsEncode.decTest
index 185ddc7..7e72d4b 100644
--- a/Lib/test/decimaltestdata/dsEncode.decTest
+++ b/Lib/test/decimaltestdata/dsEncode.decTest
@@ -18,7 +18,7 @@
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-- [Previously called decimal32.decTest]
-version: 2.56
+version: 2.57
-- This set of tests is for the four-byte concrete representation.
-- Its characteristics are:
@@ -367,3 +367,6 @@ decs785 apply #225001ff -> 999
decs786 apply #225002ff -> 999
decs787 apply #225003ff -> 999
+-- narrowing case
+decs790 apply 2.00E-99 -> #00000100 Subnormal
+decs791 apply #00000100 -> 2.00E-99 Subnormal
diff --git a/Lib/test/decimaltestdata/exp.decTest b/Lib/test/decimaltestdata/exp.decTest
index c07ed5a..97256e4 100644
--- a/Lib/test/decimaltestdata/exp.decTest
+++ b/Lib/test/decimaltestdata/exp.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Tests of the exponential funtion. Currently all testcases here
-- show results which are correctly rounded (within <= 0.5 ulp).
diff --git a/Lib/test/decimaltestdata/fma.decTest b/Lib/test/decimaltestdata/fma.decTest
index aa4c0ba..d7caa26 100644
--- a/Lib/test/decimaltestdata/fma.decTest
+++ b/Lib/test/decimaltestdata/fma.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/inexact.decTest b/Lib/test/decimaltestdata/inexact.decTest
index b61c85a..896e6c8 100644
--- a/Lib/test/decimaltestdata/inexact.decTest
+++ b/Lib/test/decimaltestdata/inexact.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/invert.decTest b/Lib/test/decimaltestdata/invert.decTest
index 19fdeeb..7bccb1f 100644
--- a/Lib/test/decimaltestdata/invert.decTest
+++ b/Lib/test/decimaltestdata/invert.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/ln.decTest b/Lib/test/decimaltestdata/ln.decTest
index 44ae4d2..16e247e 100644
--- a/Lib/test/decimaltestdata/ln.decTest
+++ b/Lib/test/decimaltestdata/ln.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 16
diff --git a/Lib/test/decimaltestdata/log10.decTest b/Lib/test/decimaltestdata/log10.decTest
index 9841acb..bb033a8 100644
--- a/Lib/test/decimaltestdata/log10.decTest
+++ b/Lib/test/decimaltestdata/log10.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This emphasises the testing of notable cases, as they will often
-- have unusual paths (especially the 10**n results).
diff --git a/Lib/test/decimaltestdata/logb.decTest b/Lib/test/decimaltestdata/logb.decTest
index 577f7a4..a672206 100644
--- a/Lib/test/decimaltestdata/logb.decTest
+++ b/Lib/test/decimaltestdata/logb.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This emphasises the testing of notable cases, as they will often
-- have unusual paths (especially the 10**n results).
diff --git a/Lib/test/decimaltestdata/max.decTest b/Lib/test/decimaltestdata/max.decTest
index 88d0b5e..d7a6a94 100644
--- a/Lib/test/decimaltestdata/max.decTest
+++ b/Lib/test/decimaltestdata/max.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/maxmag.decTest b/Lib/test/decimaltestdata/maxmag.decTest
index b14d015..0129766 100644
--- a/Lib/test/decimaltestdata/maxmag.decTest
+++ b/Lib/test/decimaltestdata/maxmag.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/min.decTest b/Lib/test/decimaltestdata/min.decTest
index 345e3eb..b695079 100644
--- a/Lib/test/decimaltestdata/min.decTest
+++ b/Lib/test/decimaltestdata/min.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/minmag.decTest b/Lib/test/decimaltestdata/minmag.decTest
index fa9d927..547ccff 100644
--- a/Lib/test/decimaltestdata/minmag.decTest
+++ b/Lib/test/decimaltestdata/minmag.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- we assume that base comparison is tested in compare.decTest, so
-- these mainly cover special cases and rounding
diff --git a/Lib/test/decimaltestdata/minus.decTest b/Lib/test/decimaltestdata/minus.decTest
index e9afc3a..f911286 100644
--- a/Lib/test/decimaltestdata/minus.decTest
+++ b/Lib/test/decimaltestdata/minus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests primarily tests the existence of the operator.
-- Subtraction, rounding, and more overflows are tested elsewhere.
diff --git a/Lib/test/decimaltestdata/multiply.decTest b/Lib/test/decimaltestdata/multiply.decTest
index 71f591a..a6c7ebe 100644
--- a/Lib/test/decimaltestdata/multiply.decTest
+++ b/Lib/test/decimaltestdata/multiply.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/nextminus.decTest b/Lib/test/decimaltestdata/nextminus.decTest
index 200580d..be33158 100644
--- a/Lib/test/decimaltestdata/nextminus.decTest
+++ b/Lib/test/decimaltestdata/nextminus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/nextplus.decTest b/Lib/test/decimaltestdata/nextplus.decTest
index 01815ee..6cee16a 100644
--- a/Lib/test/decimaltestdata/nextplus.decTest
+++ b/Lib/test/decimaltestdata/nextplus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/nexttoward.decTest b/Lib/test/decimaltestdata/nexttoward.decTest
index cb60f57..aa1891a 100644
--- a/Lib/test/decimaltestdata/nexttoward.decTest
+++ b/Lib/test/decimaltestdata/nexttoward.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/or.decTest b/Lib/test/decimaltestdata/or.decTest
index 928939e..ace901b 100644
--- a/Lib/test/decimaltestdata/or.decTest
+++ b/Lib/test/decimaltestdata/or.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/plus.decTest b/Lib/test/decimaltestdata/plus.decTest
index 9af4c0e..1df3dfe 100644
--- a/Lib/test/decimaltestdata/plus.decTest
+++ b/Lib/test/decimaltestdata/plus.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests primarily tests the existence of the operator.
-- Addition and rounding, and most overflows, are tested elsewhere.
diff --git a/Lib/test/decimaltestdata/power.decTest b/Lib/test/decimaltestdata/power.decTest
index 78c1e07..69e8644 100644
--- a/Lib/test/decimaltestdata/power.decTest
+++ b/Lib/test/decimaltestdata/power.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- In addition to the power operator testcases here, see also the file
-- powersqrt.decTest which includes all the tests from
diff --git a/Lib/test/decimaltestdata/powersqrt.decTest b/Lib/test/decimaltestdata/powersqrt.decTest
index 36e5cbb..6f79f6c 100644
--- a/Lib/test/decimaltestdata/powersqrt.decTest
+++ b/Lib/test/decimaltestdata/powersqrt.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- These testcases are taken from squareroot.decTest but are
-- evaluated using the power operator. The differences in results
diff --git a/Lib/test/decimaltestdata/quantize.decTest b/Lib/test/decimaltestdata/quantize.decTest
index a60f1bf..1e5511f 100644
--- a/Lib/test/decimaltestdata/quantize.decTest
+++ b/Lib/test/decimaltestdata/quantize.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- Most of the tests here assume a "regular pattern", where the
-- sign and coefficient are +1.
diff --git a/Lib/test/decimaltestdata/randomBound32.decTest b/Lib/test/decimaltestdata/randomBound32.decTest
index 7f115ad..0d5881d 100644
--- a/Lib/test/decimaltestdata/randomBound32.decTest
+++ b/Lib/test/decimaltestdata/randomBound32.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.55
+version: 2.57
-- These testcases test calculations at precisions 31, 32, and 33, to
-- exercise the boundaries around 2**5
diff --git a/Lib/test/decimaltestdata/randoms.decTest b/Lib/test/decimaltestdata/randoms.decTest
index 1529aec..a03b8d5 100644
--- a/Lib/test/decimaltestdata/randoms.decTest
+++ b/Lib/test/decimaltestdata/randoms.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
maxexponent: 999999999
diff --git a/Lib/test/decimaltestdata/reduce.decTest b/Lib/test/decimaltestdata/reduce.decTest
index ddce0c9..189a687 100644
--- a/Lib/test/decimaltestdata/reduce.decTest
+++ b/Lib/test/decimaltestdata/reduce.decTest
@@ -19,7 +19,7 @@
------------------------------------------------------------------------
-- [This used to be called normalize.]
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/remainder.decTest b/Lib/test/decimaltestdata/remainder.decTest
index 4c92d0c..1a51c26 100644
--- a/Lib/test/decimaltestdata/remainder.decTest
+++ b/Lib/test/decimaltestdata/remainder.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/remainderNear.decTest b/Lib/test/decimaltestdata/remainderNear.decTest
index cfca91b..fdc1bd8 100644
--- a/Lib/test/decimaltestdata/remainderNear.decTest
+++ b/Lib/test/decimaltestdata/remainderNear.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.55
+version: 2.57
extended: 1
precision: 9
@@ -413,6 +413,18 @@ rmnx605 remaindernear 7.7 8 -> -0.3
rmnx606 remaindernear 31.5 3 -> 1.5 -- i=10
rmnx607 remaindernear 34.5 3 -> -1.5 -- i=11
+-- zero signs
+rmnx650 remaindernear 1 1 -> 0
+rmnx651 remaindernear -1 1 -> -0
+rmnx652 remaindernear 1 -1 -> 0
+rmnx653 remaindernear -1 -1 -> -0
+rmnx654 remaindernear 0 1 -> 0
+rmnx655 remaindernear -0 1 -> -0
+rmnx656 remaindernear 0 -1 -> 0
+rmnx657 remaindernear -0 -1 -> -0
+rmnx658 remaindernear 0.00 1 -> 0.00
+rmnx659 remaindernear -0.00 1 -> -0.00
+
-- Specials
rmnx680 remaindernear Inf -Inf -> NaN Invalid_operation
rmnx681 remaindernear Inf -1000 -> NaN Invalid_operation
diff --git a/Lib/test/decimaltestdata/rescale.decTest b/Lib/test/decimaltestdata/rescale.decTest
index 30597db..882f570 100644
--- a/Lib/test/decimaltestdata/rescale.decTest
+++ b/Lib/test/decimaltestdata/rescale.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- [obsolete] Quantize.decTest has the improved version
diff --git a/Lib/test/decimaltestdata/rotate.decTest b/Lib/test/decimaltestdata/rotate.decTest
index c5ced59..32dbd53 100644
--- a/Lib/test/decimaltestdata/rotate.decTest
+++ b/Lib/test/decimaltestdata/rotate.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/rounding.decTest b/Lib/test/decimaltestdata/rounding.decTest
index d24fbfb..82ca1b0 100644
--- a/Lib/test/decimaltestdata/rounding.decTest
+++ b/Lib/test/decimaltestdata/rounding.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- These tests require that implementations take account of residues in
-- order to get correct results for some rounding modes. Rather than
diff --git a/Lib/test/decimaltestdata/samequantum.decTest b/Lib/test/decimaltestdata/samequantum.decTest
index 0b1efff..3fa6cff 100644
--- a/Lib/test/decimaltestdata/samequantum.decTest
+++ b/Lib/test/decimaltestdata/samequantum.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/scaleb.decTest b/Lib/test/decimaltestdata/scaleb.decTest
index 0761dea..e77d938 100644
--- a/Lib/test/decimaltestdata/scaleb.decTest
+++ b/Lib/test/decimaltestdata/scaleb.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/shift.decTest b/Lib/test/decimaltestdata/shift.decTest
index c2a40cc..397024e 100644
--- a/Lib/test/decimaltestdata/shift.decTest
+++ b/Lib/test/decimaltestdata/shift.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/squareroot.decTest b/Lib/test/decimaltestdata/squareroot.decTest
index 2ccff5a..8d7b26e 100644
--- a/Lib/test/decimaltestdata/squareroot.decTest
+++ b/Lib/test/decimaltestdata/squareroot.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/subtract.decTest b/Lib/test/decimaltestdata/subtract.decTest
index 338a09c..a1eca31 100644
--- a/Lib/test/decimaltestdata/subtract.decTest
+++ b/Lib/test/decimaltestdata/subtract.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/decimaltestdata/testall.decTest b/Lib/test/decimaltestdata/testall.decTest
index 1cbc20e..673aaa4 100644
--- a/Lib/test/decimaltestdata/testall.decTest
+++ b/Lib/test/decimaltestdata/testall.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- core tests (using Extended: 1) --------------------------------------
dectest: base
diff --git a/Lib/test/decimaltestdata/tointegral.decTest b/Lib/test/decimaltestdata/tointegral.decTest
index ad25e6b..340515c 100644
--- a/Lib/test/decimaltestdata/tointegral.decTest
+++ b/Lib/test/decimaltestdata/tointegral.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests tests the extended specification 'round-to-integral
-- value' operation (from IEEE 854, later modified in 754r).
diff --git a/Lib/test/decimaltestdata/tointegralx.decTest b/Lib/test/decimaltestdata/tointegralx.decTest
index d9bc9f3..381216d 100644
--- a/Lib/test/decimaltestdata/tointegralx.decTest
+++ b/Lib/test/decimaltestdata/tointegralx.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
-- This set of tests tests the extended specification 'round-to-integral
-- value' operation (from IEEE 854, later modified in 754r).
diff --git a/Lib/test/decimaltestdata/xor.decTest b/Lib/test/decimaltestdata/xor.decTest
index 2ac1b37..1f3b03b 100644
--- a/Lib/test/decimaltestdata/xor.decTest
+++ b/Lib/test/decimaltestdata/xor.decTest
@@ -17,7 +17,7 @@
-- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK --
-- mfc@uk.ibm.com --
------------------------------------------------------------------------
-version: 2.56
+version: 2.57
extended: 1
precision: 9
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py
index 98b9479..3c64e64 100644
--- a/Lib/test/test_decimal.py
+++ b/Lib/test/test_decimal.py
@@ -464,6 +464,7 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, None, 1), 2) )
self.assertRaises(ValueError, Decimal, (1, (4, -3, 4, 9, 1), 2) )
self.assertRaises(ValueError, Decimal, (1, (4, 10, 4, 9, 1), 2) )
+ self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 'a', 1), 2) )
def test_explicit_from_Decimal(self):
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index 3b89097..02034b4 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -1916,6 +1916,7 @@ def test_DocFileSuite():
provided.
>>> import unittest, pkgutil, test
+ >>> added_loader = False
>>> if not hasattr(test, '__loader__'):
... test.__loader__ = pkgutil.get_loader(test)
... added_loader = True
diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py
index bd9caff..b9b2e6e 100644
--- a/Lib/test/test_funcattrs.py
+++ b/Lib/test/test_funcattrs.py
@@ -215,6 +215,17 @@ def test_func_closure():
verify(c[0].__class__.__name__ == "cell") # don't have a type object handy
cantset(f, "__closure__", c)
+def test_empty_cell():
+ def f(): print(a)
+ try:
+ f.__closure__[0].cell_contents
+ except ValueError:
+ pass
+ else:
+ raise TestFailed("shouldn't be able to read an empty cell")
+
+ a = 12
+
def test_func_doc():
def f(): pass
verify(f.__doc__ is None)
@@ -339,6 +350,7 @@ def test_im_name():
def testmore():
test_func_closure()
+ test_empty_cell()
test_func_doc()
test_func_globals()
test_func_name()
diff --git a/Lib/trace.py b/Lib/trace.py
index 645517a..f6da026 100644
--- a/Lib/trace.py
+++ b/Lib/trace.py
@@ -282,6 +282,8 @@ class CoverageResults:
# skip some "files" we don't care about...
if filename == "<string>":
continue
+ if filename.startswith("<doctest "):
+ continue
if filename.endswith((".pyc", ".pyo")):
filename = filename[:-1]