From 0d3fb8a944a810f421377d5823cbc006700b3c1d Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 26 Nov 2007 23:23:18 +0000 Subject: [PATCH] Merged revisions 59107-59186 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk (Note: some conflicts in the PCbuild9 directory reverted. Sorry Christian!) ........ r59120 | christian.heimes | 2007-11-22 03:21:16 -0800 (Thu, 22 Nov 2007) | 3 lines Backport of the PCbuild9 directory from the py3k branch. I've finished the last task for the PCbuild9 directory today. I don't think there is much left to do. Now you can all play around with the shiny new VS 2008 and try the PGO builds. I was able to get a speed improvement of about 10% on py3k. Have fun! :) ........ r59126 | brett.cannon | 2007-11-22 16:06:51 -0800 (Thu, 22 Nov 2007) | 2 lines Fix a bug in the test for using __loader__.get_data(). ........ r59131 | christian.heimes | 2007-11-22 23:05:03 -0800 (Thu, 22 Nov 2007) | 1 line Backport of PCbuild9 fixes from py3k r59130 ........ r59132 | christian.heimes | 2007-11-23 01:10:36 -0800 (Fri, 23 Nov 2007) | 2 lines Applied patch #1754273 and #1754271 from Thomas Glee The patches are adding deprecation warnings for back ticks and <> ........ r59133 | christian.heimes | 2007-11-23 04:12:02 -0800 (Fri, 23 Nov 2007) | 2 lines Fixed problems in the last commit. Filenames and line numbers weren't reported correctly. Backquotes still don't report the correct file. The AST nodes only contain the line number but not the file name. ........ r59134 | christian.heimes | 2007-11-23 04:16:35 -0800 (Fri, 23 Nov 2007) | 1 line How did the comment get there? ........ r59135 | christian.heimes | 2007-11-23 05:25:31 -0800 (Fri, 23 Nov 2007) | 1 line And yet another fix for the patch. Paul Moore has send me a note that I've missed a declaration. The additional code has moved the declaration in the middle of the block. ........ r59136 | andrew.kuchling | 2007-11-23 05:37:39 -0800 (Fri, 23 Nov 2007) | 1 line Add item ........ r59137 | skip.montanaro | 2007-11-23 09:08:35 -0800 (Fri, 23 Nov 2007) | 2 lines Make trace and doctest play nice together (issue 1429818). Will backport. ........ r59139 | skip.montanaro | 2007-11-23 09:12:47 -0800 (Fri, 23 Nov 2007) | 1 line issue 1429818 ........ r59144 | facundo.batista | 2007-11-23 09:59:00 -0800 (Fri, 23 Nov 2007) | 10 lines Major change in the internal structure of the Decimal number: now it does not store the mantissa as a tuple of numbers, but as a string. This avoids a lot of conversions, and achieves a speedup of 40%. The API remains intact. Thanks Mark Dickinson. ........ r59146 | facundo.batista | 2007-11-23 10:14:50 -0800 (Fri, 23 Nov 2007) | 3 lines Test cases from Cowlishaw, v2.57. All are pased cleanly. ........ r59156 | christian.heimes | 2007-11-23 17:36:02 -0800 (Fri, 23 Nov 2007) | 2 lines Added filename to compiling struct based on Martin's suggestion. I'm wonder why I was trying to add the filename to the node all the time. The compiling struct is more obvious. ........ r59158 | christian.heimes | 2007-11-23 17:53:59 -0800 (Fri, 23 Nov 2007) | 2 lines Backport of fixes from py3k branch svn merge -r59131:HEAD ../../py3k/PCbuild9/ . ........ r59159 | skip.montanaro | 2007-11-23 20:29:08 -0800 (Fri, 23 Nov 2007) | 1 line revert change that breaks test_doctest (which I forgot to run - sorry) ........ r59162 | skip.montanaro | 2007-11-23 20:31:15 -0800 (Fri, 23 Nov 2007) | 1 line revert ........ r59164 | georg.brandl | 2007-11-24 03:31:46 -0800 (Sat, 24 Nov 2007) | 3 lines #1344: document that you need to open std{in,out,err} with PIPE if you want communicate() to work as described. ........ r59165 | georg.brandl | 2007-11-24 03:39:13 -0800 (Sat, 24 Nov 2007) | 2 lines #1467: fix documentation for TestResult.add{Error,Failure}. ........ r59166 | georg.brandl | 2007-11-24 03:42:14 -0800 (Sat, 24 Nov 2007) | 2 lines #1355: remove mention of PyXML from xml.dom docs. ........ r59169 | amaury.forgeotdarc | 2007-11-24 05:20:22 -0800 (Sat, 24 Nov 2007) | 2 lines Warning "<> not supported in 3.x" should be enabled only when the -3 option is set. ........ r59170 | amaury.forgeotdarc | 2007-11-24 05:44:17 -0800 (Sat, 24 Nov 2007) | 3 lines Issue #1445: Fix a SystemError when accessing the ``cell_contents`` attribute of an empty cell object. Now a ValueError is raised. ........ r59172 | georg.brandl | 2007-11-24 05:56:09 -0800 (Sat, 24 Nov 2007) | 3 lines #1735632: add O_NOATIME constant to os module. Also document a few other O_ constants that were missing from documentation. ........ r59173 | skip.montanaro | 2007-11-24 06:30:47 -0800 (Sat, 24 Nov 2007) | 1 line back in these go - thanks to Titus Brown for the fix ........ r59176 | martin.v.loewis | 2007-11-24 10:33:40 -0800 (Sat, 24 Nov 2007) | 2 lines Bug #1494: Document that appendChild removes first. ........ r59186 | guido.van.rossum | 2007-11-26 14:16:49 -0800 (Mon, 26 Nov 2007) | 2 lines A thread-less variant of brownian.py, submitted by Michele Simoniato. ........ --- Demo/tkinter/guido/brownian2.py | 55 ++ Doc/library/os.rst | 18 +- Doc/library/subprocess.rst | 7 +- Doc/library/unittest.rst | 10 +- Doc/library/xml.dom.rst | 22 +- Doc/whatsnew/2.6.rst | 4 + Lib/decimal.py | 531 ++++++++---------- Lib/doctest.py | 13 + Lib/test/decimaltestdata/abs.decTest | 2 +- Lib/test/decimaltestdata/add.decTest | 31 +- Lib/test/decimaltestdata/and.decTest | 2 +- Lib/test/decimaltestdata/base.decTest | 2 +- Lib/test/decimaltestdata/clamp.decTest | 2 +- Lib/test/decimaltestdata/class.decTest | 2 +- Lib/test/decimaltestdata/compare.decTest | 2 +- Lib/test/decimaltestdata/comparetotal.decTest | 2 +- .../decimaltestdata/comparetotmag.decTest | 2 +- Lib/test/decimaltestdata/copy.decTest | 2 +- Lib/test/decimaltestdata/copyabs.decTest | 2 +- Lib/test/decimaltestdata/copynegate.decTest | 2 +- Lib/test/decimaltestdata/copysign.decTest | 2 +- Lib/test/decimaltestdata/ddAbs.decTest | 2 +- Lib/test/decimaltestdata/ddAdd.decTest | 12 +- Lib/test/decimaltestdata/ddAnd.decTest | 2 +- Lib/test/decimaltestdata/ddBase.decTest | 2 +- Lib/test/decimaltestdata/ddCanonical.decTest | 2 +- Lib/test/decimaltestdata/ddClass.decTest | 2 +- Lib/test/decimaltestdata/ddCompare.decTest | 2 +- Lib/test/decimaltestdata/ddCompareSig.decTest | 2 +- .../decimaltestdata/ddCompareTotal.decTest | 2 +- .../decimaltestdata/ddCompareTotalMag.decTest | 2 +- Lib/test/decimaltestdata/ddCopy.decTest | 2 +- Lib/test/decimaltestdata/ddCopyAbs.decTest | 2 +- Lib/test/decimaltestdata/ddCopyNegate.decTest | 2 +- Lib/test/decimaltestdata/ddCopySign.decTest | 2 +- Lib/test/decimaltestdata/ddDivide.decTest | 2 +- Lib/test/decimaltestdata/ddDivideInt.decTest | 2 +- Lib/test/decimaltestdata/ddEncode.decTest | 5 +- Lib/test/decimaltestdata/ddFMA.decTest | 30 +- Lib/test/decimaltestdata/ddInvert.decTest | 2 +- Lib/test/decimaltestdata/ddLogB.decTest | 2 +- Lib/test/decimaltestdata/ddMax.decTest | 2 +- Lib/test/decimaltestdata/ddMaxMag.decTest | 2 +- Lib/test/decimaltestdata/ddMin.decTest | 2 +- Lib/test/decimaltestdata/ddMinMag.decTest | 2 +- Lib/test/decimaltestdata/ddMinus.decTest | 2 +- Lib/test/decimaltestdata/ddMultiply.decTest | 89 ++- Lib/test/decimaltestdata/ddNextMinus.decTest | 2 +- Lib/test/decimaltestdata/ddNextPlus.decTest | 2 +- Lib/test/decimaltestdata/ddNextToward.decTest | 2 +- Lib/test/decimaltestdata/ddOr.decTest | 2 +- Lib/test/decimaltestdata/ddPlus.decTest | 2 +- Lib/test/decimaltestdata/ddQuantize.decTest | 2 +- Lib/test/decimaltestdata/ddReduce.decTest | 2 +- Lib/test/decimaltestdata/ddRemainder.decTest | 15 +- .../decimaltestdata/ddRemainderNear.decTest | 16 +- Lib/test/decimaltestdata/ddRotate.decTest | 2 +- .../decimaltestdata/ddSameQuantum.decTest | 2 +- Lib/test/decimaltestdata/ddScaleB.decTest | 2 +- Lib/test/decimaltestdata/ddShift.decTest | 2 +- Lib/test/decimaltestdata/ddSubtract.decTest | 2 +- Lib/test/decimaltestdata/ddToIntegral.decTest | 2 +- Lib/test/decimaltestdata/ddXor.decTest | 2 +- Lib/test/decimaltestdata/decDouble.decTest | 2 +- Lib/test/decimaltestdata/decQuad.decTest | 2 +- Lib/test/decimaltestdata/decSingle.decTest | 2 +- Lib/test/decimaltestdata/divide.decTest | 2 +- Lib/test/decimaltestdata/divideint.decTest | 2 +- Lib/test/decimaltestdata/dqAbs.decTest | 2 +- Lib/test/decimaltestdata/dqAdd.decTest | 2 +- Lib/test/decimaltestdata/dqAnd.decTest | 2 +- Lib/test/decimaltestdata/dqBase.decTest | 2 +- Lib/test/decimaltestdata/dqCanonical.decTest | 2 +- Lib/test/decimaltestdata/dqClass.decTest | 2 +- Lib/test/decimaltestdata/dqCompare.decTest | 2 +- Lib/test/decimaltestdata/dqCompareSig.decTest | 2 +- .../decimaltestdata/dqCompareTotal.decTest | 2 +- .../decimaltestdata/dqCompareTotalMag.decTest | 2 +- Lib/test/decimaltestdata/dqCopy.decTest | 2 +- Lib/test/decimaltestdata/dqCopyAbs.decTest | 2 +- Lib/test/decimaltestdata/dqCopyNegate.decTest | 2 +- Lib/test/decimaltestdata/dqCopySign.decTest | 2 +- Lib/test/decimaltestdata/dqDivide.decTest | 2 +- Lib/test/decimaltestdata/dqDivideInt.decTest | 2 +- Lib/test/decimaltestdata/dqEncode.decTest | 9 +- Lib/test/decimaltestdata/dqFMA.decTest | 27 +- Lib/test/decimaltestdata/dqInvert.decTest | 2 +- Lib/test/decimaltestdata/dqLogB.decTest | 2 +- Lib/test/decimaltestdata/dqMax.decTest | 2 +- Lib/test/decimaltestdata/dqMaxMag.decTest | 2 +- Lib/test/decimaltestdata/dqMin.decTest | 2 +- Lib/test/decimaltestdata/dqMinMag.decTest | 2 +- Lib/test/decimaltestdata/dqMinus.decTest | 2 +- Lib/test/decimaltestdata/dqMultiply.decTest | 130 ++++- Lib/test/decimaltestdata/dqNextMinus.decTest | 2 +- Lib/test/decimaltestdata/dqNextPlus.decTest | 2 +- Lib/test/decimaltestdata/dqNextToward.decTest | 2 +- Lib/test/decimaltestdata/dqOr.decTest | 2 +- Lib/test/decimaltestdata/dqPlus.decTest | 2 +- Lib/test/decimaltestdata/dqQuantize.decTest | 2 +- Lib/test/decimaltestdata/dqReduce.decTest | 2 +- Lib/test/decimaltestdata/dqRemainder.decTest | 13 +- .../decimaltestdata/dqRemainderNear.decTest | 15 +- Lib/test/decimaltestdata/dqRotate.decTest | 2 +- .../decimaltestdata/dqSameQuantum.decTest | 2 +- Lib/test/decimaltestdata/dqScaleB.decTest | 2 +- Lib/test/decimaltestdata/dqShift.decTest | 2 +- Lib/test/decimaltestdata/dqSubtract.decTest | 2 +- Lib/test/decimaltestdata/dqToIntegral.decTest | 2 +- Lib/test/decimaltestdata/dqXor.decTest | 2 +- Lib/test/decimaltestdata/dsBase.decTest | 5 +- Lib/test/decimaltestdata/dsEncode.decTest | 5 +- Lib/test/decimaltestdata/exp.decTest | 2 +- Lib/test/decimaltestdata/fma.decTest | 2 +- Lib/test/decimaltestdata/inexact.decTest | 2 +- Lib/test/decimaltestdata/invert.decTest | 2 +- Lib/test/decimaltestdata/ln.decTest | 2 +- Lib/test/decimaltestdata/log10.decTest | 2 +- Lib/test/decimaltestdata/logb.decTest | 2 +- Lib/test/decimaltestdata/max.decTest | 2 +- Lib/test/decimaltestdata/maxmag.decTest | 2 +- Lib/test/decimaltestdata/min.decTest | 2 +- Lib/test/decimaltestdata/minmag.decTest | 2 +- Lib/test/decimaltestdata/minus.decTest | 2 +- Lib/test/decimaltestdata/multiply.decTest | 2 +- Lib/test/decimaltestdata/nextminus.decTest | 2 +- Lib/test/decimaltestdata/nextplus.decTest | 2 +- Lib/test/decimaltestdata/nexttoward.decTest | 2 +- Lib/test/decimaltestdata/or.decTest | 2 +- Lib/test/decimaltestdata/plus.decTest | 2 +- Lib/test/decimaltestdata/power.decTest | 2 +- Lib/test/decimaltestdata/powersqrt.decTest | 2 +- Lib/test/decimaltestdata/quantize.decTest | 2 +- .../decimaltestdata/randomBound32.decTest | 2 +- Lib/test/decimaltestdata/randoms.decTest | 2 +- Lib/test/decimaltestdata/reduce.decTest | 2 +- Lib/test/decimaltestdata/remainder.decTest | 2 +- .../decimaltestdata/remainderNear.decTest | 14 +- Lib/test/decimaltestdata/rescale.decTest | 2 +- Lib/test/decimaltestdata/rotate.decTest | 2 +- Lib/test/decimaltestdata/rounding.decTest | 2 +- Lib/test/decimaltestdata/samequantum.decTest | 2 +- Lib/test/decimaltestdata/scaleb.decTest | 2 +- Lib/test/decimaltestdata/shift.decTest | 2 +- Lib/test/decimaltestdata/squareroot.decTest | 2 +- Lib/test/decimaltestdata/subtract.decTest | 2 +- Lib/test/decimaltestdata/testall.decTest | 2 +- Lib/test/decimaltestdata/tointegral.decTest | 2 +- Lib/test/decimaltestdata/tointegralx.decTest | 2 +- Lib/test/decimaltestdata/xor.decTest | 2 +- Lib/test/test_decimal.py | 1 + Lib/test/test_doctest.py | 1 + Lib/test/test_funcattrs.py | 12 + Lib/trace.py | 2 + Modules/posixmodule.c | 4 + Objects/cellobject.c | 7 +- Python/ast.c | 2 + 157 files changed, 865 insertions(+), 494 deletions(-) create mode 100644 Demo/tkinter/guido/brownian2.py diff --git a/Demo/tkinter/guido/brownian2.py b/Demo/tkinter/guido/brownian2.py new file mode 100644 index 00000000000..281a645b68a --- /dev/null +++ b/Demo/tkinter/guido/brownian2.py @@ -0,0 +1,55 @@ +# Brownian motion -- an example of a NON multi-threaded Tkinter program ;) +# By Michele Simoniato, inspired by brownian.py + +from Tkinter import * +import random +import sys + +WIDTH = 400 +HEIGHT = 300 +SIGMA = 10 +BUZZ = 2 +RADIUS = 2 +LAMBDA = 10 +FILL = 'red' + +stop = 0 # Set when main loop exits +root = None # main window + +def particle(canvas): # particle = iterator over the moves + r = RADIUS + x = random.gauss(WIDTH/2.0, SIGMA) + y = random.gauss(HEIGHT/2.0, SIGMA) + p = canvas.create_oval(x-r, y-r, x+r, y+r, fill=FILL) + while not stop: + dx = random.gauss(0, BUZZ) + dy = random.gauss(0, BUZZ) + try: + canvas.move(p, dx, dy) + except TclError: + break + else: + yield None + +def move(particle): # move the particle at random time + particle.next() + dt = random.expovariate(LAMBDA) + root.after(int(dt*1000), move, particle) + +def main(): + global root, stop + root = Tk() + canvas = Canvas(root, width=WIDTH, height=HEIGHT) + canvas.pack(fill='both', expand=1) + np = 30 + if sys.argv[1:]: + np = int(sys.argv[1]) + for i in range(np): # start the dance + move(particle(canvas)) + try: + root.mainloop() + finally: + stop = 1 + +if __name__ == '__main__': + main() diff --git a/Doc/library/os.rst b/Doc/library/os.rst index a5507391644..043624451af 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -597,14 +597,7 @@ platforms. For descriptions of their availability and use, consult .. data:: O_BINARY - - Option for the *flag* argument to the :func:`open` function. This can be - bit-wise OR'd together with those listed above. Availability: Windows. - - .. % XXX need to check on the availability of this one. - - -.. data:: O_NOINHERIT + O_NOINHERIT O_SHORT_LIVED O_TEMPORARY O_RANDOM @@ -615,6 +608,15 @@ platforms. For descriptions of their availability and use, consult bit-wise OR'd together. Availability: Windows. +.. data:: O_DIRECT + O_DIRECTORY + O_NOFOLLOW + O_NOATIME + + Options for the *flag* argument to the :func:`open` function. These are + GNU extensions and not present if they are not defined by the C library. + + .. data:: SEEK_SET SEEK_CUR SEEK_END diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 5ac32df2df3..d2604738ae6 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -189,7 +189,12 @@ Instances of the :class:`Popen` class have the following methods: communicate() returns a tuple (stdout, stderr). - .. note:: + Note that if you want to send data to the process's stdin, you need to create + the Popen object with ``stdin=PIPE``. Similarly, to get anything other than + ``None`` in the result tuple, you need to give ``stdout=PIPE`` and/or + ``stderr=PIPE`` too. + +.. note:: The data read is buffered in memory, so do not use this method if the data size is large or unlimited. diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index b1315c0e7d9..7703ad93376 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -804,8 +804,9 @@ tools which support interactive reporting while tests are being run. Called when the test case *test* raises an unexpected exception *err* is a tuple of the form returned by :func:`sys.exc_info`: ``(type, value, traceback)``. - The default implementation appends ``(test, err)`` to the instance's ``errors`` - attribute. + The default implementation appends a tuple ``(test, formatted_err)`` to the + instance's ``errors`` attribute, where *formatted_err* is a formatted + traceback derived from *err*. .. method:: TestResult.addFailure(test, err) @@ -813,8 +814,9 @@ tools which support interactive reporting while tests are being run. Called when the test case *test* signals a failure. *err* is a tuple of the form returned by :func:`sys.exc_info`: ``(type, value, traceback)``. - The default implementation appends ``(test, err)`` to the instance's - ``failures`` attribute. + The default implementation appends a tuple ``(test, formatted_err)`` to the + instance's ``failures`` attribute, where *formatted_err* is a formatted + traceback derived from *err*. .. method:: TestResult.addSuccess(test) diff --git a/Doc/library/xml.dom.rst b/Doc/library/xml.dom.rst index e13999cd1ca..d75db2cdca0 100644 --- a/Doc/library/xml.dom.rst +++ b/Doc/library/xml.dom.rst @@ -29,11 +29,14 @@ representation for XML data. The Document Object Model is being defined by the W3C in stages, or "levels" in their terminology. The Python mapping of the API is substantially based on the -DOM Level 2 recommendation. The mapping of the Level 3 specification, currently -only available in draft form, is being developed by the `Python XML Special -Interest Group `_ as part of the `PyXML -package `_. Refer to the documentation bundled -with that package for information on the current state of DOM Level 3 support. +DOM Level 2 recommendation. + +.. XXX PyXML is dead... +.. The mapping of the Level 3 specification, currently + only available in draft form, is being developed by the `Python XML Special + Interest Group `_ as part of the `PyXML + package `_. Refer to the documentation bundled + with that package for information on the current state of DOM Level 3 support. .. % What if your needs are somewhere between SAX and the DOM? Perhaps .. % you cannot afford to load the entire tree in memory but you find the @@ -74,10 +77,6 @@ implementations are free to support the strict mapping from IDL). See section `Document Object Model (DOM) Level 1 Specification `_ The W3C recommendation for the DOM supported by :mod:`xml.dom.minidom`. - `PyXML `_ - Users that require a full-featured implementation of DOM should use the PyXML - package. - `Python Language Mapping Specification `_ This specifies the mapping from OMG IDL to Python. @@ -364,8 +363,9 @@ All of the components of an XML document are subclasses of :class:`Node`. .. method:: Node.appendChild(newChild) - Add a new child node to this node at the end of the list of children, returning - *newChild*. + Add a new child node to this node at the end of the list of + children, returning *newChild*. If the node was already in + in the tree, it is removed first. .. method:: Node.insertBefore(newChild, refChild) diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index 4d527165de5..3415c1ba431 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -872,6 +872,10 @@ Build and C API Changes Changes to Python's build process and to the C API include: +* Python 2.6 can be built with Microsoft Visual Studio 2008. + See the :file:`PCbuild9` directory for the build files. + (Implemented by Christian Heimes.) + * The BerkeleyDB module now has a C API object, available as ``bsddb.db.api``. This object can be used by other C extensions that wish to use the :mod:`bsddb` module for their own purposes. diff --git a/Lib/decimal.py b/Lib/decimal.py index faf9bf71d90..7842cb25071 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 - 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._is_special = True + m = _parser(value) + if m is None: + if context is None: + context = getcontext() return context._raise_error(ConversionSyntax, - "Invalid literal for Decimal: %r" % value) + "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._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 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,6 +5197,47 @@ ExtendedContext = Context( ) +##### crud for parsing strings ############################################# +import re + +# 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]. + +import re +_parser = re.compile(r""" # A numeric string consists of: +# \s* + (?P[-+])? # an optional sign, followed by either... + ( + (?=\d|\.\d) # ...a number (with at least one digit) + (?P\d*) # consisting of a (possibly empty) integer part + (\.(?P\d*))? # followed by an optional fractional part + (E(?P[-+]?\d+))? # followed by an optional exponent, or... + | + Inf(inity)? # ...an infinity, or... + | + (?Ps)? # ...an (optionally signaling) + NaN # NaN + (?P\d*) # with (possibly empty) diagnostic information. + ) +# \s* + $ +""", re.VERBOSE | re.IGNORECASE).match + +del re + + ##### Useful Constants (internal use only) ################################ # Reusable defaults @@ -5271,76 +5254,6 @@ Dec_n2 = Decimal(-2) 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. - -_parser = re.compile(r""" -# \s* - (?P[-+])? - ( - (?P\d+) (\. (?P\d*))? - | - \. (?P\d+) - ) - ([eE](?P[-+]? \d+))? -# \s* - $ -""", re.VERBOSE).match # Uncomment the \s* to allow leading or trailing spaces. - -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) - - if m.group('sign') == "-": - sign = 1 - else: - sign = 0 - - exp = m.group('exp') - if exp is None: - exp = 0 - else: - exp = int(exp) - - 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__': import doctest, sys diff --git a/Lib/doctest.py b/Lib/doctest.py index eee2f519dbc..5b1807301af 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 ed4c46e7d8c..39f2dca5a14 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 3460aa4cd25..8db222a1b95 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 18ba8817cf8..90490a51ebe 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 de0b8138bce..58ce91c4b5a 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 eca0cfb2776..48e27c0ce76 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 77a22e3a598..61ad548a10e 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 2d5e664076d..979cc52264c 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 737293f9c14..ef2914fcc0c 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 a12e614cea6..4a51d7fc34a 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 5d4065d9618..e6edac5fd6e 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 7457552c8bb..447988887c7 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 3e502be4c1b..7cf124c4d57 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 6b20fda580b..ed6089363b7 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 4da662c8f1e..58b7902295c 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 49d89d4e63a..38d511b01a3 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 e5fa38d13ed..850da17ea2b 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 431bce1f85a..ddc8185685a 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 308b9ffab7f..4d659b04814 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 0b1d1f39fe3..8a38f4a3f4f 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 b225d0db822..5f6fba52360 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 388a656e93c..b4895daa081 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 a8bf477e567..b86b8dfa300 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 b19cf6428cd..e93a7496bcb 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 49c68240bce..9d82db71c0e 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 b65f063e091..c60cc380f33 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 b111c9b285d..c2c60985a7e 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 7c834163ff8..36b060e120b 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 1a953f74131..90698941bbf 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 782fe8d12f1..71168415a25 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 16264fc98da..3fa434c55f4 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 946d6801106..bc44b6abe6c 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 2697f59f13c..b4ae74468d5 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 f18fd5ef17c..99a38434fd2 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 5fe600fcece..515f79a5b03 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 dbabc990e06..c43c4604a8e 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 4ba27f71fb3..c77a71e2089 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 cc5ccec0997..9291abce233 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 9fe196b828d..07dfa7abfae 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 01e0ffef3a7..f506ea25d4e 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 97c3b09a6c1..b9b0de57073 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 d01f3c39a08..2bb2641aa81 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 e00751bf487..80e4ac66cb6 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 3a8cdd642be..903ced0d34c 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 962a656acec..0a2b838cbf8 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 234db927b36..8cd52873131 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 71c82e1aaa4..545beebfb4e 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 c7ea7626de4..d805a483804 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 1f3bafd98d3..dfcd3ebfa8c 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 473f2f68bf7..e6294b3b102 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 a396cd146e0..6f7db15b9d0 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 4091f869435..d0b92b51c92 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 2cbe06a126f..f2e80b36a4b 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 89895e90639..b10f5e4e68e 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 1e3e573cba1..438d3471228 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 783fc2bf9a9..78e975054a0 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 d5205b77abf..bdbf6787670 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 4d100695e1c..e9ec66356cf 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 c661fe4c739..aae9b370de7 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 1cb82b4ff3f..ae2bc0853a2 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 dfa17ca983d..1c940f56013 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 01d1f308912..df010acf7b3 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 72238d33f91..256bc984554 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 be3fb34d275..e00d44d75de 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 6cf2f7f4ead..3f2569beff1 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 a6b801ac1f5..e13c3478e04 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 185fbfc4930..a4703f75d57 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 8947280376e..7fccdf163ee 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 43833eac904..36d5e9b0461 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 d4a7c5ad838..f5cec0600b7 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 9461d6b1939..76c10899fe9 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 b8337765bc5..b7688015c59 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 91f4a68759d..427e6dd2eee 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 22ac89c44cc..34a6f3c25d7 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 8f275cdc6fa..902c9370690 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 a84e1d09a4a..1ea6d3194dc 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 953c1e0118d..b5eec63d02a 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 ed3f328d0e9..fcb512bcde0 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 37d7749c2a5..f68fdf92480 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 94ba93c76aa..19161c2f13e 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 baa6d1e6b60..d6cf831411a 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 a00ec1c3049..a3ba64c8911 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 53eb82c13b6..01b27935e77 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 9e34694d93e..1b82be2fd02 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 733acfdd12f..6d5e4b5266c 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 50ac85a3351..bf69938a172 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 a6f85e0fdc5..c87cc8fd712 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 48808168756..e1e3b065681 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 8c0ac45e26a..973c8eb3b83 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 e5349513b2c..0eb677095df 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 60470ea45a7..093edcb21a6 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 5dc5a68c5d3..ad5b7be261d 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 aa8cf2e5388..4c3e1ea6f93 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 183e9dcf2c2..c0690400a75 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 e30fde7d247..14c358ce23e 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 b62b79fbce2..9074ec49863 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 f21813c5658..671cd958452 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 e7264cb396a..acf72666cbf 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 88a3f9debc0..7355cf05939 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 e728ec5b40d..33df91f2875 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 923742c0e2c..d2df184b812 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 ac50a4ad885..449dead51a3 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 61bdbe20d83..d9e9af670c1 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 d0632fd9921..e2fb4ba25bc 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 185ddc7a77e..7e72d4b04af 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 c07ed5a3f81..97256e48526 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 aa4c0ba0e85..d7caa2611d9 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 b61c85a67bf..896e6c839c2 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 19fdeebac86..7bccb1fffc3 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 44ae4d25997..16e247e9af5 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 9841acb42e3..bb033a808ea 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 577f7a43d50..a672206e539 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 88d0b5e1b1b..d7a6a944b4e 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 b14d015e416..012976662e9 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 345e3ebd588..b69507984d3 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 fa9d927ecbf..547ccffceaf 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 e9afc3a091a..f9112860304 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 71f591ab7cd..a6c7ebe868a 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 200580dc9ea..be33158022a 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 01815ee0bbb..6cee16a0e50 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 cb60f57ae58..aa1891a82f7 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 928939e77dd..ace901b6619 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 9af4c0e990e..1df3dfe3fd4 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 78c1e072fd1..69e8644e6c8 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 36e5cbbbc36..6f79f6c7c66 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 a60f1bf553f..1e5511ff0e0 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 7f115adcfed..0d5881d8f64 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 1529aec60b2..a03b8d56437 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 ddce0c9f921..189a687e97a 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 4c92d0c93b8..1a51c265c42 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 cfca91b14ad..fdc1bd87032 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 30597db113c..882f5706a50 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 c5ced5952b6..32dbd537c49 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 d24fbfb37fe..82ca1b0fffb 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 0b1efff24c7..3fa6cff2037 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 0761deaacc9..e77d938d9f8 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 c2a40cc9306..397024ef551 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 2ccff5adf5a..8d7b26e0812 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 338a09c0e38..a1eca3107e1 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 1cbc20e44f1..673aaa485fa 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 ad25e6be038..340515cb174 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 d9bc9f36d08..381216dea6a 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 2ac1b371fef..1f3b03b4cb6 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 98b94790fb7..3c64e64562f 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 3b890973129..02034b4603d 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 bd9caffd6f0..b9b2e6e5569 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 645517a75fc..f6da026c6dd 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 == "": continue + if filename.startswith("ob_ref); + if (op->ob_ref == NULL) + { + PyErr_SetString(PyExc_ValueError, "Cell is empty"); + return NULL; + } + Py_INCREF(op->ob_ref); return op->ob_ref; } diff --git a/Python/ast.c b/Python/ast.c index f3a282861a2..da75975e4cf 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -19,6 +19,7 @@ struct compiling { char *c_encoding; /* source encoding */ PyArena *c_arena; /* arena for allocating memeory */ + const char *c_filename; /* filename */ }; static asdl_seq *seq_for_testlist(struct compiling *, const node *); @@ -226,6 +227,7 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, c.c_encoding = "utf-8"; } c.c_arena = arena; + c.c_filename = filename; k = 0; switch (TYPE(n)) {