decimal.py revision 61992efc4bb413ae7a19752215eca5af09be6b6d
17c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Copyright (c) 2004 Python Software Foundation. 27c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# All rights reserved. 37c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Written by Eric Price <eprice at tjhsst.edu> 57c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# and Facundo Batista <facundo at taniquetil.com.ar> 67c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# and Raymond Hettinger <python at rcn.com> 71f34eb17b501687c1251678bcffab9accd432591Fred Drake# and Aahz <aahz at pobox.com> 87c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# and Tim Peters 97c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger""" 127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThis is a Py2.3 implementation of decimal floating point arithmetic based on 137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerthe General Decimal Arithmetic Specification: 147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger www2.hursley.ibm.com/decimal/decarith.html 167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 170ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerand IEEE standard 854-1987: 187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html 207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal floating point has finite precision with arbitrarily large bounds. 227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThe purpose of the module is to support arithmetic using familiar 247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"schoolhouse" rules and to avoid the some of tricky representation 257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerissues associated with binary floating point. The package is especially 267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingeruseful for financial applications or for contexts where users have 277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerexpectations that are at odds with binary floating point (for instance, 287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerin binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead 297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerof the expected Decimal("0.00") returned by decimal floating point). 307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerHere are some examples of using the decimal module: 327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> from decimal import * 34bd7f76dd04780304c397323ae994092ce759d5a2Raymond Hettinger>>> setcontext(ExtendedContext) 357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(0) 367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("0") 377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("1") 387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("1") 397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("-.0123") 407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("-0.0123") 417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(123456) 427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("123456") 437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("123.45e12345678901234567890") 447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("1.2345E+12345678901234567892") 457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("1.33") + Decimal("1.27") 467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("2.60") 477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41") 487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("-2.20") 497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> dig = Decimal(1) 507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3) 517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333 527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> getcontext().prec = 18 537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3) 547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333333333333 557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig.sqrt() 567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1 577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3).sqrt() 587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1.73205080756887729 597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3) ** 123 607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger4.85192780976896427E+58 617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> inf = Decimal(1) / Decimal(0) 627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print inf 637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity 647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> neginf = Decimal(-1) / Decimal(0) 657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf 667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity 677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf + inf 687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN 697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf * inf 707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity 717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0 727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity 73bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> getcontext().traps[DivisionByZero] = 1 747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0 757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last): 767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDivisionByZero: x / 0 807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c = Context() 81bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0 825aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation] 837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0 847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c.divide(Decimal(0), Decimal(0)) 857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("NaN") 86bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 1 875aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation] 887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1 895aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0 905aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation] 917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0 927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0)) 937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last): 947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 975aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond HettingerInvalidOperation: 0 / 0 985aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation] 997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1 1005aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0 101bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0 1027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0)) 1037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN 1045aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation] 1057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1 1067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> 1077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger""" 1087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger__all__ = [ 1107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Two major classes 1117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'Decimal', 'Context', 1127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Contexts 1149ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger 'DefaultContext', 'BasicContext', 'ExtendedContext', 1157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Exceptions 117d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger 'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero', 118d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger 'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow', 1197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Constants for use in setting up contexts 1217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING', 1227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 1237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Functions for manipulating contexts 1250ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger 'setcontext', 'getcontext' 1267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger] 1277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport threading 1297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport copy 1307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport operator 1317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Rounding 1330ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_DOWN = 'ROUND_DOWN' 1340ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_UP = 'ROUND_HALF_UP' 1350ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_EVEN = 'ROUND_HALF_EVEN' 1360ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_CEILING = 'ROUND_CEILING' 1370ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_FLOOR = 'ROUND_FLOOR' 1380ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_UP = 'ROUND_UP' 1390ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_DOWN = 'ROUND_HALF_DOWN' 1407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1419ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger#Rounding decision (not part of the public API) 1420ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerNEVER_ROUND = 'NEVER_ROUND' # Round in division (non-divmod), sqrt ONLY 1430ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerALWAYS_ROUND = 'ALWAYS_ROUND' # Every operation rounds at end. 1447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Errors 1467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DecimalException(ArithmeticError): 1485aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger """Base exception class. 1497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Used exceptions derive from this. 1517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If an exception derives from another exception besides this (such as 1527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Underflow (Inexact, Rounded, Subnormal) that indicates that it is only 1537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger called if the others are present. This isn't actually used for 1547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger anything, though. 1557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger handle -- Called when context._raise_error is called and the 1577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger trap_enabler is set. First argument is self, second is the 1587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context. More arguments can be given, those being after 1597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the explanation in _raise_error (For example, 1607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(NewError, '(-x)!', self._sign) would 1617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger call NewError().handle(context, self._sign).) 1627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger To define a new exception, it should be sufficient to have it derive 1647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger from DecimalException. 1657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 1677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger pass 1687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Clamped(DecimalException): 1717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Exponent of a 0 changed to fit bounds. 1727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals clamped if the exponent of a result has been 1747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger altered in order to fit the constraints of a specific concrete 1757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger representation. This may occur when the exponent of a zero result would 1767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger be outside the bounds of a representation, or when a large normal 1777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger number would have an encoded exponent that cannot be represented. In 1787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger this latter case, the exponent is reduced to fit and the corresponding 1797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger number of zero digits are appended to the coefficient ("fold-down"). 1807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidOperation(DecimalException): 1847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """An invalid operation was performed. 1857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Various bad things cause this: 1877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Something creates a signaling NaN 1897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -INF + INF 1907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 * (+-)INF 1917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (+-)INF / (+-)INF 1927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x % 0 1937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (+-)INF % x 1947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x._rescale( non-integer ) 1957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sqrt(-x) , x > 0 1967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 ** 0 1977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x ** (non-integer) 1987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x ** (+-)INF 1997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger An operand is invalid 2007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if args: 2037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if args[0] == 1: #sNaN, must drop 's' but keep diagnostics 2047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (args[1]._sign, args[1]._int, 'n') ) 2057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return NaN 2067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass ConversionSyntax(InvalidOperation): 2087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Trying to convert badly formed string. 2097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if an string is being 2117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger converted to a number and it does not conform to the numeric string 2127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger syntax. The result is [0,qNaN]. 2137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (0, (0,), 'n') #Passed to something which uses a tuple. 2177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionByZero(DecimalException, ZeroDivisionError): 2197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Division by 0. 2207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals division-by-zero if division of a finite number 2227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger by zero was attempted (during a divide-integer or divide operation, or a 2237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger power operation with negative right-hand operand), and the dividend was 2247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger not zero. 2257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result of the operation is [sign,inf], where sign is the exclusive 2277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger or of the signs of the operands for divide, or is 1 for an odd power of 2287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -0, for power. 2297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, sign, double = None, *args): 2327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if double is not None: 2337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Infsign[sign],)*2 2347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 2357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionImpossible(InvalidOperation): 2377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Cannot perform the division adequately. 2387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if the integer result of a 2407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger divide-integer or remainder operation had too many digits (would be 2417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger longer than precision). The result is [0,qNaN]. 2427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (NaN, NaN) 2467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionUndefined(InvalidOperation, ZeroDivisionError): 2487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Undefined result of division. 2497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if division by zero was 2517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger attempted (during a divide-integer, divide, or remainder operation), and 2527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the dividend is also zero. The result is [0,qNaN]. 2537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, tup=None, *args): 2567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if tup is not None: 2577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (NaN, NaN) #for 0 %0, 0 // 0 2587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return NaN 2597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Inexact(DecimalException): 2617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Had to round, losing information. 2627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals inexact whenever the result of an operation is 2647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger not exact (that is, it needed to be rounded and any discarded digits 2657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger were non-zero), or if an overflow or underflow condition occurs. The 2667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result in all cases is unchanged. 2677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The inexact signal may be tested (or trapped) to determine if a given 2697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation (or sequence of operations) was inexact. 2707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2715aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger pass 2727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidContext(InvalidOperation): 2747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Invalid context. Unknown rounding, for example. 2757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if an invalid context was 2777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger detected during an operation. This can occur if contexts are not checked 2787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger on creation and either the precision exceeds the capability of the 2797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger underlying concrete representation or an unknown or unsupported rounding 2807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger was specified. These aspects of the context need only be checked when 2817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the values are required to be used. The result is [0,qNaN]. 2827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return NaN 2867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Rounded(DecimalException): 2887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Number got rounded (not necessarily changed during rounding). 2897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals rounded whenever the result of an operation is 2917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounded (that is, some zero or non-zero digits were discarded from the 2927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger coefficient), or if an overflow or underflow condition occurs. The 2937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result in all cases is unchanged. 2947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The rounded signal may be tested (or trapped) to determine if a given 2967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation (or sequence of operations) caused a loss of precision. 2977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2985aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger pass 2997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Subnormal(DecimalException): 3017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Exponent < Emin before rounding. 3027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals subnormal whenever the result of a conversion or 3047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation is subnormal (that is, its adjusted exponent is less than 3057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Emin, before any rounding). The result in all cases is unchanged. 3067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The subnormal signal may be tested (or trapped) to determine if a given 3087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger or operation (or sequence of operations) yielded a subnormal result. 3097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger pass 3117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Overflow(Inexact, Rounded): 3137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Numerical overflow. 3147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals overflow if the adjusted exponent of a result 3167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (from a conversion or from an operation that is not an attempt to divide 3177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger by zero), after rounding, would be greater than the largest value that 3187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger can be handled by the implementation (the value Emax). 3197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result depends on the rounding mode: 3217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger For round-half-up and round-half-even (and for round-half-down and 3237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger round-up, if implemented), the result of the operation is [sign,inf], 3247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger where sign is the sign of the intermediate result. For round-down, the 3257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result is the largest finite number that can be represented in the 3267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger current precision, with the sign of the intermediate result. For 3277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger round-ceiling, the result is the same as for round-down if the sign of 3287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the intermediate result is 1, or is [0,inf] otherwise. For round-floor, 3297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the result is the same as for round-down if the sign of the intermediate 3307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded 3317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger will also be raised. 3327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, sign, *args): 3357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN, 3367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ROUND_HALF_DOWN, ROUND_UP): 3377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 3387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sign == 0: 3397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_CEILING: 3407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 3417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal((sign, (9,)*context.prec, 3427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.Emax-context.prec+1)) 3437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sign == 1: 3447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_FLOOR: 3457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 3467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (sign, (9,)*context.prec, 3477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.Emax-context.prec+1)) 3487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Underflow(Inexact, Rounded, Subnormal): 3517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Numerical underflow with result rounded to 0. 3527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals underflow if a result is inexact and the 3547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjusted exponent of the result would be smaller (more negative) than 3557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the smallest value that can be handled by the implementation (the value 3567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Emin). That is, the result is both inexact and subnormal. 3577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result after an underflow will be a subnormal number rounded, if 3597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger necessary, so that its exponent is not less than Etiny. This may result 3607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger in 0 with the sign of the intermediate result and an exponent of Etiny. 3617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger In all cases, Inexact, Rounded, and Subnormal will also be raised. 3637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3655aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# List of public traps and flags 366fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded, 3675aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger Underflow, InvalidOperation, Subnormal] 3687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3695aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# Map conditions (per the spec) to signals 3705aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger_condition_map = {ConversionSyntax:InvalidOperation, 3715aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger DivisionImpossible:InvalidOperation, 3725aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger DivisionUndefined:InvalidOperation, 3735aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger InvalidContext:InvalidOperation} 3747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Context Functions ####################################### 3767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 377ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# The getcontext() and setcontext() function manage access to a thread-local 378ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# current context. Py2.4 offers direct support for thread locals. If that 379ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# is not available, use threading.currentThread() which is slower but will 380ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# work for older Pythons. 381ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 382ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingertry: 383ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger threading.local 384ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 385ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerexcept AttributeError: 386ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 387ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger #To fix reloading, force it to create a new context 388ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger #Old contexts have different exceptions in their dicts, making problems. 389ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if hasattr(threading.currentThread(), '__decimal_context__'): 390ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger del threading.currentThread().__decimal_context__ 391ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 392ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def setcontext(context): 393ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Set this thread's context to context.""" 394ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if context in (DefaultContext, BasicContext, ExtendedContext): 39561992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger context = copy.deepcopy(context) 39661992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger context.clear_flags() 3977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger threading.currentThread().__decimal_context__ = context 398ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 399ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def getcontext(): 400ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Returns this thread's context. 401ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 402ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger If this thread does not yet have a context, returns 403ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger a new context and sets this thread's context. 404ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger New contexts are copies of DefaultContext. 405ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """ 406ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger try: 407ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return threading.currentThread().__decimal_context__ 408ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger except AttributeError: 409ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger context = Context() 410ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger threading.currentThread().__decimal_context__ = context 411ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return context 412ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 413ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerelse: 414ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 415ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger local = threading.local() 416ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 417ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def getcontext(_local=local): 418ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Returns this thread's context. 419ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 420ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger If this thread does not yet have a context, returns 421ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger a new context and sets this thread's context. 422ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger New contexts are copies of DefaultContext. 423ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """ 424ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger try: 425ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return _local.__decimal_context__ 426ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger except AttributeError: 427ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger context = Context() 428ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger _local.__decimal_context__ = context 429ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return context 430ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 431ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def setcontext(context, _local=local): 432ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Set this thread's context to context.""" 433ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if context in (DefaultContext, BasicContext, ExtendedContext): 43461992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger context = copy.deepcopy(context) 43561992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger context.clear_flags() 436ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger _local.__decimal_context__ = context 437ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 438ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger del threading, local # Don't contaminate the namespace 4397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Decimal class ########################################### 4427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Decimal(object): 4447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Floating point class for decimal arithmetic.""" 4457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __slots__ = ('_exp','_int','_sign') 4477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __init__(self, value="0", context=None): 4497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Create a decimal point instance. 4507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal('3.14') # string input 4527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3.14") 4537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal((0, (3, 1, 4), -2)) # tuple input (sign, digit_tuple, exponent) 4547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3.14") 4557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal(314) # int or long 4567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("314") 4577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal(Decimal(314)) # another decimal instance 4587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("314") 4597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 4607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 4617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 4627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(value, (int,long)): 4647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger value = str(value) 4657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # String? 4677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # REs insist on real strings, so we can too. 4687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(value, basestring): 4690ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger if _isinfinity(value): 4707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._exp = 'F' 4717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._int = (0,) 4720ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger sign = _isinfinity(value) 4737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sign == 1: 4747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign = 0 4757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 4767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign = 1 4777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 4780ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger if _isnan(value): 4790ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger sig, sign, diag = _isnan(value) 4807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(diag) > context.prec: #Diagnostic info too long 4817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign, self._int, self._exp = \ 4827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(ConversionSyntax) 4837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 4847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sig == 1: 4857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._exp = 'n' #qNaN 4867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: #sig == 2 4877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._exp = 'N' #sNaN 4887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign = sign 4897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._int = tuple(map(int, diag)) #Diagnostic info 4907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 491d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger try: 492d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger self._sign, self._int, self._exp = _string2exact(value) 493d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger except ValueError: 494d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger self._sign, self._int, self._exp = context._raise_error(ConversionSyntax) 4957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 4967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # tuple/list conversion (possibly from as_tuple()) 4987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(value, (list,tuple)): 4997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(value) != 3: 5007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raise ValueError, 'Invalid arguments' 5017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if value[0] not in [0,1]: 5027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raise ValueError, 'Invalid sign' 5037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for digit in value[1]: 5047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not isinstance(digit, (int,long)) or digit < 0: 5057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raise ValueError, "The second value in the tuple must be composed of non negative integer elements." 5067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign = value[0] 5087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._int = tuple(value[1]) 5097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if value[2] in ('F','n','N'): 5107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._exp = value[2] 5117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 5127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._exp = int(value[2]) 5137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 5147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Turn an intermediate value back to Decimal() 5167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(value, _WorkRep): 5177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if value.sign == 1: 5187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign = 0 5197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 5207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign = 1 5217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._int = tuple(value.int) 5227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._exp = int(value.exp) 5237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 5247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(value, Decimal): 5264e0e1b6a540e664e89739456db4c706701bf062bTim Peters self._exp = value._exp 5274e0e1b6a540e664e89739456db4c706701bf062bTim Peters self._sign = value._sign 5284e0e1b6a540e664e89739456db4c706701bf062bTim Peters self._int = value._int 5294e0e1b6a540e664e89739456db4c706701bf062bTim Peters return 5307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 531bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if isinstance(value, float): 532bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger raise TypeError("Cannot convert float to Decimal. " + 533bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger "First convert the float to a string") 534bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger 535bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger raise TypeError("Cannot convert %r" % value) 5367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _convert_other(self, other): 5387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Convert other to Decimal. 5397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Verifies that it's ok to use in an implicit construction. 5417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 5427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(other, Decimal): 5437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other 5447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(other, (int, long)): 5457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = Decimal(other) 5467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other 5477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raise TypeError, "You can interact Decimal only with int, long or Decimal data types." 5497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isnan(self): 5517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is not actually one. 5527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 if a number 5547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 if NaN 5557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2 if sNaN 5567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 5577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp == 'n': 5587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 5597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif self._exp == 'N': 5607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 2 5617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 5627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isinfinity(self): 5647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is infinite 5657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 if finite or not a number 5677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 if +INF 5687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -1 if -INF 5697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 5707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp == 'F': 5717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 5727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 5737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 5747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 5757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _check_nans(self, other = None, context=None): 5777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is not actually one. 5787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self, other are sNaN, signal 5807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self, other are NaN return nan 5817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 5827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Done before operations. 5847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 5857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 5867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 5877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isnan() == 2: 5897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'sNaN', 5907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1, self) 5917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other is not None and other._isnan() == 2: 5927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'sNaN', 5937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1, other) 5947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isnan(): 5957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self 5967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other is not None and other._isnan(): 5977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other 5987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 5997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __nonzero__(self): 6017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Is the number non-zero? 6027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 if self == 0 6047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 if self != 0 6057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 6067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(self._exp, str): 6077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 6087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._int != (0,)*len(self._int) 6097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __cmp__(self, other, context=None): 6117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 6127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 6137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 6147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(other, context) 6167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 6177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 6187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self and not other: 6207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 #If both 0, sign comparison isn't certain. 6217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #If different signs, neg one is less 6237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._sign < self._sign: 6247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 6257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign < other._sign: 6267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 6277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # INF = INF 6297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity() and other._isinfinity(): 6307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 6317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 6327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (-1)**self._sign 6337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._isinfinity(): 6347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -((-1)**other._sign) 6357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self.adjusted() == other.adjusted() and \ 6377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._int + (0,)*(self._exp - other._exp) == \ 6387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other._int + (0,)*(other._exp - self._exp): 6397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 #equal, except in precision. ([0]*(-x) = []) 6407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif self.adjusted() > other.adjusted() and self._int[0] != 0: 6417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (-1)**self._sign 6427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif self.adjusted < other.adjusted() and other._int[0] != 0: 6437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -((-1)**self._sign) 6447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 6467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding(ROUND_UP) #round away from 0 6477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = context._ignore_all_flags() 6497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger res = self.__sub__(other, context=context) 6507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(*flags) 6527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.rounding = rounding 6547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not res: 6567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 6577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif res._sign: 6587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 6597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 6607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6610aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger def __eq__(self, other): 6620aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger if not isinstance(other, (Decimal, int, long)): 6630aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger return False 6640aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger return self.__cmp__(other) == 0 6650aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger 6660aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger def __ne__(self, other): 6670aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger if not isinstance(other, (Decimal, int, long)): 6680aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger return True 6690aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger return self.__cmp__(other) != 0 6700aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger 6717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def compare(self, other, context=None): 6727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Compares one to another. 6737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -1 => a < b 6757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 => a = b 6767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 => a > b 6777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN => one is NaN 6787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Like __cmp__, but returns Decimal instances. 6797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 6807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 6817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 6827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 6837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #compare(NaN, NaN) = NaN 6857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(other, context) 6867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 6877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 6887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal(self.__cmp__(other, context)) 6907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __hash__(self): 6927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """x.__hash__() <==> hash(x)""" 6937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Decimal integers must hash the same as the ints 6947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Non-integer decimals are normalized and hashed as strings 6957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Normalization assures that hast(100E-1) == hash(10) 6967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger i = int(self) 6977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self == Decimal(i): 6987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return hash(i) 6997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger assert self.__nonzero__() # '-0' handled by integer case 7007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return hash(str(self.normalize())) 7017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def as_tuple(self): 7037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Represents the number as a triple tuple. 7047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger To show the internals exactly as they are. 7067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 7077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (self._sign, self._int, self._exp) 7087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __repr__(self): 7107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Represents the number as an instance of Decimal.""" 7117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Invariant: eval(repr(d)) == d 7127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 'Decimal("%s")' % str(self) 7137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __str__(self, eng = 0, context=None): 7157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return string representation of the number in scientific notation. 7167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Captures all of the information in the underlying representation. 7187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 7197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isnan(): 7217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger minus = '-'*self._sign 7227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._int == (0,): 7237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger info = '' 7247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 7257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger info = ''.join(map(str, self._int)) 7267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isnan() == 2: 7277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return minus + 'sNaN' + info 7287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return minus + 'NaN' + info 7297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 7307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger minus = '-'*self._sign 7317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return minus + 'Infinity' 7327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 7347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 7357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = map(str, self._int) 7377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger numdigits = len(self._int) 7387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger leftdigits = self._exp + numdigits 7397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if eng and not self: #self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY 7407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp < 0 and self._exp >= -6: #short, no need for e/E 7417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s = '-'*self._sign + '0.' + '0'*(abs(self._exp)) 7427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return s 7437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #exp is closest mult. of 3 >= self._exp 7447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = ((self._exp - 1)// 3 + 1) * 3 7457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp != self._exp: 7467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s = '0.'+'0'*(exp - self._exp) 7477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 7487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s = '0' 7497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp != 0: 7507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.capitals: 7517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s += 'E' 7527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 7537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s += 'e' 7547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp > 0: 7557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s += '+' #0.0e+3, not 0.0e3 7567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s += str(exp) 7577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s = '-'*self._sign + s 7587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return s 7597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if eng: 7607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dotplace = (leftdigits-1)%3+1 7617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjexp = leftdigits -1 - (leftdigits-1)%3 7627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 7637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjexp = leftdigits-1 7647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dotplace = 1 7657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp == 0: 7667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger pass 7677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif self._exp < 0 and adjexp >= 0: 7687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.insert(leftdigits, '.') 7697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif self._exp < 0 and adjexp >= -6: 7707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp[0:0] = ['0'] * int(-leftdigits) 7717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.insert(0, '0.') 7727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 7737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if numdigits > dotplace: 7747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.insert(dotplace, '.') 7757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif numdigits < dotplace: 7767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.extend(['0']*(dotplace-numdigits)) 7777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if adjexp: 7787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not context.capitals: 7797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.append('e') 7807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 7817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.append('E') 7827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if adjexp > 0: 7837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.append('+') 7847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.append(str(adjexp)) 7857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if eng: 7867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while tmp[0:1] == ['0']: 7877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp[0:1] = [] 7887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(tmp) == 0 or tmp[0] == '.' or tmp[0].lower() == 'e': 7897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp[0:0] = ['0'] 7907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 7917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.insert(0, '-') 7927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ''.join(tmp) 7947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_eng_string(self, context=None): 7967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Convert to engineering-type string. 7977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Engineering notation has an exponent which is a multiple of 3, so there 7997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger are up to 3 digits left of the decimal place. 8007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Same rules for when in exponential and when as a value as in __str__. 8027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 8037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 8047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 8057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__str__(eng=1, context=context) 8067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __neg__(self, context=None): 8087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a copy with the sign switched. 8097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds, if it has reason. 8117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 8127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 8137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 8147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(context=context) 8157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 8167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 8177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 8197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # -Decimal('0') is Decimal('0'), not Decimal('-0') 8207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 0 8217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif self._sign: 8227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 0 8237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 8247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 8257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context._rounding_decision == ALWAYS_ROUND: 8267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal((sign, self._int, self._exp))._fix(context=context) 8277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (sign, self._int, self._exp)) 8287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __pos__(self, context=None): 8307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a copy, unless it is a sNaN. 8317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds the number (if more then precision digits) 8337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 8347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 8357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 8367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(context=context) 8377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 8387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 8397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = self._sign 8417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 8427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # + (-0) = 0 8437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 0 8447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context._rounding_decision == ALWAYS_ROUND: 8467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._fix(context=context) 8477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 8487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(self) 8497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._sign = sign 8507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 8517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __abs__(self, round=1, context=None): 8537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the absolute value of self. 8547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the second argument is 0, do not round. 8567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 8577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 8587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 8597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(context=context) 8607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 8617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 8627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not round: 8647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 8657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding_decision(NEVER_ROUND) 8667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 8687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self.__neg__(context=context) 8697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 8707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self.__pos__(context=context) 8717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 8737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __add__(self, other, context=None): 8757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns self + other. 8767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -INF + INF (or the reverse) cause InvalidOperation errors. 8787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 8797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 8807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 8817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 8827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(other, context) 8847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 8857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 8867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 8887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #If both INF, same sign => same as both, opposite => error. 8897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign != other._sign and other._isinfinity(): 8907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, '-INF + INF') 8917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal(self) 8927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._isinfinity(): 8937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal(other) #Can't both be infinity here 8947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger shouldround = context._rounding_decision == ALWAYS_ROUND 8967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = min(self._exp, other._exp) 8987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negativezero = 0 8997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_FLOOR and self._sign != other._sign: 9007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #If the answer is 0, the sign should be negative, in this case. 9017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negativezero = 1 9027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self and not other: 9047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = min(self._sign, other._sign) 9057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if negativezero: 9067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 9077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (sign, (0,), exp)) 9087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 9097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp < other._exp - context.prec-1: 9107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = other._exp - context.prec-1 9117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = other._rescale(exp, watchexp=0, context=context) 9127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 9137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 9147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 9157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not other: 9167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp < self._exp - context.prec-1: 9177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = self._exp - context.prec-1 9187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._rescale(exp, watchexp=0, context=context) 9197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 9207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 9217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 9227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1 = _WorkRep(self) 9247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2 = _WorkRep(other) 9257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1, op2 = _normalize(op1, op2, shouldround, context.prec) 9267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result = _WorkRep() 9287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if op1.sign != op2.sign: 9307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger diff = cmp(abs(op1), abs(op2)) 9317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Equal and opposite 9327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if diff == 0: 9337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp < context.Etiny(): 9347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = context.Etiny() 9357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Clamped) 9367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal((negativezero, (0,), exp)) 9377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if diff < 0: 9387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1, op2 = op2, op1 9397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #OK, now abs(op1) > abs(op2) 9407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if op1.sign == -1: 9417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.sign = -1 9427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.sign, op2.sign = op2.sign, op1.sign 9437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 9447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.sign = 1 9457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #So we know the sign, and op1 > 0. 9467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif op1.sign == -1: 9477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.sign = -1 9487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.sign, op2.sign = (1, 1) 9497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 9507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.sign = 1 9517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Now, op1 > abs(op2) > 0 9527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.int.reverse() 9547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2.int.reverse() 9557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if op2.sign == 1: 9577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.int = resultint = map(operator.add, op1.int, op2.int) 9587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger carry = 0 9597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for i in xrange(len(op1.int)): 9607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = resultint[i] + carry 9617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger carry = 0 9627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if tmp > 9: 9637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger carry = 1 9647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp -= 10 9657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resultint[i] = tmp 9667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if carry: 9677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resultint.append(1) 9687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 9697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.int = resultint = map(operator.sub, op1.int, op2.int) 9707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger loan = 0 9717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for i in xrange(len(op1.int)): 9727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = resultint[i] - loan 9737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger loan = 0 9747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if tmp < 0: 9757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger loan = 1 9767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp += 10 9777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resultint[i] = tmp 9787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger assert not loan 9797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while resultint[-1] == 0: 9817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resultint.pop() 9827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resultint.reverse() 9837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.exp = op1.exp 9857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(result) 9867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 9877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 9887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 9897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __radd__ = __add__ 9917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __sub__(self, other, context=None): 9937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self + (-other)""" 9947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 9957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 9967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 9977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(other, context=context) 9997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 10007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # -Decimal(0) = Decimal(0), which we don't want since 10037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # (-0 - 0 = -0 + (-0) = -0, but -0 + 0 = 0.) 10047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # so we change the sign directly to a copy 10057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal(other) 10067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._sign = 1-tmp._sign 10077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__add__(tmp, context=context) 10097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rsub__(self, other, context=None): 10117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return other + (-self)""" 10127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 10137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 10147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 10157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal(self) 10177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._sign = 1 - tmp._sign 10187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__add__(tmp, context=context) 10197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _increment(self, round=1, context=None): 10217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Special case of add, adding 1eExponent 10227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Since it is common, (rounding, for example) this adds 10247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (sign)*one E self._exp to the number more efficiently than add. 10257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger For example: 10277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal('5.624e10')._increment() == Decimal('5.625e10') 10287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 10297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 10307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 10317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(context=context) 10327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 10337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger L = list(self._int) 10367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger L[-1] += 1 10377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot = len(L)-1 10387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while L[spot] == 10: 10397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger L[spot] = 0 10407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if spot == 0: 10417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger L[0:0] = [1] 10427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 10437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger L[spot-1] += 1 10447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot -= 1 10457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal((self._sign, L, self._exp)) 10467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if round and context._rounding_decision == ALWAYS_ROUND: 10487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 10497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __mul__(self, other, context=None): 10527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self * other. 10537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (+-) INF * 0 (or its reverse) raise InvalidOperation. 10557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 10567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 10577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 10587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 10597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(other, context) 10617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 10627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1064d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger resultsign = self._sign ^ other._sign 10657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 10667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not other: 10677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, '(+-)INF * 0') 10687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[resultsign] 10697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._isinfinity(): 10717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 10727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, '0 * (+-)INF') 10737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[resultsign] 10747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resultexp = self._exp + other._exp 10767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger shouldround = context._rounding_decision == ALWAYS_ROUND 10777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Special case for multiplying by zero 10797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self or not other: 10807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal((resultsign, (0,), resultexp)) 10817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 10827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Fixing in case the exponent is out of bounds 10837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 10847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Special case for multiplying by power of 10 10877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._int == (1,): 10887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal((resultsign, other._int, resultexp)) 10897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 10907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 10917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._int == (1,): 10937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal((resultsign, self._int, resultexp)) 10947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 10957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 10967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1 = list(self._int) 10997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2 = list(other._int) 11007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.reverse() 11017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2.reverse() 11027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Minimize Decimal additions 11037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(op2) > len(op1): 11047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1, op2 = op2, op1 11057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _divmod = divmod 11077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger accumulator = [0]*(len(self._int) + len(other._int)) 11087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for i in xrange(len(op2)): 11097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if op2[i] == 0: 11107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger continue 11117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger mult = op2[i] 11127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger carry = 0 11137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for j in xrange(len(op1)): 11147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger carry, accumulator[i+j] = _divmod( mult * op1[j] + carry 11157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger + accumulator[i+j], 10) 11167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if carry: 11187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger accumulator[i + j + 1] += carry 11197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while not accumulator[-1]: 11207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger accumulator.pop() 11217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger accumulator.reverse() 11227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal( (resultsign, accumulator, resultexp)) 11247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 11257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 11267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __rmul__ = __mul__ 11297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __div__(self, other, context=None): 11317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self / other.""" 11327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._divide(other, context=context) 11337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __truediv__ = __div__ 11347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _divide(self, other, divmod = 0, context=None): 11367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return a / b, to context.prec precision. 11377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger divmod: 11397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 => true division 11407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 => (a //b, a%b) 11417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2 => a //b 11427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3 => a%b 11437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Actually, if divmod is 2 or 3 a tuple is returned, but errors for 11457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger computing the other value are not raised. 11467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 11477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 11487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 11497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 11507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(other, context) 11527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 11537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod: 11547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (ans, ans) 11557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 11567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1158d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger sign = self._sign ^ other._sign 11597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self and not other: 11607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod: 11617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionUndefined, '0 / 0', 1) 11627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionUndefined, '0 / 0') 11637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity() and other._isinfinity(): 11647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not divmod: 11657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF') 11667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 11677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (context._raise_error(InvalidOperation, 11687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger '(+-)INF // (+-)INF'), 11697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(InvalidOperation, 11707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger '(+-)INF % (+-)INF')) 11717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not divmod: 11737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._isinfinity(): 11747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Clamped, 'Division by infinity') 11757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal((sign, (0,), context.Etiny())) 11767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 11777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 11787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #These two have different precision. 11797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 11807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = self._exp - other._exp 11817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp < context.Etiny(): 11827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = context.Etiny() 11837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Clamped, '0e-x / y') 11847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp > context.Emax: 11857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = context.Emax 11867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Clamped, '0e+x / y') 11877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (sign, (0,), exp) ) 11887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not other: 11907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionByZero, 'x / 0', sign) 11917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod: 11927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._isinfinity(): 11937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal((sign, (0,), 0)), Decimal(self)) 11947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 11957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod == 1: 11967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Infsign[sign], 11977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(InvalidOperation, 'INF % x')) 11987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif divmod == 2: 11997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Infsign[sign], NaN) 12007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif divmod == 3: 12017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Infsign[sign], 12027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(InvalidOperation, 'INF % x')) 12037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 12047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside = Decimal(self) 12057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside._exp = min(self._exp, other._exp) 12067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal((sign, (0,), 0)), otherside) 12077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not other: 12097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionByZero, 'divmod(x,0)', 12107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign, 1) 12117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #OK, so neither = 0, INF 12137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger shouldround = context._rounding_decision == ALWAYS_ROUND 12157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #If we're dividing into ints, and self < other, stop. 12177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #self.__abs__(0) does not round. 12187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod and (self.__abs__(0, context) < other.__abs__(0, context)): 12197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod == 1 or divmod == 3: 12217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = min(self._exp, other._exp) 12227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans2 = self._rescale(exp, context=context, watchexp=0) 12237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 12247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans2 = ans2._fix(context=context) 12257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal( (sign, (0,), 0) ), 12267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans2) 12277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif divmod == 2: 12297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Don't round the mod part, if we don't need it. 12307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal( (sign, (0,), 0) ), Decimal(self)) 12317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sign: 12337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = -1 12347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 12357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 12367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjust = 0 12377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1 = _WorkRep(self) 12387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2 = _WorkRep(other) 12397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1, op2, adjust = _adjust_coefficients(op1, op2) 12407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger res = _WorkRep( (sign, [0], (op1.exp - op2.exp)) ) 12417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod and res.exp > context.prec + 1: 12427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionImpossible) 12437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = None 12457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while 1: 12467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while( (len(op2.int) < len(op1.int) and op1.int[0]) or 12477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (len(op2.int) == len(op1.int) and op2.int <= op1.int)): 12487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Meaning, while op2.int < op1.int, when normalized. 12497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger res._increment() 12507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.subtract(op2.int) 12517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if res.exp == 0 and divmod: 12527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(res.int) > context.prec and shouldround: 12537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionImpossible) 12547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside = Decimal(op1) 12557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger frozen = context._ignore_all_flags() 12567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = min(self._exp, other._exp) 12587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside = otherside._rescale(exp, context=context, 12597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger watchexp=0) 12607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(*frozen) 12617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 12627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside = otherside._fix(context=context) 12637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal(res), otherside) 12647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if op1.int == [0]*len(op1.int) and adjust >= 0 and not divmod: 12667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 12677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if (len(res.int) > context.prec) and shouldround: 12687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod: 12697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionImpossible) 12707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger shouldround=1 12717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Really, the answer is a bit higher, so adding a one to 12727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # the end will make sure the rounding is right. 12737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if op1.int != [0]*len(op1.int): 12747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger res.int.append(1) 12757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger res.exp -= 1 12767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 12787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger res.exp -= 1 12797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjust += 1 12807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger res.int.append(0) 12817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.int.append(0) 12827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.exp -= 1 12837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if res.exp == 0 and divmod and (len(op2.int) > len(op1.int) or 12857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (len(op2.int) == len(op1.int) and 12867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2.int > op1.int)): 12877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Solves an error in precision. Same as a previous block. 12887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(res.int) > context.prec and shouldround: 12907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionImpossible) 12917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside = Decimal(op1) 12927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger frozen = context._ignore_all_flags() 12937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = min(self._exp, other._exp) 12957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside = otherside._rescale(exp, context=context) 12967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(*frozen) 12987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal(res), otherside) 13007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(res) 13027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 13037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 13047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 13057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rdiv__(self, other, context=None): 13077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __div__.""" 13087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 13097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__div__(self, context=context) 13107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __rtruediv__ = __rdiv__ 13117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __divmod__(self, other, context=None): 13137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 13147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (self // other, self % other) 13157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 13167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._divide(other, 1, context) 13177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rdivmod__(self, other, context=None): 13197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __divmod__.""" 13207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 13217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__divmod__(self, context=context) 13227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __mod__(self, other, context=None): 13247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 13257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self % other 13267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 13277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 13287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 13297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 13307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(other, context) 13327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 13337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 13347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self and not other: 13367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'x % 0') 13377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._divide(other, 3, context)[1] 13397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rmod__(self, other, context=None): 13417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __mod__.""" 13427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 13437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__mod__(self, context=context) 13447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder_near(self, other, context=None): 13467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 13477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Remainder nearest to 0- abs(remainder-near) <= other/2 13487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 13497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 13507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 13517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 13527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(other, context) 13547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 13557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 13567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self and not other: 13577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'x % 0') 13587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # If DivisionImpossible causes an error, do not leave Rounded/Inexact 13607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # ignored in the calling function. 13617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 13627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = context._ignore_flags(Rounded, Inexact) 13637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #keep DivisionImpossible flags 13647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (side, r) = self.__divmod__(other, context=context) 13657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if r._isnan(): 13677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(*flags) 13687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return r 13697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 13717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding_decision(NEVER_ROUND) 13727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._sign: 13747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger comparison = other.__div__(Decimal(-2), context=context) 13757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 13767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger comparison = other.__div__(Decimal(2), context=context) 13777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding_decision(rounding) 13797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(*flags) 13807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s1, s2 = r._sign, comparison._sign 13827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = 0, 0 13837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if r < comparison: 13857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = s1, s2 13867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Get flags now 13877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.__divmod__(other, context=context) 13887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return r._fix(context=context) 13897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = s1, s2 13907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding_decision(NEVER_ROUND) 13927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (side, r) = self.__divmod__(other, context=context) 13947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding_decision(rounding) 13957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if r._isnan(): 13967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return r 13977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger decrease = not side._iseven() 13997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding_decision(NEVER_ROUND) 14007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger side = side.__abs__(context=context) 14017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding_decision(rounding) 14027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s1, s2 = r._sign, comparison._sign 14047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = 0, 0 14057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if r > comparison or decrease and r == comparison: 14067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = s1, s2 14077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec += 1 14087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(side.__add__(Decimal(1), context=context)._int) >= context.prec: 14097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec -= 1 14107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionImpossible)[1] 14117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec -= 1 14127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign == other._sign: 14137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r = r.__sub__(other, context=context) 14147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 14157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r = r.__add__(other, context=context) 14167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 14177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = s1, s2 14187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return r._fix(context=context) 14207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __floordiv__(self, other, context=None): 14227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """self // other""" 14237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._divide(other, 2, context)[0] 14247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rfloordiv__(self, other, context=None): 14267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __floordiv__.""" 14277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 14287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__floordiv__(self, context=context) 14297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __float__(self): 14317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Float representation.""" 14327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return float(str(self)) 14337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __int__(self): 14357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts self to a int, truncating if necessary.""" 14367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isnan(): 14377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 14387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidContext) 14397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif self._isinfinity(): 14407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raise OverflowError, "Cannot convert infinity to long" 14417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 14427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 14437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = '-'*self._sign 14447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 14457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s = sign + ''.join(map(str, self._int)) + '0'*self._exp 14467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(s) 14477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s = sign + ''.join(map(str, self._int))[:self._exp] 14487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(s) 14497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = list(self._int) 14507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.reverse() 14517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = 0 14527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while tmp: 14537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val *= 10 14547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val += tmp.pop() 14557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(((-1) ** self._sign) * val * 10.**int(self._exp)) 14567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __long__(self): 14587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts to a long. 14597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Equivalent to long(int(self)) 14617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 14627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return long(self.__int__()) 14637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _fix(self, prec=None, rounding=None, folddown=None, context=None): 14657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Round if it is necessary to keep self within prec precision. 14667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds and fixes the exponent. Does not raise on a sNaN. 14687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Arguments: 14707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self - Decimal instance 14717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec - precision to which to round. By default, the context decides. 14727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding - Rounding method. By default, the context decides. 14737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger folddown - Fold down high elements, by default context._clamp 14747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context - context used. 14757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 14767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity() or self._isnan(): 14777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self 14787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 14797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 14807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec is None: 14817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec = context.prec 14827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(self) 14837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fixexponents(prec, rounding, folddown=folddown, 14847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context=context) 14857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(ans._int) > prec: 14867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._round(prec, rounding, context=context) 14877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fixexponents(prec, rounding, folddown=folddown, 14887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context=context) 14897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 14907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _fixexponents(self, prec=None, rounding=None, folddown=None, 14927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context=None): 14937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Fix the exponents and return a copy with the exponent in bounds.""" 14947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 14957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self 14967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 14977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 14987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec is None: 14997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec = context.prec 15007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if folddown is None: 15017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger folddown = context._clamp 15027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Emin, Emax = context.Emin, context.Emax 15037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Etop = context.Etop() 15047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(self) 15057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans.adjusted() < Emin: 15067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Etiny = context.Etiny() 15077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans._exp < Etiny: 15087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not ans: 15097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp = Etiny 15107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Clamped) 15117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._rescale(Etiny, context=context) 15137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #It isn't zero, and exp < Emin => subnormal 15147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Subnormal) 15157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.flags[Inexact]: 15167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Underflow) 15177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 15187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 15197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Only raise subnormal if non-zero. 15207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Subnormal) 15217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif folddown and ans._exp > Etop: 15227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Clamped) 15237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._rescale(Etop, context=context) 15247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif ans.adjusted() > Emax: 15257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not ans: 15267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp = Emax 15277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Clamped) 15287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Inexact) 15307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 15317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(Overflow, 'above Emax', ans._sign) 15327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round(self, prec=None, rounding=None, context=None): 15357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a rounded version of self. 15367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger You can specify the precision or rounding method. Otherwise, the 15387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context determines it. 15397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 15407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 15427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 15437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(context=context) 15447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 15457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 15487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal(self) 15497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if rounding is None: 15517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context.rounding 15527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec is None: 15537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec = context.prec 15547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 15567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec <= 0: 15577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dig = (0,) 15587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = len(self._int) - prec + self._exp 15597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 15607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dig = (0,) * prec 15617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = len(self._int) + self._exp - prec 15627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal((self._sign, dig, exp)) 15637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 15647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec == 0: 15677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger temp = Decimal(self) 15687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger temp._int = (0,)+temp._int 15697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec = 1 15707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif prec < 0: 15717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = self._exp + len(self._int) - prec - 1 15727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger temp = Decimal( (self._sign, (0, 1), exp)) 15737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec = 1 15747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 15757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger temp = Decimal(self) 15767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger numdigits = len(temp._int) 15787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec == numdigits: 15797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return temp 15807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # See if we need to extend precision 15827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger expdiff = prec - numdigits 15837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if expdiff > 0: 15847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = list(temp._int) 15857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.extend([0] * expdiff) 15867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal( (temp._sign, tmp, temp._exp - expdiff)) 15877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #OK, but maybe all the lost digits are 0. 15907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger lostdigits = self._int[expdiff:] 15917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if lostdigits == (0,) * len(lostdigits): 15927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal( (temp._sign, temp._int[:prec], temp._exp - expdiff)) 15937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Rounded, but not Inexact 15947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 15957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Okay, let's round and lose data 15987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger this_function = getattr(temp, self._pick_rounding_function[rounding]) 16007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Now we've got the rounding function 16017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec != context.prec: 16037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 16047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = prec 16057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = this_function(prec, expdiff, context) 16067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 16077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Inexact, 'Changed in rounding') 16087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 16107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _pick_rounding_function = {} 16127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_down(self, prec, expdiff, context): 16147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Also known as round-towards-0, truncate.""" 16157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (self._sign, self._int[:prec], self._exp - expdiff) ) 16167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_half_up(self, prec, expdiff, context, tmp = None): 16187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds 5 up (away from 0)""" 16197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if tmp is None: 16217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal( (self._sign,self._int[:prec], self._exp - expdiff)) 16227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._int[prec] >= 5: 16237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = tmp._increment(round=0, context=context) 16247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(tmp._int) > prec: 16257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1)) 16267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 16277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_half_even(self, prec, expdiff, context): 16297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Round 5 to even, rest to nearest.""" 16307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff)) 16327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger half = (self._int[prec] == 5) 16337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if half: 16347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for digit in self._int[prec+1:]: 16357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if digit != 0: 16367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger half = 0 16377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 16387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if half: 163961992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger if self._int[prec-1] & 1 == 0: 16407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 16417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_half_up(prec, expdiff, context, tmp) 16427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_half_down(self, prec, expdiff, context): 16447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Round 5 down""" 16457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff)) 16477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger half = (self._int[prec] == 5) 16487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if half: 16497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for digit in self._int[prec+1:]: 16507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if digit != 0: 16517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger half = 0 16527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 16537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if half: 16547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 16557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_half_up(prec, expdiff, context, tmp) 16567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_up(self, prec, expdiff, context): 16587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds away from 0.""" 16597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff) ) 16607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for digit in self._int[prec:]: 16617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if digit != 0: 16627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = tmp._increment(round=1, context=context) 16637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(tmp._int) > prec: 16647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1)) 16657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 16667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 16677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 16687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_ceiling(self, prec, expdiff, context): 16707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds up (not away from 0 if negative.)""" 16717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 16727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_down(prec, expdiff, context) 16737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 16747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_up(prec, expdiff, context) 16757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_floor(self, prec, expdiff, context): 16777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds down (not towards 0 if negative)""" 16787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self._sign: 16797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_down(prec, expdiff, context) 16807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 16817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_up(prec, expdiff, context) 16827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __pow__(self, n, modulo = None, context=None): 16847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self ** n (mod modulo) 16857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If modulo is None (default), don't take it mod modulo. 16877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 16887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 16897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 16907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger n = self._convert_other(n) 16917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Because the spot << doesn't work with really big exponents 16937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if n._isinfinity() or n.adjusted() > 8: 16947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'x ** INF') 16957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(n, context) 16977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 16987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 16997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not n._isinfinity() and not n._isinteger(): 17017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'x ** (non-integer)') 17027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self and not n: 17047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, '0 ** 0') 17057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not n: 17077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal(1) 17087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self == Decimal(1): 17107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal(1) 17117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = self._sign and not n._iseven() 17137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger n = int(n) 17147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 17167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if modulo: 17177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'INF % x') 17187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if n > 0: 17197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 17207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (sign, (0,), 0) ) 17217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #with ludicrously large exponent, just raise an overflow and return inf. 17237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not modulo and n > 0 and (self._exp + len(self._int) - 1) * n > context.Emax \ 17247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger and self: 17257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal('inf') 17277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._sign = sign 17287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 17297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Inexact) 17307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Overflow, 'Big power', sign) 17317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 17327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elength = len(str(abs(n))) 17347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger firstprec = context.prec 17357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 173699148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger if not modulo and firstprec + elength + 1 > DefaultContext.Emax: 17377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(Overflow, 'Too much precision.', sign) 17387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger mul = Decimal(self) 17407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = Decimal(1) 17417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 17427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec + elength + 1 17437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context.rounding 17447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if n < 0: 17457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #n is a long now, not Decimal instance 17467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger n = -n 17477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger mul = Decimal(1).__div__(mul, context=context) 17487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger shouldround = context._rounding_decision == ALWAYS_ROUND 17507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot = 1 17527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while spot <= n: 17537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot <<= 1 17547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot >>= 1 17567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Spot is the highest power of 2 less than n 17577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while spot: 17587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = val.__mul__(val, context=context) 17597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if val._isinfinity(): 17607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = Infsign[sign] 17617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 17627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if spot & n: 17637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = val.__mul__(mul, context=context) 17647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if modulo is not None: 17657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = val.__mod__(modulo, context=context) 17667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot >>= 1 17677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec 17687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 17707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return val._fix(context=context) 17717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return val 17727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rpow__(self, other, context=None): 17747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __pow__.""" 17757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 17767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__pow__(self, context=context) 17777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def normalize(self, context=None): 17797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Normalize- strip trailing 0s, change anything equal to 0 to 0e0""" 17807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 17817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 17827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(context=context) 17847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 17857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 17867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dup = self._fix(context=context) 17887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if dup._isinfinity(): 17897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return dup 17907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not dup: 17927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (dup._sign, (0,), 0) ) 17937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger end = len(dup._int) 17947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = dup._exp 17957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while dup._int[end-1] == 0: 17967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp += 1 17977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger end -= 1 17987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (dup._sign, dup._int[:end], exp) ) 17997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def quantize(self, exp, rounding = None, context=None, watchexp = 1): 18027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Quantize self so its exponent is the same as that of exp. 18037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Similar to self._rescale(exp._exp) but with error checking. 18057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 18067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 18077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 18087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(exp, context) 18107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 18117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 18127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp._isinfinity() or self._isinfinity(): 18147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp._isinfinity() and self._isinfinity(): 18157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self #if both are inf, it is OK 18167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 18177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'quantize with one INF') 18187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._rescale(exp._exp, rounding, context, watchexp) 18197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def same_quantum(self, other): 18217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Test whether self and other have the same exponent. 18227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger same as self._exp == other._exp, except NaN == sNaN 18247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 18257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isnan() or other._isnan(): 18267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._isnan() and other._isnan() and True 18277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity() or other._isinfinity(): 18287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._isinfinity() and other._isinfinity() and True 18297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._exp == other._exp 18307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _rescale(self, exp, rounding = None, context=None, watchexp = 1): 18327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rescales so that the exponent is exp. 18337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = exp to scale to (an integer) 18357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = rounding version 18367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger watchexp: if set (default) an error is returned if exp is greater 18377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger than Emax or less than Etiny. 18387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 18397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 18407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 18417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 18437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'rescale with an INF') 18447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(context=context) 18467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 18477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 18487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger out = 0 18507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if watchexp and (context.Emax < exp or context.Etiny() > exp): 18527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'rescale(a, INF)') 18537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 18557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(self) 18567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._int = (0,) 18577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp = exp 18587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 18597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger diff = self._exp - exp 18617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger digits = len(self._int)+diff 18627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if watchexp and digits > context.prec: 18647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'Rescale > prec') 18657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal(self) 18677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._int = (0,)+tmp._int 18687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger digits += 1 18697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prevexact = context.flags[Inexact] 18717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if digits < 0: 18727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._exp = -digits + tmp._exp 18737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._int = (0,1) 18747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger digits = 1 18757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = tmp._round(digits, rounding, context=context) 18767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if tmp._int[0] == 0 and len(tmp._int) > 1: 18787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._int = tmp._int[1:] 18797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._exp = exp 18807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if tmp and tmp.adjusted() < context.Emin: 18827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Subnormal) 18837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif tmp and tmp.adjusted() > context.Emax: 18847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'rescale(a, INF)') 18857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 18867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_integral(self, rounding = None, context=None): 18887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds to the nearest integer, without raising inexact, rounded.""" 18897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 18907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 18917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(context=context) 18927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 18937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 18947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 18957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self 18967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = context._ignore_flags(Rounded, Inexact) 18977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._rescale(0, rounding, context=context) 18987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(flags) 18997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 19007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def sqrt(self, context=None): 19027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the square root of self. 19037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Uses a converging algorithm (Xn+1 = 0.5*(Xn + self / Xn)) 19057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Should quadratically approach the right answer. 19067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 19077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 19087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 19097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(context=context) 19117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 19127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 19137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 19157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #exponent = self._exp / 2, using round_down. 19167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #if self._exp < 0: 19177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # exp = (self._exp+1) // 2 19187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #else: 19197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = (self._exp) // 2 19207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign == 1: 19217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #sqrt(-0) = -0 19227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (1, (0,), exp)) 19237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 19247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (0, (0,), exp)) 19257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign == 1: 19277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0') 19287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 19307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal(self) 19317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal(self) 19337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger expadd = tmp._exp / 2 193561992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger if tmp._exp & 1: 19367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._int += (0,) 19377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._exp = 0 19387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 19397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._exp = 0 19407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 19427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = context._ignore_all_flags() 19437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger firstprec = context.prec 19447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = 3 194561992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger if tmp.adjusted() & 1 == 0: 19467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal( (0, (8,1,9), tmp.adjusted() - 2) ) 19477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans.__add__(tmp.__mul__(Decimal((0, (2,5,9), -2)), 19487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context=context), context=context) 19497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp -= 1 + tmp.adjusted()/2 19507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 19517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal( (0, (2,5,9), tmp._exp + len(tmp._int)- 3) ) 19527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans.__add__(tmp.__mul__(Decimal((0, (8,1,9), -3)), 19537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context=context), context=context) 19547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp -= 1 + tmp.adjusted()/2 19557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #ans is now a linear approximation. 19577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Emax, Emin = context.Emax, context.Emin 195999148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger context.Emax, context.Emin = DefaultContext.Emax, DefaultContext.Emin 19607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger half = Decimal('0.5') 19627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger count = 1 19647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger maxp = firstprec + 2 19657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding(ROUND_HALF_EVEN) 19667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while 1: 19677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = min(2*context.prec - 2, maxp) 19687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = half.__mul__(ans.__add__(tmp.__div__(ans, context=context), 19697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context=context), context=context) 19707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.prec == maxp: 19717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 19727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #round to the answer's precision-- the only error can be 1 ulp. 19747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec 19757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prevexp = ans.adjusted() 19767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._round(context=context) 19777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Now, check if the other last digits are better. 19797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec + 1 19807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # In case we rounded up another digit and we should actually go lower. 19817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prevexp != ans.adjusted(): 19827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._int += (0,) 19837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp -= 1 19847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger lower = ans.__sub__(Decimal((0, (5,), ans._exp-1)), context=context) 19877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding(ROUND_UP) 19887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if lower.__mul__(lower, context=context) > (tmp): 19897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans.__sub__(Decimal((0, (1,), ans._exp)), context=context) 19907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 19927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger upper = ans.__add__(Decimal((0, (5,), ans._exp-1)),context=context) 19937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding(ROUND_DOWN) 19947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if upper.__mul__(upper, context=context) < tmp: 19957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans.__add__(Decimal((0, (1,), ans._exp)),context=context) 19967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp += expadd 19987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec 20007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.rounding = rounding 20017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 20027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding_decision(NEVER_ROUND) 20047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not ans.__mul__(ans, context=context) == self: 20057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Only rounded/inexact if here. 20067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(flags) 20077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 20087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Inexact) 20097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 20107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Exact answer, so let's set the exponent right. 20117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #if self._exp < 0: 20127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # exp = (self._exp +1)// 2 20137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #else: 20147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = self._exp // 2 20157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec += ans._exp - exp 20167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._rescale(exp, context=context) 20177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec 20187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(flags) 20197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.Emax, context.Emin = Emax, Emin 20207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans._fix(context=context) 20227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def max(self, other, context=None): 20247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the larger value. 20257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger like max(self, other) except if one is not a number, returns 20277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN (and signals if one is sNaN). Also rounds. 20287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 20297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 20307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 20317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 20327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(other, context) 20347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 20357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 20367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self 20387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self < other: 20397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = other 20407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger shouldround = context._rounding_decision == ALWAYS_ROUND 20417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 20427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 20437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 20447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def min(self, other, context=None): 20467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the smaller value. 20477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger like min(self, other) except if one is not a number, returns 20497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN (and signals if one is sNaN). Also rounds. 20507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 20517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 20527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 20537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = self._convert_other(other) 20547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._check_nans(other, context) 20567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 20577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 20587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self 20607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self > other: 20627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = other 20637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context._rounding_decision == ALWAYS_ROUND: 20657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._fix(context=context) 20667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 20687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isinteger(self): 20707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether self is an integer""" 20717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 20727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return True 20737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rest = self._int[self._exp:] 20747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return rest == (0,)*len(rest) 20757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _iseven(self): 20777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns 1 if self is even. Assumes self is an integer.""" 20787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp > 0: 20797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 208061992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger return self._int[-1+self._exp] & 1 == 0 20817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def adjusted(self): 20837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the adjusted exponent of self""" 20847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger try: 20857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._exp + len(self._int) - 1 20867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #If NaN or Infinity, self._exp is string 20877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger except TypeError: 20887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 20897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # support for pickling, copy, and deepcopy 20917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __reduce__(self): 20927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (self.__class__, (str(self),)) 20937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __copy__(self): 20957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if type(self) == Decimal: 20967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self # I'm immutable; therefore I am my own clone 20977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__class__(str(self)) 20987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __deepcopy__(self, memo): 21007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if type(self) == Decimal: 21017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self # My components are also immutable 21027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__class__(str(self)) 21037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2104d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger##### Context class ########################################### 2105d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger 21067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# get rounding method function: 21087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerrounding_functions = [name for name in Decimal.__dict__.keys() if name.startswith('_round_')] 21097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerfor name in rounding_functions: 21107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #name is like _round_half_even, goes to the global ROUND_HALF_EVEN value. 21117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger globalname = name[1:].upper() 21127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = globals()[globalname] 21137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal._pick_rounding_function[val] = name 21147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21159ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettingerdel name, val, globalname, rounding_functions 21167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Context(object): 21187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Contains the context for a Decimal instance. 21197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Contains: 21217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec - precision (for use in rounding, division, square roots..) 21227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding - rounding type. (how you round) 21237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round? 2124bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps - If traps[exception] = 1, then the exception is 21257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raised when it is caused. Otherwise, a value is 21267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger substituted in. 21277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags - When an exception is caused, flags[exception] is incremented. 21287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (Whether or not the trap_enabler is set) 21297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Should be reset by user of Decimal instance. 21300ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emin - Minimum exponent 21310ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emax - Maximum exponent 21327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger capitals - If 1, 1*10^1 is printed as 1E+1. 21337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If 0, printed as 1e1 2134e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger _clamp - If 1, change exponents if too high (Default 0) 21357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 21369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger 21377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __init__(self, prec=None, rounding=None, 2138bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=None, flags=[], 21397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _rounding_decision=None, 21400ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emin=None, Emax=None, 2141e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger capitals=None, _clamp=0, 21427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _ignored_flags=[]): 2143bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if not isinstance(flags, dict): 2144fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger flags = dict([(s,s in flags) for s in _signals]) 2145b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger del s 2146bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if traps is not None and not isinstance(traps, dict): 2147fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger traps = dict([(s,s in traps) for s in _signals]) 2148b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger del s 21497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for name, val in locals().items(): 21507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if val is None: 21517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger setattr(self, name, copy.copy(getattr(DefaultContext, name))) 21527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 21537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger setattr(self, name, val) 21547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger del self.self 21557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2156b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger def __repr__(self): 2157bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger """Show the current context.""" 2158b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger s = [] 2159bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger s.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' % vars(self)) 2160bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger s.append('flags=[' + ', '.join([f.__name__ for f, v in self.flags.items() if v]) + ']') 2161bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger s.append('traps=[' + ', '.join([t.__name__ for t, v in self.traps.items() if v]) + ']') 2162b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger return ', '.join(s) + ')' 2163b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger 2164d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger def clear_flags(self): 2165d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger """Reset all flags to zero""" 2166d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger for flag in self.flags: 2167b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger self.flags[flag] = 0 2168d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger 21697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def copy(self): 21707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a copy from self.""" 2171bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger nc = Context(self.prec, self.rounding, self.traps, self.flags, 21727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._rounding_decision, self.Emin, self.Emax, 21737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.capitals, self._clamp, self._ignored_flags) 21747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return nc 21759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger __copy__ = copy 21767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21775aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger def _raise_error(self, condition, explanation = None, *args): 21787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Handles an error 21797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the flag is in _ignored_flags, returns the default response. 21817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Otherwise, it increments the flag, then, if the corresponding 21827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger trap_enabler is set, it reaises the exception. Otherwise, it returns 21837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the default value after incrementing the flag. 21847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 21855aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger error = _condition_map.get(condition, condition) 21867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if error in self._ignored_flags: 21877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Don't touch the flag 21887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return error().handle(self, *args) 21897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.flags[error] += 1 2191bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if not self.traps[error]: 21927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #The errors define how to handle themselves. 21935aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger return condition().handle(self, *args) 21947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Errors should only be risked on copies of the context 21967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #self._ignored_flags = [] 21977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raise error, explanation 21987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _ignore_all_flags(self): 22007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Ignore all flags, if they are raised""" 2201fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger return self._ignore_flags(*_signals) 22027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _ignore_flags(self, *flags): 22047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Ignore the flags, if they are raised""" 22057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Do not mutate-- This way, copies of a context leave the original 22067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # alone. 22077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._ignored_flags = (self._ignored_flags + list(flags)) 22087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return list(flags) 22097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _regard_flags(self, *flags): 22117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Stop ignoring the flags, if they are raised""" 22127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if flags and isinstance(flags[0], (tuple,list)): 22137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = flags[0] 22147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for flag in flags: 22157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._ignored_flags.remove(flag) 22167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22175aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger def __hash__(self): 22185aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger """A Context cannot be hashed.""" 22195aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger # We inherit object.__hash__, so we must deny this explicitly 22205aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger raise TypeError, "Cannot hash a Context." 22215aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger 22227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def Etiny(self): 22237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns Etiny (= Emin - prec + 1)""" 22247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(self.Emin - self.prec + 1) 22257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def Etop(self): 2227e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger """Returns maximum exponent (= Emax - prec + 1)""" 22287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(self.Emax - self.prec + 1) 22297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _set_rounding_decision(self, type): 22317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Sets the rounding decision. 22327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Sets the rounding decision, and returns the current (previous) 22347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding decision. Often used like: 22357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 22377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # That so you don't change the calling context 22387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # if an error occurs in the middle (say DivisionImpossible is raised). 22397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding_decision(NEVER_ROUND) 22417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger instance = instance / Decimal(2) 22427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding_decision(rounding) 22437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This will make it not round for that operation. 22457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 22467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = self._rounding_decision 22487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._rounding_decision = type 22497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return rounding 22507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _set_rounding(self, type): 22527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Sets the rounding type. 22537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Sets the rounding type, and returns the current (previous) 22557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding type. Often used like: 22567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 22587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # so you don't change the calling context 22597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # if an error occurs in the middle. 22607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding(ROUND_UP) 22617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = self.__sub__(other, context=context) 22627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding(rounding) 22637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This will make it round up for that operation. 22657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 22667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = self.rounding 22677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.rounding= type 22687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return rounding 22697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2270fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger def create_decimal(self, num='0'): 22717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Creates a new Decimal instance but using self as context.""" 22727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger d = Decimal(num, context=self) 22737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return d._fix(context=self) 22747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Methods 22767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def abs(self, a): 22777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the absolute value of the operand. 22787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the operand is negative, the result is the same as using the minus 22807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation on the operand. Otherwise, the result is the same as using 22817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the plus operation on the operand. 22827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('2.1')) 22847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.1") 22859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('-100')) 22867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("100") 22879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('101.5')) 22887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("101.5") 22899ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('-101.5')) 22907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("101.5") 22917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 22927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__abs__(context=self) 22937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def add(self, a, b): 22957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the sum of the two operands. 22967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22979ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.add(Decimal('12'), Decimal('7.00')) 22987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("19.00") 22999ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4')) 23007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.02E+4") 23017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__add__(b, context=self) 23037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _apply(self, a): 23057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return str(a._fix(context=self)) 23067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def compare(self, a, b): 23087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Compares values numerically. 23097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the signs of the operands differ, a value representing each operand 23117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ('-1' if the operand is less than zero, '0' if the operand is zero or 23127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negative zero, or '1' if the operand is greater than zero) is used in 23137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger place of that operand for the comparison instead of the actual 23147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operand. 23157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The comparison is then effected by subtracting the second operand from 23177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the first and then returning a value according to the result of the 23187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger subtraction: '-1' if the result is less than zero, '0' if the result is 23197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger zero or negative zero, or '1' if the result is greater than zero. 23207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3')) 23227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1") 23239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1')) 23247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 23259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10')) 23267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 23279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1')) 23287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 23299ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3')) 23307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 23319ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1')) 23327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1") 23337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.compare(b, context=self) 23357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divide(self, a, b): 23377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Decimal division in a specified context. 23387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23399ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1'), Decimal('3')) 23407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.333333333") 23419ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2'), Decimal('3')) 23427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.666666667") 23439ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('5'), Decimal('2')) 23447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.5") 23459ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1'), Decimal('10')) 23467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.1") 23479ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('12'), Decimal('12')) 23487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 23499ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2')) 23507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("4.00") 23519ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0')) 23527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.20") 23539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1000'), Decimal('100')) 23547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("10") 23559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1000'), Decimal('1')) 23567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1000") 23579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2')) 23587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.20E+6") 23597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__div__(b, context=self) 23617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divide_int(self, a, b): 23637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Divides two numbers and returns the integer part of the result. 23647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3')) 23667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 23679ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3')) 23687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3") 23699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3')) 23707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3") 23717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__floordiv__(b, context=self) 23737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divmod(self, a, b): 23757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__divmod__(b, context=self) 23767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def max(self, a,b): 23787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """max compares two values numerically and returns the maximum. 23797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If either operand is a NaN then the general rules apply. 23817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Otherwise, the operands are compared as as though by the compare 23827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation. If they are numerically equal then the left-hand operand 23837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger is chosen as the result. Otherwise the maximum (closer to positive 23847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger infinity) of the two operands is chosen as the result. 23857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('3'), Decimal('2')) 23877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3") 23889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('-10'), Decimal('3')) 23897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3") 23909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('1.0'), Decimal('1')) 23917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0") 23927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.max(b, context=self) 23947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def min(self, a,b): 23967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """min compares two values numerically and returns the minimum. 23977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If either operand is a NaN then the general rules apply. 23997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Otherwise, the operands are compared as as though by the compare 24007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation. If they are numerically equal then the left-hand operand 24017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger is chosen as the result. Otherwise the minimum (closer to negative 24027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger infinity) of the two operands is chosen as the result. 24037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('3'), Decimal('2')) 24057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2") 24069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('-10'), Decimal('3')) 24077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-10") 24089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('1.0'), Decimal('1')) 24097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0") 24107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 24117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.min(b, context=self) 24127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def minus(self, a): 24147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Minus corresponds to unary prefix minus in Python. 24157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is evaluated using the same rules as subtract; the 24177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation minus(a) is calculated as subtract('0', a) where the '0' 24187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger has the same exponent as the operand. 24197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.minus(Decimal('1.3')) 24217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1.3") 24229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.minus(Decimal('-1.3')) 24237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.3") 24247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 24257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__neg__(context=self) 24267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def multiply(self, a, b): 24287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """multiply multiplies two operands. 24297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If either operand is a special value then the general rules apply. 24317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Otherwise, the operands are multiplied together ('long multiplication'), 24327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resulting in a number which may be as long as the sum of the lengths 24337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger of the two operands. 24347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24359ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3')) 24367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3.60") 24379ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('7'), Decimal('3')) 24387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("21") 24399ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8')) 24407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.72") 24419ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0')) 24427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0.0") 24439ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321')) 24447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("4.28135971E+11") 24457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 24467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__mul__(b, context=self) 24477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def normalize(self, a): 2449e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger """normalize reduces an operand to its simplest form. 24507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Essentially a plus operation with all trailing zeros removed from the 24527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result. 24537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('2.1')) 24557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.1") 24569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('-2.0')) 24577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-2") 24589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('1.200')) 24597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.2") 24609ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('-120')) 24617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1.2E+2") 24629ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('120.00')) 24637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.2E+2") 24649ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('0.00')) 24657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 24667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 24677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.normalize(context=self) 24687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def plus(self, a): 24707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Plus corresponds to unary prefix plus in Python. 24717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is evaluated using the same rules as add; the 24737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation plus(a) is calculated as add('0', a) where the '0' 24747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger has the same exponent as the operand. 24757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.plus(Decimal('1.3')) 24777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.3") 24789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.plus(Decimal('-1.3')) 24797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1.3") 24807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 24817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__pos__(context=self) 24827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def power(self, a, b, modulo=None): 24847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Raises a to the power of b, to modulo if given. 24857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The right-hand operand must be a whole number whose integer part (after 24877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger any exponent has been applied) has no more than 9 digits and whose 24887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger fractional part (if any) is all zeros before any rounding. The operand 24897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger may be positive, negative, or zero; if negative, the absolute value of 24907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the power is used, and the left-hand operand is inverted (divided into 24917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1) before use. 24927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the increased precision needed for the intermediate calculations 24947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exceeds the capabilities of the implementation then an Invalid operation 24957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger condition is raised. 24967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If, when raising to a negative power, an underflow occurs during the 24987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger division into 1, the operation is not halted at that point but 24997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger continues. 25007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('2'), Decimal('3')) 25027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("8") 25039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('2'), Decimal('-3')) 25047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.125") 25059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('1.7'), Decimal('8')) 25067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("69.7575744") 25079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-2')) 25087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 25099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-1')) 25107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 25119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('Infinity'), Decimal('0')) 25127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 25139ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('Infinity'), Decimal('1')) 25147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("Infinity") 25159ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('Infinity'), Decimal('2')) 25167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("Infinity") 25179ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-2')) 25187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 25199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-1')) 25207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0") 25219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('0')) 25227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 25239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('1')) 25247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-Infinity") 25259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('2')) 25267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("Infinity") 25279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('0'), Decimal('0')) 25287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("NaN") 25297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 25307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__pow__(b, modulo, context=self) 25317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def quantize(self, a, b): 25337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a value equal to 'a' (rounded) and having the exponent of 'b'. 25347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The coefficient of the result is derived from that of the left-hand 25367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operand. It may be rounded using the current rounding setting (if the 25377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exponent is being increased), multiplied by a positive power of ten (if 25387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the exponent is being decreased), or is unchanged (if the exponent is 25397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger already equal to that of the right-hand operand). 25407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Unlike other operations, if the length of the coefficient after the 25427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger quantize operation would be greater than precision then an Invalid 25437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation condition is raised. This guarantees that, unless there is an 25447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger error condition, the exponent of the result of a quantize is always 25457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger equal to that of the right-hand operand. 25467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Also unlike other operations, quantize will never raise Underflow, even 25487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if the result is subnormal and inexact. 25497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001')) 25517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.170") 25529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01')) 25537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.17") 25549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1')) 25557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.2") 25569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0')) 25577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2") 25589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1')) 25597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0E+1") 25609ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity')) 25617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-Infinity") 25629ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity')) 25637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("NaN") 25649ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1')) 25657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0") 25669ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5')) 25677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0E+5") 25689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2')) 25697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("NaN") 25709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2')) 25717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("NaN") 25729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1')) 25737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("217.0") 25749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0')) 25757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("217") 25769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1')) 25777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.2E+2") 25789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2')) 25797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2E+2") 25807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 25817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.quantize(b, context=self) 25827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder(self, a, b): 25847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the remainder from integer division. 25857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result is the residue of the dividend after the operation of 25877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger calculating integer division as described for divide-integer, rounded to 25887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger precision digits if necessary. The sign of the result, if non-zero, is 25897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the same as that of the original dividend. 25907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This operation will fail under the same conditions as integer division 25927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (that is, if integer division on the same two operands would fail, the 25937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger remainder cannot be calculated). 25947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25959ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3')) 25967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.1") 25979ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10'), Decimal('3')) 25987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 25999ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3')) 26007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1") 26019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1')) 26027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.2") 26039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3')) 26047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.1") 26059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3')) 26067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0") 26077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 26087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__mod__(b, context=self) 26097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder_near(self, a, b): 26117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns to be "a - b * n", where n is the integer nearest the exact 26127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger value of "x / b" (if two integers are equally near then the even one 26137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger is chosen). If the result is equal to 0 then its sign will be the 26147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign of a. 26157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This operation will fail under the same conditions as integer division 26177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (that is, if integer division on the same two operands would fail, the 26187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger remainder cannot be calculated). 26197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3')) 26217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0.9") 26229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6')) 26237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-2") 26249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3')) 26257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 26269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3')) 26277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1") 26289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1')) 26297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.2") 26309ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3')) 26317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.1") 26329ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3')) 26337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0.3") 26347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 26357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.remainder_near(b, context=self) 26367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def same_quantum(self, a, b): 26387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns True if the two operands have the same exponent. 26397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result is never affected by either the sign or the coefficient of 26417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger either operand. 26427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26439ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001')) 26447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger False 26459ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01')) 26467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger True 26479ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1')) 26487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger False 26499ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf')) 26507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger True 26517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 26527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.same_quantum(b) 26537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def sqrt(self, a): 26557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the square root of a non-negative number to context precision. 26567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the result must be inexact, it is rounded using the round-half-even 26587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger algorithm. 26597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26609ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('0')) 26617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 26629ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('-0')) 26637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0") 26649ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('0.39')) 26657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.624499800") 26669ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('100')) 26677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("10") 26689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1')) 26697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 26709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1.0')) 26717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0") 26729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1.00')) 26737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0") 26749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('7')) 26757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.64575131") 26769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('10')) 26777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3.16227766") 26789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.prec 26796ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger 9 26807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 26817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.sqrt(context=self) 26827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def subtract(self, a, b): 26847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the sum of the two operands. 26857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07')) 26877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.23") 26889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30')) 26897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.00") 26909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07')) 26917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0.77") 26927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 26937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__sub__(b, context=self) 26947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_eng_string(self, a): 26967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts a number to a string, using scientific notation. 26977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is not affected by the context. 26997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 27007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.to_eng_string(context=self) 27017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_sci_string(self, a): 27037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts a number to a string, using scientific notation. 27047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is not affected by the context. 27067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 27077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__str__(context=self) 27087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_integral(self, a): 27107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds to an integer. 27117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger When the operand has a negative exponent, the result is the same 27137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger as using the quantize() operation using the given operand as the 27147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger left-hand-operand, 1E+0 as the right-hand-operand, and the precision 27157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger of the operand as the precision setting, except that no flags will 27167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger be set. The rounding mode is taken from the context. 27177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('2.1')) 27197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2") 27209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('100')) 27217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("100") 27229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('100.0')) 27237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("100") 27249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('101.5')) 27257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("102") 27269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('-101.5')) 27277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-102") 27289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('10E+5')) 27297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0E+6") 27309ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('7.89E+77')) 27317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("7.89E+77") 27329ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('-Inf')) 27337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-Infinity") 27347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 27357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.to_integral(context=self) 27367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass _WorkRep(object): 27387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __slots__ = ('sign','int','exp') 27397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # sign: -1 None 1 27407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # int: list 27417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # exp: None, int, or string 27427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __init__(self, value=None): 27447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if value is None: 27457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.sign = None 27467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.int = [] 27477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = None 27487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(value, Decimal): 27497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if value._sign: 27507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.sign = -1 27517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 27527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.sign = 1 27537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.int = list(value._int) 27547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = value._exp 27557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(value, tuple): 27567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.sign = value[0] 27577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.int = value[1] 27587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = value[2] 27597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __repr__(self): 27617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return "(%r, %r, %r)" % (self.sign, self.int, self.exp) 27627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __str__ = __repr__ 27647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __neg__(self): 27667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self.sign == 1: 27677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return _WorkRep( (-1, self.int, self.exp) ) 27687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 27697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return _WorkRep( (1, self.int, self.exp) ) 27707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __abs__(self): 27727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self.sign == -1: 27737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -self 27747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 27757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self 27767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __cmp__(self, other): 27787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self.exp != other.exp: 27797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raise ValueError("Operands not normalized: %r, %r" % (self, other)) 27807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self.sign != other.sign: 27817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self.sign == -1: 27827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 27837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 27847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 27857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self.sign == -1: 27867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger direction = -1 27877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 27887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger direction = 1 27897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger int1 = self.int 27907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger int2 = other.int 27917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(int1) > len(int2): 27927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return direction * 1 27937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(int1) < len(int2): 27947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return direction * -1 27957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for i in xrange(len(int1)): 27967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if int1[i] > int2[i]: 27977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return direction * 1 27987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if int1[i] < int2[i]: 27997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return direction * -1 28007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 28017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _increment(self): 28037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger curspot = len(self.int) - 1 28047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.int[curspot]+= 1 28057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while (self.int[curspot] >= 10): 28067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.int[curspot] -= 10 28077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if curspot == 0: 28087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.int[0:0] = [1] 28097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 28107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.int[curspot-1] += 1 28117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger curspot -= 1 28127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def subtract(self, alist): 28147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Subtract a list from the current int (in place). 28157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger It is assured that (len(list) = len(self.int) and list < self.int) or 28177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger len(list) = len(self.int)-1 28187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (i.e. that int(join(list)) < int(join(self.int))) 28197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 28207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger selfint = self.int 28227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger selfint.reverse() 28237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger alist.reverse() 28247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger carry = 0 28267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for x in xrange(len(alist)): 28277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger selfint[x] -= alist[x] + carry 28287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if selfint[x] < 0: 28297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger carry = 1 28307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger selfint[x] += 10 28317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 28324e0e1b6a540e664e89739456db4c706701bf062bTim Peters carry = 0 28337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if carry: 28347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger selfint[x+1] -= 1 28357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger last = len(selfint)-1 28367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while len(selfint) > 1 and selfint[last] == 0: 28377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger last -= 1 28387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if last == 0: 28397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 28407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger selfint[last+1:]=[] 28417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger selfint.reverse() 28427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger alist.reverse() 28437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 28447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _normalize(op1, op2, shouldround = 0, prec = 0): 28477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Normalizes op1, op2 to have the same exp and length of coefficient. 28487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Done during addition. 28507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 28517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Yes, the exponent is a long, but the difference between exponents 28527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # must be an int-- otherwise you'd get a big memory problem. 28537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger numdigits = int(op1.exp - op2.exp) 28547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if numdigits < 0: 28557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger numdigits = -numdigits 28567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = op2 28577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = op1 28587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 28597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = op1 28607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = op2 28617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround and numdigits > len(other.int) + prec + 1 -len(tmp.int): 28637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # If the difference in adjusted exps is > prec+1, we know 28647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # other is insignificant, so might as well put a 1 after the precision. 28657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # (since this is only for addition.) Also stops MemoryErrors. 28667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger extend = prec + 2 -len(tmp.int) 28687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if extend <= 0: 28697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger extend = 1 28707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.int.extend([0]*extend) 28717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.exp -= extend 28727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other.int[:] = [0]*(len(tmp.int)-1)+[1] 28737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other.exp = tmp.exp 28747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return op1, op2 28757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.int.extend([0] * numdigits) 28777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.exp = tmp.exp - numdigits 28787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger numdigits = len(op1.int) - len(op2.int) 28797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # numdigits != 0 => They have the same exponent, but not the same length 28807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # of the coefficient. 28817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if numdigits < 0: 28827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger numdigits = -numdigits 28837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = op1 28847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 28857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = op2 28867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.int[0:0] = [0] * numdigits 28877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return op1, op2 28887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _adjust_coefficients(op1, op2): 28907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Adjust op1, op2 so that op2.int+[0] > op1.int >= op2.int. 28917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Returns the adjusted op1, op2 as well as the change in op1.exp-op2.exp. 28937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Used on _WorkRep instances during division. 28957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 28967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjust = 0 28977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #If op1 is smaller, get it to same size 28987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(op2.int) > len(op1.int): 28997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger diff = len(op2.int) - len(op1.int) 29007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.int.extend([0]*diff) 29017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.exp -= diff 29027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjust = diff 29037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Same length, wrong order 29057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(op1.int) == len(op2.int) and op1.int < op2.int: 29067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.int.append(0) 29077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.exp -= 1 29087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjust+= 1 29097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return op1, op2, adjust 29107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(op1.int) > len(op2.int) + 1: 29127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger diff = len(op1.int) - len(op2.int) - 1 29137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2.int.extend([0]*diff) 29147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2.exp -= diff 29157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjust -= diff 29167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(op1.int) == len(op2.int)+1 and op1.int > op2.int: 29187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2.int.append(0) 29207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2.exp -= 1 29217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjust -= 1 29227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return op1, op2, adjust 29237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Helper Functions ######################################## 29257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger_infinity_map = { 29277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'inf' : 1, 29287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'infinity' : 1, 29297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger '+inf' : 1, 29307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger '+infinity' : 1, 29317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger '-inf' : -1, 29327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger '-infinity' : -1 29337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger} 29347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29350ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerdef _isinfinity(num): 29367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Determines whether a string or float is infinity. 29377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29380ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger +1 for negative infinity; 0 for finite ; +1 for positive infinity 29397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 29407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger num = str(num).lower() 29417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return _infinity_map.get(num, 0) 29427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29430ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerdef _isnan(num): 29447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Determines whether a string or float is NaN 29457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (1, sign, diagnostic info as string) => NaN 29477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (2, sign, diagnostic info as string) => sNaN 29487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 => not a NaN 29497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 29507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger num = str(num).lower() 29517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not num: 29527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 29537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #get the sign, get rid of trailing [+-] 29557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 0 29567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if num[0] == '+': 29577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger num = num[1:] 29587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif num[0] == '-': #elif avoids '+-nan' 29597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger num = num[1:] 29607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 29617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if num.startswith('nan'): 29637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(num) > 3 and not num[3:].isdigit(): #diagnostic info 29647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 29657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (1, sign, num[3:].lstrip('0')) 29667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if num.startswith('snan'): 29677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(num) > 4 and not num[4:].isdigit(): 29687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 29697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (2, sign, num[4:].lstrip('0')) 29707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 29717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Setup Specific Contexts ################################ 29747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# The default context prototype used by Context() 2976fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger# Is mutable, so that new contexts can have different default values 29777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDefaultContext = Context( 29796ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger prec=28, rounding=ROUND_HALF_EVEN, 2980bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[DivisionByZero, Overflow, InvalidOperation], 2981bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 29827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _rounding_decision=ALWAYS_ROUND, 298399148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger Emax=999999999, 298499148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger Emin=-999999999, 2985e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger capitals=1 29867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 29877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Pre-made alternate contexts offered by the specification 29897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Don't change these; the user should be able to select these 29907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# contexts and be able to reproduce results from other implementations 29917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# of the spec. 29927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29939ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerBasicContext = Context( 29947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec=9, rounding=ROUND_HALF_UP, 2995bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow], 2996bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 29977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 29987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29999ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerExtendedContext = Context( 30006ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger prec=9, rounding=ROUND_HALF_EVEN, 3001bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[], 3002bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 30037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 30047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3006d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger##### Useful Constants (internal use only) #################### 30077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Reusable defaults 30097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInf = Decimal('Inf') 30107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingernegInf = Decimal('-Inf') 30117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Infsign[sign] is infinity w/ that sign 30137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfsign = (Inf, negInf) 30147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN = Decimal('NaN') 30167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### crud for parsing strings ################################# 30197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport re 30207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# There's an optional sign at the start, and an optional exponent 30227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# at the end. The exponent has an optional sign and at least one 30237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# digit. In between, must have either at least one digit followed 30247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# by an optional fraction, or a decimal point followed by at least 30257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# one digit. Yuck. 30267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger_parser = re.compile(r""" 30287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# \s* 30297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (?P<sign>[-+])? 30307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ( 30317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (?P<int>\d+) (\. (?P<frac>\d*))? 30327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger | 30337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger \. (?P<onlyfrac>\d+) 30347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ) 30357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ([eE](?P<exp>[-+]? \d+))? 30367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# \s* 30377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger $ 30387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger""", re.VERBOSE).match #Uncomment the \s* to allow leading or trailing spaces. 30397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdel re 30417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# return sign, n, p s.t. float string value == -1**sign * n * 10**p exactly 30437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _string2exact(s): 30457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger m = _parser(s) 30467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if m is None: 30477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raise ValueError("invalid literal for Decimal: %r" % s) 30487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if m.group('sign') == "-": 30507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 30517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 30527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 0 30537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = m.group('exp') 30557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp is None: 30567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = 0 30577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 30587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = int(exp) 30597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger intpart = m.group('int') 30617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if intpart is None: 30627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger intpart = "" 30637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger fracpart = m.group('onlyfrac') 30647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 30657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger fracpart = m.group('frac') 30667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if fracpart is None: 30677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger fracpart = "" 30687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp -= len(fracpart) 30707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger mantissa = intpart + fracpart 30727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = map(int, mantissa) 30737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger backup = tmp 30747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while tmp and tmp[0] == 0: 30757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger del tmp[0] 30767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # It's a zero 30787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not tmp: 30797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if backup: 30807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (sign, tuple(backup), exp) 30817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (sign, (0,), exp) 30827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger mantissa = tuple(tmp) 30837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (sign, mantissa, exp) 30857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerif __name__ == '__main__': 30887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger import doctest, sys 30897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger doctest.testmod(sys.modules[__name__]) 3090