decimal.py revision 7e71fa5cfa250968eafdb77356621e3a9bbb0648
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 1027dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# This module is currently Py2.3 compatible and should be kept that way 1127dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# unless a major compelling advantage arises. IOW, 2.3 compatibility is 1227dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# strongly preferred, but not guaranteed. 1327dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger 1427dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# Also, this module should be kept in sync with the latest updates of 1527dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# the IBM specification as it evolves. Those updates will be treated 1627dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# as bug fixes (deviation from the spec is a compatibility, usability 1727dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# bug) and will be backported. At this point the spec is stabilizing 1827dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# and the updates are becoming fewer, smaller, and less significant. 197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger""" 217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThis is a Py2.3 implementation of decimal floating point arithmetic based on 227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerthe General Decimal Arithmetic Specification: 237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger www2.hursley.ibm.com/decimal/decarith.html 257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 260ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerand IEEE standard 854-1987: 277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html 297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal floating point has finite precision with arbitrarily large bounds. 317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThe purpose of the module is to support arithmetic using familiar 337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"schoolhouse" rules and to avoid the some of tricky representation 347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerissues associated with binary floating point. The package is especially 357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingeruseful for financial applications or for contexts where users have 367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerexpectations that are at odds with binary floating point (for instance, 377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerin binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead 387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerof the expected Decimal("0.00") returned by decimal floating point). 397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerHere are some examples of using the decimal module: 417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> from decimal import * 43bd7f76dd04780304c397323ae994092ce759d5a2Raymond Hettinger>>> setcontext(ExtendedContext) 447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(0) 457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("0") 467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("1") 477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("1") 487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("-.0123") 497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("-0.0123") 507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(123456) 517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("123456") 527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("123.45e12345678901234567890") 537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("1.2345E+12345678901234567892") 547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("1.33") + Decimal("1.27") 557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("2.60") 567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41") 577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("-2.20") 587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> dig = Decimal(1) 597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3) 607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333 617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> getcontext().prec = 18 627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3) 637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333333333333 647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig.sqrt() 657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1 667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3).sqrt() 677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1.73205080756887729 687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3) ** 123 697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger4.85192780976896427E+58 707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> inf = Decimal(1) / Decimal(0) 717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print inf 727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity 737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> neginf = Decimal(-1) / Decimal(0) 747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf 757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity 767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf + inf 777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN 787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf * inf 797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity 807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0 817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity 82bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> getcontext().traps[DivisionByZero] = 1 837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0 847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last): 857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDivisionByZero: x / 0 897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c = Context() 90bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0 915aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation] 927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0 937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c.divide(Decimal(0), Decimal(0)) 947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("NaN") 95bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 1 965aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation] 977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1 985aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0 995aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation] 1007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0 1017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0)) 1027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last): 1037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 1047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 1057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ... 1065aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond HettingerInvalidOperation: 0 / 0 1075aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation] 1087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1 1095aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0 110bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0 1117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0)) 1127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN 1135aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation] 1147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1 1157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> 1167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger""" 1177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger__all__ = [ 1197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Two major classes 1207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'Decimal', 'Context', 1217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Contexts 1239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger 'DefaultContext', 'BasicContext', 'ExtendedContext', 1247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Exceptions 126d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger 'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero', 127d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger 'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow', 1287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Constants for use in setting up contexts 1307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING', 1317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 1327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Functions for manipulating contexts 1340ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger 'setcontext', 'getcontext' 1357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger] 1367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport copy 1387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Rounding 1400ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_DOWN = 'ROUND_DOWN' 1410ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_UP = 'ROUND_HALF_UP' 1420ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_EVEN = 'ROUND_HALF_EVEN' 1430ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_CEILING = 'ROUND_CEILING' 1440ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_FLOOR = 'ROUND_FLOOR' 1450ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_UP = 'ROUND_UP' 1460ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_DOWN = 'ROUND_HALF_DOWN' 1477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger#Rounding decision (not part of the public API) 1490ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerNEVER_ROUND = 'NEVER_ROUND' # Round in division (non-divmod), sqrt ONLY 1500ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerALWAYS_ROUND = 'ALWAYS_ROUND' # Every operation rounds at end. 1517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Errors 1537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DecimalException(ArithmeticError): 1555aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger """Base exception class. 1567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Used exceptions derive from this. 1587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If an exception derives from another exception besides this (such as 1597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Underflow (Inexact, Rounded, Subnormal) that indicates that it is only 1607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger called if the others are present. This isn't actually used for 1617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger anything, though. 1627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger handle -- Called when context._raise_error is called and the 1647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger trap_enabler is set. First argument is self, second is the 1657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context. More arguments can be given, those being after 1667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the explanation in _raise_error (For example, 1677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(NewError, '(-x)!', self._sign) would 1687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger call NewError().handle(context, self._sign).) 1697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger To define a new exception, it should be sufficient to have it derive 1717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger from DecimalException. 1727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 1747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger pass 1757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Clamped(DecimalException): 1787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Exponent of a 0 changed to fit bounds. 1797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals clamped if the exponent of a result has been 1817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger altered in order to fit the constraints of a specific concrete 1827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger representation. This may occur when the exponent of a zero result would 1837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger be outside the bounds of a representation, or when a large normal 1847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger number would have an encoded exponent that cannot be represented. In 1857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger this latter case, the exponent is reduced to fit and the corresponding 1867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger number of zero digits are appended to the coefficient ("fold-down"). 1877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidOperation(DecimalException): 1917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """An invalid operation was performed. 1927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Various bad things cause this: 1947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Something creates a signaling NaN 1967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -INF + INF 1977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 * (+-)INF 1987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (+-)INF / (+-)INF 1997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x % 0 2007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (+-)INF % x 2017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x._rescale( non-integer ) 2027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sqrt(-x) , x > 0 2037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 ** 0 2047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x ** (non-integer) 2057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x ** (+-)INF 2067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger An operand is invalid 2077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if args: 2107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if args[0] == 1: #sNaN, must drop 's' but keep diagnostics 2117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (args[1]._sign, args[1]._int, 'n') ) 2127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return NaN 2137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass ConversionSyntax(InvalidOperation): 2157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Trying to convert badly formed string. 2167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if an string is being 2187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger converted to a number and it does not conform to the numeric string 2197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger syntax. The result is [0,qNaN]. 2207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (0, (0,), 'n') #Passed to something which uses a tuple. 2247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionByZero(DecimalException, ZeroDivisionError): 2267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Division by 0. 2277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals division-by-zero if division of a finite number 2297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger by zero was attempted (during a divide-integer or divide operation, or a 2307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger power operation with negative right-hand operand), and the dividend was 2317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger not zero. 2327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result of the operation is [sign,inf], where sign is the exclusive 2347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger or of the signs of the operands for divide, or is 1 for an odd power of 2357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -0, for power. 2367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, sign, double = None, *args): 2397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if double is not None: 2407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Infsign[sign],)*2 2417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 2427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionImpossible(InvalidOperation): 2447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Cannot perform the division adequately. 2457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if the integer result of a 2477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger divide-integer or remainder operation had too many digits (would be 2487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger longer than precision). The result is [0,qNaN]. 2497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (NaN, NaN) 2537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionUndefined(InvalidOperation, ZeroDivisionError): 2557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Undefined result of division. 2567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if division by zero was 2587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger attempted (during a divide-integer, divide, or remainder operation), and 2597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the dividend is also zero. The result is [0,qNaN]. 2607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, tup=None, *args): 2637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if tup is not None: 2647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (NaN, NaN) #for 0 %0, 0 // 0 2657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return NaN 2667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Inexact(DecimalException): 2687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Had to round, losing information. 2697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals inexact whenever the result of an operation is 2717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger not exact (that is, it needed to be rounded and any discarded digits 2727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger were non-zero), or if an overflow or underflow condition occurs. The 2737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result in all cases is unchanged. 2747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The inexact signal may be tested (or trapped) to determine if a given 2767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation (or sequence of operations) was inexact. 2777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2785aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger pass 2797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidContext(InvalidOperation): 2817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Invalid context. Unknown rounding, for example. 2827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if an invalid context was 2847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger detected during an operation. This can occur if contexts are not checked 2857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger on creation and either the precision exceeds the capability of the 2867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger underlying concrete representation or an unknown or unsupported rounding 2877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger was specified. These aspects of the context need only be checked when 2887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the values are required to be used. The result is [0,qNaN]. 2897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return NaN 2937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Rounded(DecimalException): 2957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Number got rounded (not necessarily changed during rounding). 2967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals rounded whenever the result of an operation is 2987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounded (that is, some zero or non-zero digits were discarded from the 2997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger coefficient), or if an overflow or underflow condition occurs. The 3007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result in all cases is unchanged. 3017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The rounded signal may be tested (or trapped) to determine if a given 3037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation (or sequence of operations) caused a loss of precision. 3047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3055aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger pass 3067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Subnormal(DecimalException): 3087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Exponent < Emin before rounding. 3097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals subnormal whenever the result of a conversion or 3117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation is subnormal (that is, its adjusted exponent is less than 3127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Emin, before any rounding). The result in all cases is unchanged. 3137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The subnormal signal may be tested (or trapped) to determine if a given 3157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger or operation (or sequence of operations) yielded a subnormal result. 3167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger pass 3187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Overflow(Inexact, Rounded): 3207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Numerical overflow. 3217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals overflow if the adjusted exponent of a result 3237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (from a conversion or from an operation that is not an attempt to divide 3247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger by zero), after rounding, would be greater than the largest value that 3257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger can be handled by the implementation (the value Emax). 3267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result depends on the rounding mode: 3287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger For round-half-up and round-half-even (and for round-half-down and 3307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger round-up, if implemented), the result of the operation is [sign,inf], 3317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger where sign is the sign of the intermediate result. For round-down, the 3327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result is the largest finite number that can be represented in the 3337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger current precision, with the sign of the intermediate result. For 3347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger round-ceiling, the result is the same as for round-down if the sign of 3357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the intermediate result is 1, or is [0,inf] otherwise. For round-floor, 3367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the result is the same as for round-down if the sign of the intermediate 3377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded 3387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger will also be raised. 3397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, sign, *args): 3427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN, 3437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ROUND_HALF_DOWN, ROUND_UP): 3447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 3457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sign == 0: 3467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_CEILING: 3477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 3487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal((sign, (9,)*context.prec, 3497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.Emax-context.prec+1)) 3507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sign == 1: 3517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_FLOOR: 3527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 3537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (sign, (9,)*context.prec, 3547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.Emax-context.prec+1)) 3557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Underflow(Inexact, Rounded, Subnormal): 3587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Numerical underflow with result rounded to 0. 3597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals underflow if a result is inexact and the 3617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjusted exponent of the result would be smaller (more negative) than 3627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the smallest value that can be handled by the implementation (the value 3637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Emin). That is, the result is both inexact and subnormal. 3647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result after an underflow will be a subnormal number rounded, if 3667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger necessary, so that its exponent is not less than Etiny. This may result 3677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger in 0 with the sign of the intermediate result and an exponent of Etiny. 3687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger In all cases, Inexact, Rounded, and Subnormal will also be raised. 3707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3725aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# List of public traps and flags 373fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded, 3745aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger Underflow, InvalidOperation, Subnormal] 3757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3765aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# Map conditions (per the spec) to signals 3775aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger_condition_map = {ConversionSyntax:InvalidOperation, 3785aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger DivisionImpossible:InvalidOperation, 3795aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger DivisionUndefined:InvalidOperation, 3805aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger InvalidContext:InvalidOperation} 3817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Context Functions ####################################### 3837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 384ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# The getcontext() and setcontext() function manage access to a thread-local 385ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# current context. Py2.4 offers direct support for thread locals. If that 386ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# is not available, use threading.currentThread() which is slower but will 3877e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger# work for older Pythons. If threads are not part of the build, create a 3887e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger# mock threading object with threading.local() returning the module namespace. 3897e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger 3907e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingertry: 3917e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger import threading 3927e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingerexcept ImportError: 3937e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger # Python was compiled without threads; create a mock object instead 3947e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger import sys 3957e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger class MockThreading: 3967e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger def local(self, sys=sys): 3977e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger return sys.modules[__name__] 3987e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger threading = MockThreading() 3997e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger del sys, MockThreading 400ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 401ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingertry: 402ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger threading.local 403ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 404ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerexcept AttributeError: 405ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 406ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger #To fix reloading, force it to create a new context 407ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger #Old contexts have different exceptions in their dicts, making problems. 408ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if hasattr(threading.currentThread(), '__decimal_context__'): 409ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger del threading.currentThread().__decimal_context__ 410ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 411ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def setcontext(context): 412ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Set this thread's context to context.""" 413ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if context in (DefaultContext, BasicContext, ExtendedContext): 4149fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context.copy() 41561992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger context.clear_flags() 4167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger threading.currentThread().__decimal_context__ = context 417ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 418ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def getcontext(): 419ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Returns this thread's context. 420ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 421ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger If this thread does not yet have a context, returns 422ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger a new context and sets this thread's context. 423ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger New contexts are copies of DefaultContext. 424ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """ 425ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger try: 426ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return threading.currentThread().__decimal_context__ 427ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger except AttributeError: 428ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger context = Context() 429ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger threading.currentThread().__decimal_context__ = context 430ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return context 431ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 432ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerelse: 433ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 434ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger local = threading.local() 4359fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger if hasattr(local, '__decimal_context__'): 4369fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger del local.__decimal_context__ 437ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 438ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def getcontext(_local=local): 439ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Returns this thread's context. 440ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 441ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger If this thread does not yet have a context, returns 442ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger a new context and sets this thread's context. 443ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger New contexts are copies of DefaultContext. 444ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """ 445ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger try: 446ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return _local.__decimal_context__ 447ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger except AttributeError: 448ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger context = Context() 449ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger _local.__decimal_context__ = context 450ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return context 451ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 452ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def setcontext(context, _local=local): 453ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Set this thread's context to context.""" 454ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if context in (DefaultContext, BasicContext, ExtendedContext): 4559fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context.copy() 45661992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger context.clear_flags() 457ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger _local.__decimal_context__ = context 458ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 459ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger del threading, local # Don't contaminate the namespace 4607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Decimal class ########################################### 4637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Decimal(object): 4657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Floating point class for decimal arithmetic.""" 4667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 467636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger __slots__ = ('_exp','_int','_sign', '_is_special') 468636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Generally, the value of the Decimal instance is given by 469636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # (-1)**_sign * _int * 10**_exp 470636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Special values are signified by _is_special == True 4717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 472dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger # We're immutable, so use __new__ not __init__ 473636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger def __new__(cls, value="0", context=None): 4747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Create a decimal point instance. 4757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal('3.14') # string input 4777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3.14") 4787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal((0, (3, 1, 4), -2)) # tuple input (sign, digit_tuple, exponent) 4797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3.14") 4807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal(314) # int or long 4817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("314") 4827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal(Decimal(314)) # another decimal instance 4837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("314") 4847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 4857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 486636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self = object.__new__(cls) 487636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._is_special = False 488636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 489636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # From an internal working value 490636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(value, _WorkRep): 49117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger self._sign = value.sign 492636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._int = tuple(map(int, str(value.int))) 493636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._exp = int(value.exp) 494636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 495636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 496636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # From another decimal 497636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(value, Decimal): 498636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._exp = value._exp 499636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._sign = value._sign 500636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._int = value._int 501636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._is_special = value._is_special 502636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 503636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 504636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # From an integer 5057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(value, (int,long)): 506636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if value >= 0: 507636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._sign = 0 508636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger else: 509636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._sign = 1 510636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._exp = 0 511636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._int = tuple(map(int, str(abs(value)))) 512636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 513636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 514636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # tuple/list conversion (possibly from as_tuple()) 515636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(value, (list,tuple)): 516636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if len(value) != 3: 517636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger raise ValueError, 'Invalid arguments' 518636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if value[0] not in [0,1]: 519636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger raise ValueError, 'Invalid sign' 520636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger for digit in value[1]: 521636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not isinstance(digit, (int,long)) or digit < 0: 522636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger raise ValueError, "The second value in the tuple must be composed of non negative integer elements." 523636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 524636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._sign = value[0] 525636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._int = tuple(value[1]) 526636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if value[2] in ('F','n','N'): 527636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._exp = value[2] 528636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._is_special = True 529636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger else: 530636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._exp = int(value[2]) 531636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 532636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 533636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(value, float): 534636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger raise TypeError("Cannot convert float to Decimal. " + 535636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger "First convert the float to a string") 5367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 537636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Other argument types may require the context during interpretation 538636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 539636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 540636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 541636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # From a string 5427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # REs insist on real strings, so we can too. 5437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(value, basestring): 5440ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger if _isinfinity(value): 5457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._exp = 'F' 5467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._int = (0,) 547636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._is_special = True 548636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if _isinfinity(value) == 1: 5497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign = 0 5507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 5517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign = 1 552636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 5530ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger if _isnan(value): 5540ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger sig, sign, diag = _isnan(value) 555636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._is_special = True 5567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(diag) > context.prec: #Diagnostic info too long 5577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign, self._int, self._exp = \ 5587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(ConversionSyntax) 559636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 5607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sig == 1: 5617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._exp = 'n' #qNaN 5627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: #sig == 2 5637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._exp = 'N' #sNaN 5647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._sign = sign 5657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._int = tuple(map(int, diag)) #Diagnostic info 566636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 567d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger try: 568d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger self._sign, self._int, self._exp = _string2exact(value) 569d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger except ValueError: 570636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._is_special = True 571d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger self._sign, self._int, self._exp = context._raise_error(ConversionSyntax) 572636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 5737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 574636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger raise TypeError("Cannot convert %r to Decimal" % value) 5757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isnan(self): 5777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is not actually one. 5787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 if a number 5807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 if NaN 5817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2 if sNaN 5827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 583636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 584636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger exp = self._exp 585636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp == 'n': 586636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return 1 587636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger elif exp == 'N': 588636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return 2 5897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 5907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isinfinity(self): 5927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is infinite 5937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 if finite or not a number 5957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 if +INF 5967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -1 if -INF 5977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 5987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp == 'F': 5997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 6007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 6017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 6027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 6037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _check_nans(self, other = None, context=None): 6057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is not actually one. 6067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self, other are sNaN, signal 6087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self, other are NaN return nan 6097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 6107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Done before operations. 6127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 6137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 614636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self_is_nan = self._isnan() 615636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other is None: 616636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other_is_nan = False 617636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger else: 618636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other_is_nan = other._isnan() 619636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 620636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self_is_nan or other_is_nan: 621636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 622636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 623636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 624636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self_is_nan == 2: 625636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 'sNaN', 626636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1, self) 627636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other_is_nan == 2: 628636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 'sNaN', 629636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1, other) 630636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self_is_nan: 631636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 632636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 6337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other 6347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 6357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __nonzero__(self): 6377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Is the number non-zero? 6387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 if self == 0 6407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 if self != 0 6417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 642636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 6437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 644636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return sum(self._int) != 0 6457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __cmp__(self, other, context=None): 647636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 6487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 649636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 650636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 651636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 652636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return 1 # Comparison involving NaN's always reports self > other 653636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 654636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # INF = INF 655636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return cmp(self._isinfinity(), other._isinfinity()) 6567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self and not other: 6587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 #If both 0, sign comparison isn't certain. 6597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #If different signs, neg one is less 6617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._sign < self._sign: 6627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 6637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign < other._sign: 6647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 6657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 666636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self_adjusted = self.adjusted() 667636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other_adjusted = other.adjusted() 668636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self_adjusted == other_adjusted and \ 6697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._int + (0,)*(self._exp - other._exp) == \ 6707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other._int + (0,)*(other._exp - self._exp): 6717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 #equal, except in precision. ([0]*(-x) = []) 672636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger elif self_adjusted > other_adjusted and self._int[0] != 0: 6737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (-1)**self._sign 674636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger elif self_adjusted < other_adjusted and other._int[0] != 0: 6757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -((-1)**self._sign) 6767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 677636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Need to round, so make sure we have a valid context 678636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 679636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 680636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 6819fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context._shallow_copy() 6827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding(ROUND_UP) #round away from 0 6837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = context._ignore_all_flags() 6857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger res = self.__sub__(other, context=context) 6867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(*flags) 6887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.rounding = rounding 6907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not res: 6927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 6937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif res._sign: 6947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 6957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 6967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6970aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger def __eq__(self, other): 6980aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger if not isinstance(other, (Decimal, int, long)): 6990aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger return False 7000aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger return self.__cmp__(other) == 0 7010aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger 7020aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger def __ne__(self, other): 7030aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger if not isinstance(other, (Decimal, int, long)): 7040aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger return True 7050aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger return self.__cmp__(other) != 0 7060aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger 7077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def compare(self, other, context=None): 7087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Compares one to another. 7097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -1 => a < b 7117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 => a = b 7127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 => a > b 7137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN => one is NaN 7147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Like __cmp__, but returns Decimal instances. 7157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 716636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 7177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #compare(NaN, NaN) = NaN 719636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if (self._is_special or other and other._is_special): 720636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 721636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 722636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 7237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal(self.__cmp__(other, context)) 7257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __hash__(self): 7277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """x.__hash__() <==> hash(x)""" 7287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Decimal integers must hash the same as the ints 7297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Non-integer decimals are normalized and hashed as strings 7307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Normalization assures that hast(100E-1) == hash(10) 7317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger i = int(self) 7327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self == Decimal(i): 7337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return hash(i) 7347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger assert self.__nonzero__() # '-0' handled by integer case 7357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return hash(str(self.normalize())) 7367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def as_tuple(self): 7387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Represents the number as a triple tuple. 7397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger To show the internals exactly as they are. 7417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 7427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (self._sign, self._int, self._exp) 7437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __repr__(self): 7457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Represents the number as an instance of Decimal.""" 7467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Invariant: eval(repr(d)) == d 7477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 'Decimal("%s")' % str(self) 7487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __str__(self, eng = 0, context=None): 7507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return string representation of the number in scientific notation. 7517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Captures all of the information in the underlying representation. 7537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 7547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isnan(): 7567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger minus = '-'*self._sign 7577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._int == (0,): 7587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger info = '' 7597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 7607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger info = ''.join(map(str, self._int)) 7617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isnan() == 2: 7627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return minus + 'sNaN' + info 7637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return minus + 'NaN' + info 7647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 7657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger minus = '-'*self._sign 7667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return minus + 'Infinity' 7677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 7697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 7707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = map(str, self._int) 7727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger numdigits = len(self._int) 7737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger leftdigits = self._exp + numdigits 7747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if eng and not self: #self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY 7757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp < 0 and self._exp >= -6: #short, no need for e/E 7767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s = '-'*self._sign + '0.' + '0'*(abs(self._exp)) 7777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return s 7787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #exp is closest mult. of 3 >= self._exp 7797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = ((self._exp - 1)// 3 + 1) * 3 7807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp != self._exp: 7817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s = '0.'+'0'*(exp - self._exp) 7827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 7837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s = '0' 7847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp != 0: 7857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.capitals: 7867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s += 'E' 7877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 7887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s += 'e' 7897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp > 0: 7907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s += '+' #0.0e+3, not 0.0e3 7917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s += str(exp) 7927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s = '-'*self._sign + s 7937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return s 7947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if eng: 7957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dotplace = (leftdigits-1)%3+1 7967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjexp = leftdigits -1 - (leftdigits-1)%3 7977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 7987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjexp = leftdigits-1 7997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dotplace = 1 8007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp == 0: 8017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger pass 8027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif self._exp < 0 and adjexp >= 0: 8037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.insert(leftdigits, '.') 8047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif self._exp < 0 and adjexp >= -6: 8057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp[0:0] = ['0'] * int(-leftdigits) 8067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.insert(0, '0.') 8077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 8087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if numdigits > dotplace: 8097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.insert(dotplace, '.') 8107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif numdigits < dotplace: 8117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.extend(['0']*(dotplace-numdigits)) 8127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if adjexp: 8137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not context.capitals: 8147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.append('e') 8157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 8167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.append('E') 8177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if adjexp > 0: 8187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.append('+') 8197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.append(str(adjexp)) 8207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if eng: 8217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while tmp[0:1] == ['0']: 8227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp[0:1] = [] 8237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(tmp) == 0 or tmp[0] == '.' or tmp[0].lower() == 'e': 8247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp[0:0] = ['0'] 8257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 8267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.insert(0, '-') 8277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ''.join(tmp) 8297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_eng_string(self, context=None): 8317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Convert to engineering-type string. 8327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Engineering notation has an exponent which is a multiple of 3, so there 8347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger are up to 3 digits left of the decimal place. 8357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Same rules for when in exponential and when as a value as in __str__. 8377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 8387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__str__(eng=1, context=context) 8397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __neg__(self, context=None): 8417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a copy with the sign switched. 8427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds, if it has reason. 8447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 845636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 846636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 847636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 848636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 8497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 8517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # -Decimal('0') is Decimal('0'), not Decimal('-0') 8527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 0 8537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif self._sign: 8547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 0 8557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 8567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 857636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 858636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 859636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 8607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context._rounding_decision == ALWAYS_ROUND: 861dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return Decimal((sign, self._int, self._exp))._fix(context) 8627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (sign, self._int, self._exp)) 8637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __pos__(self, context=None): 8657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a copy, unless it is a sNaN. 8667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds the number (if more then precision digits) 8687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 869636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 870636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 871636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 872636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 8737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = self._sign 8757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 8767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # + (-0) = 0 8777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 0 8787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 879636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 880636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 881636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 8827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context._rounding_decision == ALWAYS_ROUND: 883dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = self._fix(context) 8847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 8857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(self) 8867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._sign = sign 8877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 8887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __abs__(self, round=1, context=None): 8907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the absolute value of self. 8917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the second argument is 0, do not round. 8937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 894636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 895636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 896636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 897636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 8987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not round: 900636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 901636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 9029fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context._shallow_copy() 9037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding_decision(NEVER_ROUND) 9047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 9067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self.__neg__(context=context) 9077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 9087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self.__pos__(context=context) 9097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 9117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __add__(self, other, context=None): 9137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns self + other. 9147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -INF + INF (or the reverse) cause InvalidOperation errors. 9167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 917636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 918636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 9197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 9207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 9217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 922636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 923636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 924636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 925636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 9267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 927636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity(): 928636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger #If both INF, same sign => same as both, opposite => error. 929636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._sign != other._sign and other._isinfinity(): 930636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, '-INF + INF') 931636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(self) 932636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other._isinfinity(): 933636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(other) #Can't both be infinity here 9347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger shouldround = context._rounding_decision == ALWAYS_ROUND 9367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = min(self._exp, other._exp) 9387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negativezero = 0 9397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_FLOOR and self._sign != other._sign: 9407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #If the answer is 0, the sign should be negative, in this case. 9417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negativezero = 1 9427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self and not other: 9447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = min(self._sign, other._sign) 9457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if negativezero: 9467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 9477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (sign, (0,), exp)) 9487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 94999b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista exp = max(exp, other._exp - context.prec-1) 9507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = other._rescale(exp, watchexp=0, context=context) 9517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 952dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 9537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 9547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not other: 95599b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista exp = max(exp, self._exp - context.prec-1) 9567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._rescale(exp, watchexp=0, context=context) 9577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 958dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 9597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 9607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1 = _WorkRep(self) 9627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2 = _WorkRep(other) 9637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1, op2 = _normalize(op1, op2, shouldround, context.prec) 9647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result = _WorkRep() 9667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if op1.sign != op2.sign: 9677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Equal and opposite 96817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op1.int == op2.int: 9697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp < context.Etiny(): 9707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = context.Etiny() 9717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Clamped) 9727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal((negativezero, (0,), exp)) 97317931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op1.int < op2.int: 9747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1, op2 = op2, op1 9757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #OK, now abs(op1) > abs(op2) 97617931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op1.sign == 1: 97717931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger result.sign = 1 9787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.sign, op2.sign = op2.sign, op1.sign 9797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 98017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger result.sign = 0 9817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #So we know the sign, and op1 > 0. 98217931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger elif op1.sign == 1: 9837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.sign = 1 98417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger op1.sign, op2.sign = (0, 0) 98517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger else: 98617931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger result.sign = 0 9877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Now, op1 > abs(op2) > 0 9887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 98917931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op2.sign == 0: 990636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger result.int = op1.int + op2.int 9917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 992636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger result.int = op1.int - op2.int 9937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.exp = op1.exp 9957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(result) 9967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 997dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 9987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 9997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __radd__ = __add__ 10017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __sub__(self, other, context=None): 10037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self + (-other)""" 1004636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 10057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1006636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1007636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context=context) 1008636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1009636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 10107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # -Decimal(0) = Decimal(0), which we don't want since 10127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # (-0 - 0 = -0 + (-0) = -0, but -0 + 0 = 0.) 10137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # so we change the sign directly to a copy 10147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal(other) 10157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._sign = 1-tmp._sign 10167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__add__(tmp, context=context) 10187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rsub__(self, other, context=None): 10207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return other + (-self)""" 1021636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 10227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal(self) 10247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._sign = 1 - tmp._sign 10257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__add__(tmp, context=context) 10267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _increment(self, round=1, context=None): 10287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Special case of add, adding 1eExponent 10297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Since it is common, (rounding, for example) this adds 10317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (sign)*one E self._exp to the number more efficiently than add. 10327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger For example: 10347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal('5.624e10')._increment() == Decimal('5.625e10') 10357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1036636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1037636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1038636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1039636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 1040636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1041636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(self) # Must be infinite, and incrementing makes no difference 10427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger L = list(self._int) 10447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger L[-1] += 1 10457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot = len(L)-1 10467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while L[spot] == 10: 10477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger L[spot] = 0 10487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if spot == 0: 10497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger L[0:0] = [1] 10507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 10517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger L[spot-1] += 1 10527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot -= 1 10537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal((self._sign, L, self._exp)) 10547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1055636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 1056636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 10577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if round and context._rounding_decision == ALWAYS_ROUND: 1058dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 10597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __mul__(self, other, context=None): 10627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self * other. 10637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (+-) INF * 0 (or its reverse) raise InvalidOperation. 10657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1066636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1067636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 10687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 10697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 10707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1071d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger resultsign = self._sign ^ other._sign 10727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1073636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1074636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 1075636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1076636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 1077636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1078636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity(): 1079636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not other: 1080636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, '(+-)INF * 0') 1081636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Infsign[resultsign] 1082636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1083636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other._isinfinity(): 1084636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not self: 1085636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, '0 * (+-)INF') 1086636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Infsign[resultsign] 10877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resultexp = self._exp + other._exp 10897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger shouldround = context._rounding_decision == ALWAYS_ROUND 10907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Special case for multiplying by zero 10927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self or not other: 10937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal((resultsign, (0,), resultexp)) 10947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 10957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Fixing in case the exponent is out of bounds 1096dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 10977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Special case for multiplying by power of 10 11007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._int == (1,): 11017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal((resultsign, other._int, resultexp)) 11027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 1103dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 11047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._int == (1,): 11067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal((resultsign, self._int, resultexp)) 11077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 1108dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 11097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1111636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger op1 = _WorkRep(self) 1112636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger op2 = _WorkRep(other) 1113636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1114636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = Decimal( (resultsign, map(int, str(op1.int * op2.int)), resultexp)) 11157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 1116dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 11177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __rmul__ = __mul__ 11207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __div__(self, other, context=None): 11227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self / other.""" 11237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._divide(other, context=context) 11247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __truediv__ = __div__ 11257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _divide(self, other, divmod = 0, context=None): 11277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return a / b, to context.prec precision. 11287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger divmod: 11307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 => true division 11317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 => (a //b, a%b) 11327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2 => a //b 11337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3 => a%b 11347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Actually, if divmod is 2 or 3 a tuple is returned, but errors for 11367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger computing the other value are not raised. 11377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1138636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1139636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 11407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 11417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 11427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1143636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger sign = self._sign ^ other._sign 1144636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1145636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1146636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 1147636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1148636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if divmod: 1149636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return (ans, ans) 11507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1152636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity() and other._isinfinity(): 1153636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if divmod: 1154636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return (context._raise_error(InvalidOperation, 1155636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger '(+-)INF // (+-)INF'), 1156636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context._raise_error(InvalidOperation, 1157636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger '(+-)INF % (+-)INF')) 11587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF') 11597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 11617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod == 1: 11627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Infsign[sign], 11637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(InvalidOperation, 'INF % x')) 11647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif divmod == 2: 11657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Infsign[sign], NaN) 11667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif divmod == 3: 11677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Infsign[sign], 11687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(InvalidOperation, 'INF % x')) 1169636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Infsign[sign] 1170636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1171636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other._isinfinity(): 1172636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if divmod: 1173636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return (Decimal((sign, (0,), 0)), Decimal(self)) 1174636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context._raise_error(Clamped, 'Division by infinity') 1175636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal((sign, (0,), context.Etiny())) 1176636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1177636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Special cases for zeroes 1178636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not self and not other: 1179636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if divmod: 1180636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(DivisionUndefined, '0 / 0', 1) 1181636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(DivisionUndefined, '0 / 0') 1182636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1183636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not self: 1184636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if divmod: 11857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside = Decimal(self) 11867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside._exp = min(self._exp, other._exp) 11877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal((sign, (0,), 0)), otherside) 1188636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger exp = self._exp - other._exp 1189636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp < context.Etiny(): 1190636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger exp = context.Etiny() 1191636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context._raise_error(Clamped, '0e-x / y') 1192636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp > context.Emax: 1193636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger exp = context.Emax 1194636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context._raise_error(Clamped, '0e+x / y') 1195636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal( (sign, (0,), exp) ) 11967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1197636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not other: 1198636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if divmod: 11997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionByZero, 'divmod(x,0)', 12007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign, 1) 1201636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(DivisionByZero, 'x / 0', sign) 12027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1203636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger #OK, so neither = 0, INF or NaN 12047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger shouldround = context._rounding_decision == ALWAYS_ROUND 12067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #If we're dividing into ints, and self < other, stop. 12087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #self.__abs__(0) does not round. 12097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod and (self.__abs__(0, context) < other.__abs__(0, context)): 12107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod == 1 or divmod == 3: 12127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = min(self._exp, other._exp) 12137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans2 = self._rescale(exp, context=context, watchexp=0) 12147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 1215dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans2 = ans2._fix(context) 12167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal( (sign, (0,), 0) ), 12177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans2) 12187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif divmod == 2: 12207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Don't round the mod part, if we don't need it. 12217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal( (sign, (0,), 0) ), Decimal(self)) 12227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1 = _WorkRep(self) 12247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2 = _WorkRep(other) 12257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1, op2, adjust = _adjust_coefficients(op1, op2) 1226636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger res = _WorkRep( (sign, 0, (op1.exp - op2.exp)) ) 12277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod and res.exp > context.prec + 1: 12287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionImpossible) 12297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1230636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger prec_limit = 10 ** context.prec 12317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while 1: 1232636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger while op2.int <= op1.int: 1233636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger res.int += 1 1234636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger op1.int -= op2.int 12357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if res.exp == 0 and divmod: 1236636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if res.int >= prec_limit and shouldround: 12377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionImpossible) 12387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside = Decimal(op1) 12397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger frozen = context._ignore_all_flags() 12407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = min(self._exp, other._exp) 124217931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger otherside = otherside._rescale(exp, context=context, watchexp=0) 12437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(*frozen) 12447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 1245dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger otherside = otherside._fix(context) 12467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal(res), otherside) 12477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1248636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if op1.int == 0 and adjust >= 0 and not divmod: 12497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 1250636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if res.int >= prec_limit and shouldround: 12517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if divmod: 12527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionImpossible) 12537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger shouldround=1 12547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Really, the answer is a bit higher, so adding a one to 12557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # the end will make sure the rounding is right. 1256636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if op1.int != 0: 1257636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger res.int *= 10 1258636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger res.int += 1 12597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger res.exp -= 1 12607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 1262636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger res.int *= 10 12637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger res.exp -= 1 12647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjust += 1 1265636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger op1.int *= 10 12667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.exp -= 1 12677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1268636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if res.exp == 0 and divmod and op2.int > op1.int: 12697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Solves an error in precision. Same as a previous block. 12707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1271636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if res.int >= prec_limit and shouldround: 12727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionImpossible) 12737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside = Decimal(op1) 12747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger frozen = context._ignore_all_flags() 12757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = min(self._exp, other._exp) 12777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger otherside = otherside._rescale(exp, context=context) 12787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(*frozen) 12807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (Decimal(res), otherside) 12827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(res) 12847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if shouldround: 1285dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 12867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 12877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rdiv__(self, other, context=None): 12897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __div__.""" 1290636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 12917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__div__(self, context=context) 12927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __rtruediv__ = __rdiv__ 12937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __divmod__(self, other, context=None): 12957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 12967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (self // other, self % other) 12977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 12987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._divide(other, 1, context) 12997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rdivmod__(self, other, context=None): 13017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __divmod__.""" 1302636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 13037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__divmod__(self, context=context) 13047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __mod__(self, other, context=None): 13067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 13077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self % other 13087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1309636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 13107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1311636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1312636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 1313636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1314636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 13157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self and not other: 13177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'x % 0') 13187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._divide(other, 3, context)[1] 13207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rmod__(self, other, context=None): 13227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __mod__.""" 1323636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 13247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__mod__(self, context=context) 13257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder_near(self, other, context=None): 13277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 13287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Remainder nearest to 0- abs(remainder-near) <= other/2 13297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1330636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 13317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1332636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1333636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 1334636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1335636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 13367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self and not other: 13377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'x % 0') 13387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1339636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 1340636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 13417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # If DivisionImpossible causes an error, do not leave Rounded/Inexact 13427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # ignored in the calling function. 13439fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context._shallow_copy() 13447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = context._ignore_flags(Rounded, Inexact) 13457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #keep DivisionImpossible flags 13467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (side, r) = self.__divmod__(other, context=context) 13477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if r._isnan(): 13497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(*flags) 13507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return r 13517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13529fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context._shallow_copy() 13537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding_decision(NEVER_ROUND) 13547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._sign: 13567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger comparison = other.__div__(Decimal(-2), context=context) 13577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 13587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger comparison = other.__div__(Decimal(2), context=context) 13597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding_decision(rounding) 13617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(*flags) 13627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s1, s2 = r._sign, comparison._sign 13647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = 0, 0 13657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if r < comparison: 13677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = s1, s2 13687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Get flags now 13697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.__divmod__(other, context=context) 1370dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return r._fix(context) 13717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = s1, s2 13727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding_decision(NEVER_ROUND) 13747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (side, r) = self.__divmod__(other, context=context) 13767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding_decision(rounding) 13777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if r._isnan(): 13787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return r 13797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger decrease = not side._iseven() 13817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding_decision(NEVER_ROUND) 13827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger side = side.__abs__(context=context) 13837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding_decision(rounding) 13847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger s1, s2 = r._sign, comparison._sign 13867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = 0, 0 13877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if r > comparison or decrease and r == comparison: 13887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = s1, s2 13897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec += 1 13907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(side.__add__(Decimal(1), context=context)._int) >= context.prec: 13917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec -= 1 13927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(DivisionImpossible)[1] 13937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec -= 1 13947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign == other._sign: 13957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r = r.__sub__(other, context=context) 13967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 13977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r = r.__add__(other, context=context) 13987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 13997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger r._sign, comparison._sign = s1, s2 14007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1401dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return r._fix(context) 14027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __floordiv__(self, other, context=None): 14047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """self // other""" 14057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._divide(other, 2, context)[0] 14067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rfloordiv__(self, other, context=None): 14087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __floordiv__.""" 1409636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 14107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__floordiv__(self, context=context) 14117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __float__(self): 14137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Float representation.""" 14147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return float(str(self)) 14157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __int__(self): 14177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts self to a int, truncating if necessary.""" 1418636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1419636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isnan(): 1420636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 1421636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidContext) 1422636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger elif self._isinfinity(): 1423636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger raise OverflowError, "Cannot convert infinity to long" 14247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 1425605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger s = ''.join(map(str, self._int)) + '0'*self._exp 1426605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger else: 1427605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger s = ''.join(map(str, self._int))[:self._exp] 1428605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger if s == '': 1429605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger s = '0' 1430605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger sign = '-'*self._sign 1431605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger return int(sign + s) 14327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __long__(self): 14347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts to a long. 14357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Equivalent to long(int(self)) 14377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 14387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return long(self.__int__()) 14397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1440dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger def _fix(self, context): 14417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Round if it is necessary to keep self within prec precision. 14427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds and fixes the exponent. Does not raise on a sNaN. 14447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Arguments: 14467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self - Decimal instance 14477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context - context used. 14487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1449636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 14507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self 14517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 14527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 1453dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger prec = context.prec 145499b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista ans = self._fixexponents(context) 14557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(ans._int) > prec: 1456dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._round(prec, context=context) 145799b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista ans = ans._fixexponents(context) 14587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 14597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 146099b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista def _fixexponents(self, context): 1461dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger """Fix the exponents and return a copy with the exponent in bounds. 1462dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger Only call if known to not be a special value. 1463dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger """ 1464dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger folddown = context._clamp 1465636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger Emin = context.Emin 146699b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista ans = self 1467636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans_adjusted = ans.adjusted() 1468636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans_adjusted < Emin: 14697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Etiny = context.Etiny() 14707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans._exp < Etiny: 14717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not ans: 147299b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista ans = Decimal(self) 14737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp = Etiny 14747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Clamped) 14757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 14767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._rescale(Etiny, context=context) 14777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #It isn't zero, and exp < Emin => subnormal 14787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Subnormal) 14797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.flags[Inexact]: 14807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Underflow) 14817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 14827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if ans: 14837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Only raise subnormal if non-zero. 14847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Subnormal) 1485636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger else: 1486636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger Etop = context.Etop() 1487636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if folddown and ans._exp > Etop: 14887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Clamped) 1489636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = ans._rescale(Etop, context=context) 1490636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger else: 1491636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger Emax = context.Emax 1492636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans_adjusted > Emax: 1493636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not ans: 149499b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista ans = Decimal(self) 1495636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans._exp = Emax 1496636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context._raise_error(Clamped) 1497636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 1498636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context._raise_error(Inexact) 1499636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context._raise_error(Rounded) 1500636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(Overflow, 'above Emax', ans._sign) 15017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round(self, prec=None, rounding=None, context=None): 15047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a rounded version of self. 15057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger You can specify the precision or rounding method. Otherwise, the 15077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context determines it. 15087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 15097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1510636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1511636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1512636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1513636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 1514636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1515636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity(): 1516636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(self) 1517636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 15187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 15197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 15207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if rounding is None: 15227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context.rounding 15237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec is None: 15247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec = context.prec 15257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 15277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec <= 0: 15287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dig = (0,) 15297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = len(self._int) - prec + self._exp 15307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 15317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dig = (0,) * prec 15327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = len(self._int) + self._exp - prec 15337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal((self._sign, dig, exp)) 15347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 15357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec == 0: 15387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger temp = Decimal(self) 15397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger temp._int = (0,)+temp._int 15407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec = 1 15417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif prec < 0: 15427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = self._exp + len(self._int) - prec - 1 15437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger temp = Decimal( (self._sign, (0, 1), exp)) 15447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec = 1 15457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 15467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger temp = Decimal(self) 15477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger numdigits = len(temp._int) 15497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec == numdigits: 15507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return temp 15517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # See if we need to extend precision 15537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger expdiff = prec - numdigits 15547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if expdiff > 0: 15557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = list(temp._int) 15567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp.extend([0] * expdiff) 15577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal( (temp._sign, tmp, temp._exp - expdiff)) 15587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #OK, but maybe all the lost digits are 0. 15617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger lostdigits = self._int[expdiff:] 15627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if lostdigits == (0,) * len(lostdigits): 15637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal( (temp._sign, temp._int[:prec], temp._exp - expdiff)) 15647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Rounded, but not Inexact 15657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 15667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Okay, let's round and lose data 15697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger this_function = getattr(temp, self._pick_rounding_function[rounding]) 15717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Now we've got the rounding function 15727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prec != context.prec: 15749fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context._shallow_copy() 15757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = prec 15767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = this_function(prec, expdiff, context) 15777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 15787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Inexact, 'Changed in rounding') 15797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 15817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _pick_rounding_function = {} 15837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_down(self, prec, expdiff, context): 15857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Also known as round-towards-0, truncate.""" 15867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (self._sign, self._int[:prec], self._exp - expdiff) ) 15877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_half_up(self, prec, expdiff, context, tmp = None): 15897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds 5 up (away from 0)""" 15907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if tmp is None: 15927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal( (self._sign,self._int[:prec], self._exp - expdiff)) 15937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._int[prec] >= 5: 15947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = tmp._increment(round=0, context=context) 15957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(tmp._int) > prec: 15967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1)) 15977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 15987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_half_even(self, prec, expdiff, context): 16007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Round 5 to even, rest to nearest.""" 16017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff)) 16037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger half = (self._int[prec] == 5) 16047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if half: 16057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for digit in self._int[prec+1:]: 16067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if digit != 0: 16077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger half = 0 16087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 16097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if half: 161061992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger if self._int[prec-1] & 1 == 0: 16117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 16127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_half_up(prec, expdiff, context, tmp) 16137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_half_down(self, prec, expdiff, context): 16157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Round 5 down""" 16167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff)) 16187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger half = (self._int[prec] == 5) 16197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if half: 16207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for digit in self._int[prec+1:]: 16217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if digit != 0: 16227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger half = 0 16237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 16247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if half: 16257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 16267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_half_up(prec, expdiff, context, tmp) 16277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_up(self, prec, expdiff, context): 16297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds away from 0.""" 16307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff) ) 16317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for digit in self._int[prec:]: 16327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if digit != 0: 16337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = tmp._increment(round=1, context=context) 16347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(tmp._int) > prec: 16357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1)) 16367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 16377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 16387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 16397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_ceiling(self, prec, expdiff, context): 16417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds up (not away from 0 if negative.)""" 16427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 16437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_down(prec, expdiff, context) 16447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 16457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_up(prec, expdiff, context) 16467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _round_floor(self, prec, expdiff, context): 16487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds down (not towards 0 if negative)""" 16497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self._sign: 16507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_down(prec, expdiff, context) 16517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 16527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._round_up(prec, expdiff, context) 16537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __pow__(self, n, modulo = None, context=None): 16557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self ** n (mod modulo) 16567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If modulo is None (default), don't take it mod modulo. 16587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1659636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger n = _convert_other(n) 1660636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 16617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 16627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 16637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1664636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or n._is_special or n.adjusted() > 8: 1665636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger #Because the spot << doesn't work with really big exponents 1666636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if n._isinfinity() or n.adjusted() > 8: 1667636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 'x ** INF') 16687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1669636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(n, context) 1670636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1671636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 16727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1673636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not n._isinteger(): 16747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'x ** (non-integer)') 16757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self and not n: 16777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, '0 ** 0') 16787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not n: 16807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal(1) 16817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self == Decimal(1): 16837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal(1) 16847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = self._sign and not n._iseven() 16867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger n = int(n) 16877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 16897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if modulo: 16907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'INF % x') 16917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if n > 0: 16927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 16937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (sign, (0,), 0) ) 16947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #with ludicrously large exponent, just raise an overflow and return inf. 16967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not modulo and n > 0 and (self._exp + len(self._int) - 1) * n > context.Emax \ 16977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger and self: 16987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal('inf') 17007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._sign = sign 17017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 17027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Inexact) 17037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Overflow, 'Big power', sign) 17047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 17057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elength = len(str(abs(n))) 17077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger firstprec = context.prec 17087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 170999148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger if not modulo and firstprec + elength + 1 > DefaultContext.Emax: 17107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(Overflow, 'Too much precision.', sign) 17117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger mul = Decimal(self) 17137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = Decimal(1) 17149fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context._shallow_copy() 17157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec + elength + 1 17167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if n < 0: 17177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #n is a long now, not Decimal instance 17187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger n = -n 17197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger mul = Decimal(1).__div__(mul, context=context) 17207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot = 1 17227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while spot <= n: 17237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot <<= 1 17247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot >>= 1 17267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Spot is the highest power of 2 less than n 17277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while spot: 17287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = val.__mul__(val, context=context) 17297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if val._isinfinity(): 17307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = Infsign[sign] 17317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 17327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if spot & n: 17337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = val.__mul__(mul, context=context) 17347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if modulo is not None: 17357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = val.__mod__(modulo, context=context) 17367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger spot >>= 1 17377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec 17387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 173976e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger if context._rounding_decision == ALWAYS_ROUND: 1740dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return val._fix(context) 17417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return val 17427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rpow__(self, other, context=None): 17447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __pow__.""" 1745636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 17467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__pow__(self, context=context) 17477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def normalize(self, context=None): 17497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Normalize- strip trailing 0s, change anything equal to 0 to 0e0""" 17507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1751636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1752636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1753636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1754636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 17557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1756dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger dup = self._fix(context) 17577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if dup._isinfinity(): 17587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return dup 17597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not dup: 17617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (dup._sign, (0,), 0) ) 17627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger end = len(dup._int) 17637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = dup._exp 17647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while dup._int[end-1] == 0: 17657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp += 1 17667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger end -= 1 17677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (dup._sign, dup._int[:end], exp) ) 17687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1770dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger def quantize(self, exp, rounding=None, context=None, watchexp=1): 17717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Quantize self so its exponent is the same as that of exp. 17727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Similar to self._rescale(exp._exp) but with error checking. 17747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1775636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or exp._is_special: 1776636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(exp, context) 1777636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1778636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 17797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1780636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp._isinfinity() or self._isinfinity(): 1781636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp._isinfinity() and self._isinfinity(): 1782636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self #if both are inf, it is OK 1783636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 1784636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 1785636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 1786636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 'quantize with one INF') 17877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._rescale(exp._exp, rounding, context, watchexp) 17887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def same_quantum(self, other): 17907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Test whether self and other have the same exponent. 17917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 17927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger same as self._exp == other._exp, except NaN == sNaN 17937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1794636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1795636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isnan() or other._isnan(): 1796636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self._isnan() and other._isnan() and True 1797636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity() or other._isinfinity(): 1798636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self._isinfinity() and other._isinfinity() and True 17997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._exp == other._exp 18007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1801dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger def _rescale(self, exp, rounding=None, context=None, watchexp=1): 18027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rescales so that the exponent is exp. 18037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = exp to scale to (an integer) 18057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = rounding version 18067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger watchexp: if set (default) an error is returned if exp is greater 18077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger than Emax or less than Etiny. 18087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 18097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 18107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 18117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1812636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1813636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity(): 1814636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 'rescale with an INF') 18157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1816636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1817636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1818636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 18197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if watchexp and (context.Emax < exp or context.Etiny() > exp): 18217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'rescale(a, INF)') 18227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 18247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(self) 18257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._int = (0,) 18267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp = exp 18277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 18287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger diff = self._exp - exp 1830dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger digits = len(self._int) + diff 18317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if watchexp and digits > context.prec: 18337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'Rescale > prec') 18347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal(self) 1836dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger tmp._int = (0,) + tmp._int 18377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger digits += 1 18387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if digits < 0: 18407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._exp = -digits + tmp._exp 18417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._int = (0,1) 18427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger digits = 1 18437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = tmp._round(digits, rounding, context=context) 18447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if tmp._int[0] == 0 and len(tmp._int) > 1: 18467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._int = tmp._int[1:] 18477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._exp = exp 18487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1849636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger tmp_adjusted = tmp.adjusted() 1850636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if tmp and tmp_adjusted < context.Emin: 18517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Subnormal) 1852636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger elif tmp and tmp_adjusted > context.Emax: 18537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'rescale(a, INF)') 18547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return tmp 18557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1856dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger def to_integral(self, rounding=None, context=None): 18577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds to the nearest integer, without raising inexact, rounded.""" 1858636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1859636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1860636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1861636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 18627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 18637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self 1864636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 1865636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 18667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = context._ignore_flags(Rounded, Inexact) 18677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self._rescale(0, rounding, context=context) 18687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(flags) 18697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 18707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def sqrt(self, context=None): 18727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the square root of self. 18737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Uses a converging algorithm (Xn+1 = 0.5*(Xn + self / Xn)) 18757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Should quadratically approach the right answer. 18767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1877636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1878636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1879636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1880636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 18817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1882636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity() and self._sign == 0: 1883636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(self) 18847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 18857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 18867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #exponent = self._exp / 2, using round_down. 18877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #if self._exp < 0: 18887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # exp = (self._exp+1) // 2 18897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #else: 18907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = (self._exp) // 2 18917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign == 1: 18927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #sqrt(-0) = -0 18937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (1, (0,), exp)) 18947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 18957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Decimal( (0, (0,), exp)) 18967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1897636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 1898636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 1899636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 19007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign == 1: 19017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0') 19027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = Decimal(self) 19047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19054837a223eea09681f0bf41d41882cad5ade0f6abRaymond Hettinger expadd = tmp._exp // 2 190661992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger if tmp._exp & 1: 19077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._int += (0,) 19087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._exp = 0 19097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 19107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp._exp = 0 19117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19129fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context._shallow_copy() 19137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = context._ignore_all_flags() 19147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger firstprec = context.prec 19157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = 3 191661992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger if tmp.adjusted() & 1 == 0: 19177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal( (0, (8,1,9), tmp.adjusted() - 2) ) 19187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans.__add__(tmp.__mul__(Decimal((0, (2,5,9), -2)), 19197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context=context), context=context) 19204837a223eea09681f0bf41d41882cad5ade0f6abRaymond Hettinger ans._exp -= 1 + tmp.adjusted() // 2 19217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 19227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal( (0, (2,5,9), tmp._exp + len(tmp._int)- 3) ) 19237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans.__add__(tmp.__mul__(Decimal((0, (8,1,9), -3)), 19247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context=context), context=context) 19254837a223eea09681f0bf41d41882cad5ade0f6abRaymond Hettinger ans._exp -= 1 + tmp.adjusted() // 2 19267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #ans is now a linear approximation. 19287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Emax, Emin = context.Emax, context.Emin 193099148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger context.Emax, context.Emin = DefaultContext.Emax, DefaultContext.Emin 19317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger half = Decimal('0.5') 19337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger maxp = firstprec + 2 19357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding(ROUND_HALF_EVEN) 19367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while 1: 19377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = min(2*context.prec - 2, maxp) 19387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = half.__mul__(ans.__add__(tmp.__div__(ans, context=context), 19397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context=context), context=context) 19407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.prec == maxp: 19417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 19427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #round to the answer's precision-- the only error can be 1 ulp. 19447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec 19457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prevexp = ans.adjusted() 19467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._round(context=context) 19477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Now, check if the other last digits are better. 19497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec + 1 19507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # In case we rounded up another digit and we should actually go lower. 19517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if prevexp != ans.adjusted(): 19527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._int += (0,) 19537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp -= 1 19547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger lower = ans.__sub__(Decimal((0, (5,), ans._exp-1)), context=context) 19577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding(ROUND_UP) 19587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if lower.__mul__(lower, context=context) > (tmp): 19597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans.__sub__(Decimal((0, (1,), ans._exp)), context=context) 19607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 19627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger upper = ans.__add__(Decimal((0, (5,), ans._exp-1)),context=context) 19637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding(ROUND_DOWN) 19647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if upper.__mul__(upper, context=context) < tmp: 19657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans.__add__(Decimal((0, (1,), ans._exp)),context=context) 19667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans._exp += expadd 19687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec 19707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.rounding = rounding 1971dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 19727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding_decision(NEVER_ROUND) 19747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not ans.__mul__(ans, context=context) == self: 19757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Only rounded/inexact if here. 19767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(flags) 19777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 19787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Inexact) 19797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 19807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Exact answer, so let's set the exponent right. 19817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #if self._exp < 0: 19827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # exp = (self._exp +1)// 2 19837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #else: 19847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = self._exp // 2 19857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec += ans._exp - exp 19867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = ans._rescale(exp, context=context) 19877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.prec = firstprec 19887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._regard_flags(flags) 19897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context.Emax, context.Emin = Emax, Emin 19907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1991dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return ans._fix(context) 19927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def max(self, other, context=None): 19947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the larger value. 19957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 19967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger like max(self, other) except if one is not a number, returns 19977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN (and signals if one is sNaN). Also rounds. 19987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1999636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 2000636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2001636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 2002636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # if one operand is a quiet NaN and the other is number, then the 2003636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # number is always returned 2004636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger sn = self._isnan() 2005636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger on = other._isnan() 2006636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if sn or on: 2007636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if on == 1 and sn != 2: 2008636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 2009636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if sn == 1 and on != 2: 2010636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return other 2011636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self._check_nans(other, context) 20127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self 2014d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger c = self.__cmp__(other) 2015d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger if c == 0: 2016d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # if both operands are finite and equal in numerical value 2017d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # then an ordering is applied: 2018d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # 2019d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # if the signs differ then max returns the operand with the 2020d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # positive sign and min returns the operand with the negative sign 2021d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # 2022d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # if the signs are the same then the exponent is used to select 2023d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # the result. 2024d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger if self._sign != other._sign: 2025d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger if self._sign: 2026d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger ans = other 2027d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger elif self._exp < other._exp and not self._sign: 2028d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger ans = other 2029d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger elif self._exp > other._exp and self._sign: 2030d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger ans = other 2031d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger elif c == -1: 20327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = other 2033636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2034636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 2035636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 203676e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger if context._rounding_decision == ALWAYS_ROUND: 203776e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger return ans._fix(context) 203876e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger return ans 20397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def min(self, other, context=None): 20417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the smaller value. 20427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger like min(self, other) except if one is not a number, returns 20447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN (and signals if one is sNaN). Also rounds. 20457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2046636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 2047636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2048636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 2049636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # if one operand is a quiet NaN and the other is number, then the 2050636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # number is always returned 2051636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger sn = self._isnan() 2052636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger on = other._isnan() 2053636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if sn or on: 2054636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if on == 1 and sn != 2: 2055636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 2056636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if sn == 1 and on != 2: 2057636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return other 2058636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self._check_nans(other, context) 20597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self 2061d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger c = self.__cmp__(other) 2062d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger if c == 0: 2063d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # if both operands are finite and equal in numerical value 2064d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # then an ordering is applied: 2065d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # 2066d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # if the signs differ then max returns the operand with the 2067d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # positive sign and min returns the operand with the negative sign 2068d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # 2069d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # if the signs are the same then the exponent is used to select 2070d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # the result. 2071d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger if self._sign != other._sign: 2072d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger if other._sign: 2073d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger ans = other 2074d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger elif self._exp > other._exp and not self._sign: 2075d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger ans = other 2076d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger elif self._exp < other._exp and self._sign: 2077d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger ans = other 2078d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger elif c == 1: 20797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = other 2080636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2081636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 2082636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 208376e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger if context._rounding_decision == ALWAYS_ROUND: 208476e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger return ans._fix(context) 208576e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger return ans 20867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isinteger(self): 20887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether self is an integer""" 20897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 20907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return True 20917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rest = self._int[self._exp:] 20927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return rest == (0,)*len(rest) 20937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 20947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _iseven(self): 20957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns 1 if self is even. Assumes self is an integer.""" 20967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp > 0: 20977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 209861992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger return self._int[-1+self._exp] & 1 == 0 20997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def adjusted(self): 21017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the adjusted exponent of self""" 21027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger try: 21037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._exp + len(self._int) - 1 21047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #If NaN or Infinity, self._exp is string 21057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger except TypeError: 21067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 21077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # support for pickling, copy, and deepcopy 21097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __reduce__(self): 21107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (self.__class__, (str(self),)) 21117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __copy__(self): 21137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if type(self) == Decimal: 21147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self # I'm immutable; therefore I am my own clone 21157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__class__(str(self)) 21167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __deepcopy__(self, memo): 21187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if type(self) == Decimal: 21197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self # My components are also immutable 21207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__class__(str(self)) 21217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2122d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger##### Context class ########################################### 2123d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger 21247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# get rounding method function: 21267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerrounding_functions = [name for name in Decimal.__dict__.keys() if name.startswith('_round_')] 21277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerfor name in rounding_functions: 21287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #name is like _round_half_even, goes to the global ROUND_HALF_EVEN value. 21297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger globalname = name[1:].upper() 21307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = globals()[globalname] 21317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal._pick_rounding_function[val] = name 21327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21339ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettingerdel name, val, globalname, rounding_functions 21347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Context(object): 21367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Contains the context for a Decimal instance. 21377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 21387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Contains: 21397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec - precision (for use in rounding, division, square roots..) 21407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding - rounding type. (how you round) 21417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round? 2142bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps - If traps[exception] = 1, then the exception is 21437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raised when it is caused. Otherwise, a value is 21447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger substituted in. 21457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags - When an exception is caused, flags[exception] is incremented. 21467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (Whether or not the trap_enabler is set) 21477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Should be reset by user of Decimal instance. 21480ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emin - Minimum exponent 21490ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emax - Maximum exponent 21507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger capitals - If 1, 1*10^1 is printed as 1E+1. 21517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If 0, printed as 1e1 2152e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger _clamp - If 1, change exponents if too high (Default 0) 21537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 21549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger 21557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __init__(self, prec=None, rounding=None, 2156abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger traps=None, flags=None, 21577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _rounding_decision=None, 21580ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emin=None, Emax=None, 2159e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger capitals=None, _clamp=0, 2160abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger _ignored_flags=None): 2161abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger if flags is None: 2162abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger flags = [] 2163abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger if _ignored_flags is None: 2164abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger _ignored_flags = [] 2165bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if not isinstance(flags, dict): 2166fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger flags = dict([(s,s in flags) for s in _signals]) 2167b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger del s 2168bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if traps is not None and not isinstance(traps, dict): 2169fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger traps = dict([(s,s in traps) for s in _signals]) 2170b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger del s 21717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for name, val in locals().items(): 21727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if val is None: 21737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger setattr(self, name, copy.copy(getattr(DefaultContext, name))) 21747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 21757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger setattr(self, name, val) 21767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger del self.self 21777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2178b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger def __repr__(self): 2179bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger """Show the current context.""" 2180b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger s = [] 2181bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger s.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' % vars(self)) 2182bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger s.append('flags=[' + ', '.join([f.__name__ for f, v in self.flags.items() if v]) + ']') 2183bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger s.append('traps=[' + ', '.join([t.__name__ for t, v in self.traps.items() if v]) + ']') 2184b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger return ', '.join(s) + ')' 2185b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger 2186d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger def clear_flags(self): 2187d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger """Reset all flags to zero""" 2188d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger for flag in self.flags: 2189b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger self.flags[flag] = 0 2190d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger 21919fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger def _shallow_copy(self): 21929fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger """Returns a shallow copy from self.""" 2193bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger nc = Context(self.prec, self.rounding, self.traps, self.flags, 21947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._rounding_decision, self.Emin, self.Emax, 21957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.capitals, self._clamp, self._ignored_flags) 21967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return nc 21979fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger 21989fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger def copy(self): 21999fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger """Returns a deep copy from self.""" 22009fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger nc = Context(self.prec, self.rounding, self.traps.copy(), self.flags.copy(), 22019fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger self._rounding_decision, self.Emin, self.Emax, 22029fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger self.capitals, self._clamp, self._ignored_flags) 22039fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger return nc 22049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger __copy__ = copy 22057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22065aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger def _raise_error(self, condition, explanation = None, *args): 22077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Handles an error 22087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the flag is in _ignored_flags, returns the default response. 22107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Otherwise, it increments the flag, then, if the corresponding 22117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger trap_enabler is set, it reaises the exception. Otherwise, it returns 22127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the default value after incrementing the flag. 22137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 22145aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger error = _condition_map.get(condition, condition) 22157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if error in self._ignored_flags: 22167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Don't touch the flag 22177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return error().handle(self, *args) 22187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.flags[error] += 1 2220bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if not self.traps[error]: 22217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #The errors define how to handle themselves. 22225aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger return condition().handle(self, *args) 22237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Errors should only be risked on copies of the context 22257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #self._ignored_flags = [] 22267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raise error, explanation 22277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _ignore_all_flags(self): 22297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Ignore all flags, if they are raised""" 2230fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger return self._ignore_flags(*_signals) 22317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _ignore_flags(self, *flags): 22337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Ignore the flags, if they are raised""" 22347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Do not mutate-- This way, copies of a context leave the original 22357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # alone. 22367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._ignored_flags = (self._ignored_flags + list(flags)) 22377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return list(flags) 22387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _regard_flags(self, *flags): 22407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Stop ignoring the flags, if they are raised""" 22417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if flags and isinstance(flags[0], (tuple,list)): 22427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = flags[0] 22437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for flag in flags: 22447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._ignored_flags.remove(flag) 22457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22465aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger def __hash__(self): 22475aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger """A Context cannot be hashed.""" 22485aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger # We inherit object.__hash__, so we must deny this explicitly 22495aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger raise TypeError, "Cannot hash a Context." 22505aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger 22517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def Etiny(self): 22527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns Etiny (= Emin - prec + 1)""" 22537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(self.Emin - self.prec + 1) 22547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def Etop(self): 2256e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger """Returns maximum exponent (= Emax - prec + 1)""" 22577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(self.Emax - self.prec + 1) 22587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _set_rounding_decision(self, type): 22607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Sets the rounding decision. 22617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Sets the rounding decision, and returns the current (previous) 22637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding decision. Often used like: 22647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22659fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context._shallow_copy() 22667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # That so you don't change the calling context 22677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # if an error occurs in the middle (say DivisionImpossible is raised). 22687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding_decision(NEVER_ROUND) 22707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger instance = instance / Decimal(2) 22717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding_decision(rounding) 22727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This will make it not round for that operation. 22747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 22757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = self._rounding_decision 22777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._rounding_decision = type 22787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return rounding 22797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _set_rounding(self, type): 22817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Sets the rounding type. 22827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Sets the rounding type, and returns the current (previous) 22847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding type. Often used like: 22857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 22877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # so you don't change the calling context 22887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # if an error occurs in the middle. 22897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding(ROUND_UP) 22907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = self.__sub__(other, context=context) 22917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding(rounding) 22927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This will make it round up for that operation. 22947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 22957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = self.rounding 22967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.rounding= type 22977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return rounding 22987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2299fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger def create_decimal(self, num='0'): 23007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Creates a new Decimal instance but using self as context.""" 23017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger d = Decimal(num, context=self) 2302dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return d._fix(self) 23037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #Methods 23057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def abs(self, a): 23067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the absolute value of the operand. 23077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the operand is negative, the result is the same as using the minus 23097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation on the operand. Otherwise, the result is the same as using 23107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the plus operation on the operand. 23117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23129ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('2.1')) 23137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.1") 23149ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('-100')) 23157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("100") 23169ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('101.5')) 23177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("101.5") 23189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('-101.5')) 23197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("101.5") 23207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__abs__(context=self) 23227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def add(self, a, b): 23247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the sum of the two operands. 23257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.add(Decimal('12'), Decimal('7.00')) 23277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("19.00") 23289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4')) 23297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.02E+4") 23307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__add__(b, context=self) 23327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _apply(self, a): 2334dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return str(a._fix(self)) 23357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def compare(self, a, b): 23377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Compares values numerically. 23387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the signs of the operands differ, a value representing each operand 23407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ('-1' if the operand is less than zero, '0' if the operand is zero or 23417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negative zero, or '1' if the operand is greater than zero) is used in 23427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger place of that operand for the comparison instead of the actual 23437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operand. 23447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The comparison is then effected by subtracting the second operand from 23467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the first and then returning a value according to the result of the 23477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger subtraction: '-1' if the result is less than zero, '0' if the result is 23487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger zero or negative zero, or '1' if the result is greater than zero. 23497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3')) 23517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1") 23529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1')) 23537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 23549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10')) 23557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 23569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1')) 23577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 23589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3')) 23597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 23609ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1')) 23617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1") 23627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.compare(b, context=self) 23647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divide(self, a, b): 23667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Decimal division in a specified context. 23677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1'), Decimal('3')) 23697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.333333333") 23709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2'), Decimal('3')) 23717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.666666667") 23729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('5'), Decimal('2')) 23737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.5") 23749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1'), Decimal('10')) 23757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.1") 23769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('12'), Decimal('12')) 23777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 23789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2')) 23797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("4.00") 23809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0')) 23817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.20") 23829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1000'), Decimal('100')) 23837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("10") 23849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1000'), Decimal('1')) 23857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1000") 23869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2')) 23877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.20E+6") 23887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__div__(b, context=self) 23907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divide_int(self, a, b): 23927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Divides two numbers and returns the integer part of the result. 23937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3')) 23957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 23969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3')) 23977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3") 23989ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3')) 23997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3") 24007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 24017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__floordiv__(b, context=self) 24027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divmod(self, a, b): 24047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__divmod__(b, context=self) 24057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def max(self, a,b): 24077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """max compares two values numerically and returns the maximum. 24087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If either operand is a NaN then the general rules apply. 24107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Otherwise, the operands are compared as as though by the compare 24117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation. If they are numerically equal then the left-hand operand 24127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger is chosen as the result. Otherwise the maximum (closer to positive 24137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger infinity) of the two operands is chosen as the result. 24147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24159ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('3'), Decimal('2')) 24167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3") 24179ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('-10'), Decimal('3')) 24187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3") 24199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('1.0'), Decimal('1')) 2420d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger Decimal("1") 2421d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger >>> ExtendedContext.max(Decimal('7'), Decimal('NaN')) 2422d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger Decimal("7") 24237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 24247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.max(b, context=self) 24257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def min(self, a,b): 24277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """min compares two values numerically and returns the minimum. 24287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If either operand is a NaN then the general rules apply. 24307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Otherwise, the operands are compared as as though by the compare 24317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation. If they are numerically equal then the left-hand operand 24327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger is chosen as the result. Otherwise the minimum (closer to negative 24337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger infinity) of the two operands is chosen as the result. 24347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24359ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('3'), Decimal('2')) 24367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2") 24379ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('-10'), Decimal('3')) 24387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-10") 24399ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('1.0'), Decimal('1')) 24407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0") 2441d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger >>> ExtendedContext.min(Decimal('7'), Decimal('NaN')) 2442d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger Decimal("7") 24437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 24447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.min(b, context=self) 24457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def minus(self, a): 24477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Minus corresponds to unary prefix minus in Python. 24487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is evaluated using the same rules as subtract; the 24507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation minus(a) is calculated as subtract('0', a) where the '0' 24517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger has the same exponent as the operand. 24527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.minus(Decimal('1.3')) 24547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1.3") 24559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.minus(Decimal('-1.3')) 24567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.3") 24577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 24587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__neg__(context=self) 24597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def multiply(self, a, b): 24617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """multiply multiplies two operands. 24627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If either operand is a special value then the general rules apply. 24647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Otherwise, the operands are multiplied together ('long multiplication'), 24657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resulting in a number which may be as long as the sum of the lengths 24667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger of the two operands. 24677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3')) 24697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3.60") 24709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('7'), Decimal('3')) 24717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("21") 24729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8')) 24737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.72") 24749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0')) 24757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0.0") 24769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321')) 24777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("4.28135971E+11") 24787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 24797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__mul__(b, context=self) 24807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def normalize(self, a): 2482e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger """normalize reduces an operand to its simplest form. 24837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Essentially a plus operation with all trailing zeros removed from the 24857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result. 24867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('2.1')) 24887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.1") 24899ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('-2.0')) 24907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-2") 24919ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('1.200')) 24927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.2") 24939ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('-120')) 24947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1.2E+2") 24959ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('120.00')) 24967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.2E+2") 24979ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('0.00')) 24987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 24997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 25007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.normalize(context=self) 25017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def plus(self, a): 25037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Plus corresponds to unary prefix plus in Python. 25047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is evaluated using the same rules as add; the 25067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation plus(a) is calculated as add('0', a) where the '0' 25077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger has the same exponent as the operand. 25087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.plus(Decimal('1.3')) 25107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.3") 25119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.plus(Decimal('-1.3')) 25127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1.3") 25137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 25147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__pos__(context=self) 25157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def power(self, a, b, modulo=None): 25177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Raises a to the power of b, to modulo if given. 25187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The right-hand operand must be a whole number whose integer part (after 25207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger any exponent has been applied) has no more than 9 digits and whose 25217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger fractional part (if any) is all zeros before any rounding. The operand 25227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger may be positive, negative, or zero; if negative, the absolute value of 25237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the power is used, and the left-hand operand is inverted (divided into 25247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1) before use. 25257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the increased precision needed for the intermediate calculations 25277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exceeds the capabilities of the implementation then an Invalid operation 25287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger condition is raised. 25297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If, when raising to a negative power, an underflow occurs during the 25317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger division into 1, the operation is not halted at that point but 25327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger continues. 25337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25349ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('2'), Decimal('3')) 25357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("8") 25369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('2'), Decimal('-3')) 25377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.125") 25389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('1.7'), Decimal('8')) 25397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("69.7575744") 25409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-2')) 25417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 25429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-1')) 25437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 25449ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('Infinity'), Decimal('0')) 25457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 25469ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('Infinity'), Decimal('1')) 25477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("Infinity") 25489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('Infinity'), Decimal('2')) 25497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("Infinity") 25509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-2')) 25517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 25529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-1')) 25537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0") 25549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('0')) 25557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 25569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('1')) 25577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-Infinity") 25589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('2')) 25597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("Infinity") 25609ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.power(Decimal('0'), Decimal('0')) 25617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("NaN") 25627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 25637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__pow__(b, modulo, context=self) 25647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def quantize(self, a, b): 25667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a value equal to 'a' (rounded) and having the exponent of 'b'. 25677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The coefficient of the result is derived from that of the left-hand 25697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operand. It may be rounded using the current rounding setting (if the 25707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exponent is being increased), multiplied by a positive power of ten (if 25717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the exponent is being decreased), or is unchanged (if the exponent is 25727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger already equal to that of the right-hand operand). 25737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Unlike other operations, if the length of the coefficient after the 25757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger quantize operation would be greater than precision then an Invalid 25767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation condition is raised. This guarantees that, unless there is an 25777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger error condition, the exponent of the result of a quantize is always 25787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger equal to that of the right-hand operand. 25797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Also unlike other operations, quantize will never raise Underflow, even 25817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if the result is subnormal and inexact. 25827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001')) 25847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.170") 25859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01')) 25867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.17") 25879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1')) 25887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.2") 25899ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0')) 25907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2") 25919ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1')) 25927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0E+1") 25939ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity')) 25947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-Infinity") 25959ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity')) 25967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("NaN") 25979ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1')) 25987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0") 25999ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5')) 26007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0E+5") 26019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2')) 26027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("NaN") 26039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2')) 26047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("NaN") 26059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1')) 26067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("217.0") 26079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0')) 26087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("217") 26099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1')) 26107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.2E+2") 26119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2')) 26127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2E+2") 26137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 26147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.quantize(b, context=self) 26157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder(self, a, b): 26177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the remainder from integer division. 26187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result is the residue of the dividend after the operation of 26207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger calculating integer division as described for divide-integer, rounded to 26217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger precision digits if necessary. The sign of the result, if non-zero, is 26227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the same as that of the original dividend. 26237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This operation will fail under the same conditions as integer division 26257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (that is, if integer division on the same two operands would fail, the 26267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger remainder cannot be calculated). 26277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3')) 26297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.1") 26309ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10'), Decimal('3')) 26317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 26329ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3')) 26337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1") 26349ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1')) 26357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.2") 26369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3')) 26377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.1") 26389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3')) 26397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0") 26407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 26417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__mod__(b, context=self) 26427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder_near(self, a, b): 26447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns to be "a - b * n", where n is the integer nearest the exact 26457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger value of "x / b" (if two integers are equally near then the even one 26467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger is chosen). If the result is equal to 0 then its sign will be the 26477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign of a. 26487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This operation will fail under the same conditions as integer division 26507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (that is, if integer division on the same two operands would fail, the 26517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger remainder cannot be calculated). 26527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3')) 26547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0.9") 26559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6')) 26567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-2") 26579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3')) 26587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 26599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3')) 26607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-1") 26619ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1')) 26627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.2") 26639ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3')) 26647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.1") 26659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3')) 26667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0.3") 26677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 26687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.remainder_near(b, context=self) 26697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def same_quantum(self, a, b): 26717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns True if the two operands have the same exponent. 26727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result is never affected by either the sign or the coefficient of 26747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger either operand. 26757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001')) 26777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger False 26789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01')) 26797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger True 26809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1')) 26817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger False 26829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf')) 26837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger True 26847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 26857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.same_quantum(b) 26867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def sqrt(self, a): 26887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the square root of a non-negative number to context precision. 26897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the result must be inexact, it is rounded using the round-half-even 26917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger algorithm. 26927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26939ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('0')) 26947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0") 26959ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('-0')) 26967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0") 26979ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('0.39')) 26987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.624499800") 26999ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('100')) 27007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("10") 27019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1')) 27027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1") 27039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1.0')) 27047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0") 27059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1.00')) 27067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0") 27079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('7')) 27087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2.64575131") 27099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('10')) 27107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("3.16227766") 27119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.prec 27126ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger 9 27137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 27147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.sqrt(context=self) 27157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def subtract(self, a, b): 27177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the sum of the two operands. 27187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07')) 27207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.23") 27219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30')) 27227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("0.00") 27239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07')) 27247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-0.77") 27257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 27267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__sub__(b, context=self) 27277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_eng_string(self, a): 27297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts a number to a string, using scientific notation. 27307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is not affected by the context. 27327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 27337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.to_eng_string(context=self) 27347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_sci_string(self, a): 27367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts a number to a string, using scientific notation. 27377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is not affected by the context. 27397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 27407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__str__(context=self) 27417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_integral(self, a): 27437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds to an integer. 27447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger When the operand has a negative exponent, the result is the same 27467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger as using the quantize() operation using the given operand as the 27477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger left-hand-operand, 1E+0 as the right-hand-operand, and the precision 27487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger of the operand as the precision setting, except that no flags will 27497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger be set. The rounding mode is taken from the context. 27507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27519ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('2.1')) 27527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("2") 27539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('100')) 27547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("100") 27559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('100.0')) 27567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("100") 27579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('101.5')) 27587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("102") 27599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('-101.5')) 27607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-102") 27619ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('10E+5')) 27627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("1.0E+6") 27639ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('7.89E+77')) 27647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("7.89E+77") 27659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.to_integral(Decimal('-Inf')) 27667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal("-Infinity") 27677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 27687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.to_integral(context=self) 27697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass _WorkRep(object): 27717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __slots__ = ('sign','int','exp') 277217931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger # sign: 0 or 1 2773636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # int: int or long 27747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # exp: None, int, or string 27757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __init__(self, value=None): 27777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if value is None: 27787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.sign = None 2779636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self.int = 0 27807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = None 278117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger elif isinstance(value, Decimal): 278217931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger self.sign = value._sign 2783636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger cum = 0 278417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger for digit in value._int: 2785636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger cum = cum * 10 + digit 2786636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self.int = cum 27877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = value._exp 278817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger else: 278917931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger # assert isinstance(value, tuple) 27907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.sign = value[0] 27917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.int = value[1] 27927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = value[2] 27937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __repr__(self): 27957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return "(%r, %r, %r)" % (self.sign, self.int, self.exp) 27967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __str__ = __repr__ 27987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 27997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _normalize(op1, op2, shouldround = 0, prec = 0): 28027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Normalizes op1, op2 to have the same exp and length of coefficient. 28037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Done during addition. 28057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 28067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Yes, the exponent is a long, but the difference between exponents 28077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # must be an int-- otherwise you'd get a big memory problem. 28087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger numdigits = int(op1.exp - op2.exp) 28097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if numdigits < 0: 28107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger numdigits = -numdigits 28117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = op2 28127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = op1 28137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 28147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = op1 28157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = op2 28167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2817636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2818636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if shouldround and numdigits > prec + 1: 2819636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Big difference in exponents - check the adjusted exponents 2820636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger tmp_len = len(str(tmp.int)) 2821636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other_len = len(str(other.int)) 2822636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if numdigits > (other_len + prec + 1 - tmp_len): 2823636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # If the difference in adjusted exps is > prec+1, we know 2824636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # other is insignificant, so might as well put a 1 after the precision. 2825636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # (since this is only for addition.) Also stops use of massive longs. 2826636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2827636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger extend = prec + 2 - tmp_len 2828636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if extend <= 0: 2829636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger extend = 1 2830636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger tmp.int *= 10 ** extend 2831636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger tmp.exp -= extend 2832636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other.int = 1 2833636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other.exp = tmp.exp 2834636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return op1, op2 2835636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2836636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger tmp.int *= 10 ** numdigits 2837636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger tmp.exp -= numdigits 28387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return op1, op2 28397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _adjust_coefficients(op1, op2): 2841636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger """Adjust op1, op2 so that op2.int * 10 > op1.int >= op2.int. 28427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Returns the adjusted op1, op2 as well as the change in op1.exp-op2.exp. 28447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Used on _WorkRep instances during division. 28467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 28477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjust = 0 2848636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger #If op1 is smaller, make it larger 2849636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger while op2.int > op1.int: 2850636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger op1.int *= 10 28517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.exp -= 1 2852636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger adjust += 1 28537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2854636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger #If op2 is too small, make it larger 2855636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger while op1.int >= (10 * op2.int): 2856636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger op2.int *= 10 28577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2.exp -= 1 28587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjust -= 1 2859636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 28607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return op1, op2, adjust 28617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Helper Functions ######################################## 28637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2864636a6b100fe6083388bc5315758326078abe65b4Raymond Hettingerdef _convert_other(other): 2865636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger """Convert other to Decimal. 2866636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2867636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger Verifies that it's ok to use in an implicit construction. 2868636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger """ 2869636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(other, Decimal): 2870636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return other 2871636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(other, (int, long)): 2872636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(other) 2873636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2874636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger raise TypeError, "You can interact Decimal only with int, long or Decimal data types." 2875636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 28767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger_infinity_map = { 28777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'inf' : 1, 28787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 'infinity' : 1, 28797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger '+inf' : 1, 28807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger '+infinity' : 1, 28817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger '-inf' : -1, 28827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger '-infinity' : -1 28837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger} 28847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28850ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerdef _isinfinity(num): 28867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Determines whether a string or float is infinity. 28877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28880ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger +1 for negative infinity; 0 for finite ; +1 for positive infinity 28897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 28907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger num = str(num).lower() 28917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return _infinity_map.get(num, 0) 28927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28930ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerdef _isnan(num): 28947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Determines whether a string or float is NaN 28957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 28967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (1, sign, diagnostic info as string) => NaN 28977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (2, sign, diagnostic info as string) => sNaN 28987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 => not a NaN 28997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 29007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger num = str(num).lower() 29017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not num: 29027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 29037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger #get the sign, get rid of trailing [+-] 29057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 0 29067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if num[0] == '+': 29077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger num = num[1:] 29087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger elif num[0] == '-': #elif avoids '+-nan' 29097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger num = num[1:] 29107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 29117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if num.startswith('nan'): 29137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(num) > 3 and not num[3:].isdigit(): #diagnostic info 29147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 29157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (1, sign, num[3:].lstrip('0')) 29167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if num.startswith('snan'): 29177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if len(num) > 4 and not num[4:].isdigit(): 29187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 29197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (2, sign, num[4:].lstrip('0')) 29207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 29217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Setup Specific Contexts ################################ 29247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# The default context prototype used by Context() 2926fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger# Is mutable, so that new contexts can have different default values 29277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDefaultContext = Context( 29296ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger prec=28, rounding=ROUND_HALF_EVEN, 2930bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[DivisionByZero, Overflow, InvalidOperation], 2931bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 29327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _rounding_decision=ALWAYS_ROUND, 293399148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger Emax=999999999, 293499148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger Emin=-999999999, 2935e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger capitals=1 29367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 29377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Pre-made alternate contexts offered by the specification 29397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Don't change these; the user should be able to select these 29407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# contexts and be able to reproduce results from other implementations 29417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# of the spec. 29427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29439ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerBasicContext = Context( 29447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec=9, rounding=ROUND_HALF_UP, 2945bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow], 2946bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 29477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 29487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29499ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerExtendedContext = Context( 29506ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger prec=9, rounding=ROUND_HALF_EVEN, 2951bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[], 2952bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 29537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 29547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2956d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger##### Useful Constants (internal use only) #################### 29577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Reusable defaults 29597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInf = Decimal('Inf') 29607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingernegInf = Decimal('-Inf') 29617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Infsign[sign] is infinity w/ that sign 29637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfsign = (Inf, negInf) 29647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN = Decimal('NaN') 29667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### crud for parsing strings ################################# 29697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport re 29707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# There's an optional sign at the start, and an optional exponent 29727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# at the end. The exponent has an optional sign and at least one 29737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# digit. In between, must have either at least one digit followed 29747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# by an optional fraction, or a decimal point followed by at least 29757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# one digit. Yuck. 29767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger_parser = re.compile(r""" 29787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# \s* 29797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (?P<sign>[-+])? 29807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ( 29817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (?P<int>\d+) (\. (?P<frac>\d*))? 29827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger | 29837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger \. (?P<onlyfrac>\d+) 29847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ) 29857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ([eE](?P<exp>[-+]? \d+))? 29867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# \s* 29877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger $ 29887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger""", re.VERBOSE).match #Uncomment the \s* to allow leading or trailing spaces. 29897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdel re 29917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# return sign, n, p s.t. float string value == -1**sign * n * 10**p exactly 29937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _string2exact(s): 29957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger m = _parser(s) 29967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if m is None: 29977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raise ValueError("invalid literal for Decimal: %r" % s) 29987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 29997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if m.group('sign') == "-": 30007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 30017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 30027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 0 30037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = m.group('exp') 30057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if exp is None: 30067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = 0 30077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 30087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = int(exp) 30097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger intpart = m.group('int') 30117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if intpart is None: 30127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger intpart = "" 30137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger fracpart = m.group('onlyfrac') 30147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 30157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger fracpart = m.group('frac') 30167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if fracpart is None: 30177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger fracpart = "" 30187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp -= len(fracpart) 30207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger mantissa = intpart + fracpart 30227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = map(int, mantissa) 30237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger backup = tmp 30247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger while tmp and tmp[0] == 0: 30257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger del tmp[0] 30267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # It's a zero 30287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not tmp: 30297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if backup: 30307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (sign, tuple(backup), exp) 30317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (sign, (0,), exp) 30327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger mantissa = tuple(tmp) 30337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (sign, mantissa, exp) 30357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 30377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerif __name__ == '__main__': 30387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger import doctest, sys 30397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger doctest.testmod(sys.modules[__name__]) 3040