decimal.py revision 5cfa8044ff9fd26dc4915fc2ce5b2d005eea3261
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 3259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo BatistaThe purpose of this module is to support arithmetic using familiar 3359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista"schoolhouse" rules and to avoid some of the 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 38abe32371878dcaea31c835e10144fdaa2eca6492Raymond 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) 45abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('0') 46abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('1') 47abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('1') 48abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('-.0123') 49abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('-0.0123') 507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(123456) 51abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('123456') 52abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('123.45e12345678901234567890') 53abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('1.2345E+12345678901234567892') 54abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('1.33') + Decimal('1.27') 55abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('2.60') 56abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41') 57abe32371878dcaea31c835e10144fdaa2eca6492Raymond 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)) 94abe32371878dcaea31c835e10144fdaa2eca6492Raymond 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', 131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP', 1327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Functions for manipulating contexts 1348b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 'setcontext', 'getcontext', 'localcontext' 1357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger] 1367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 137a016debad07f11c3b85131b4205305d190ac9ecaRaymond Hettinger__version__ = '1.70' # Highest version of the spec this complies with 138daeceb2de80047f25aedbf16bf40dc5d619e64ddRaymond Hettinger 139eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettingerimport copy as _copy 140f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettingerimport math as _math 1412c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettingerimport numbers as _numbers 1427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 143097a1903035f9ee2efb1953306123f183124125dRaymond Hettingertry: 144097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger from collections import namedtuple as _namedtuple 145097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent') 146097a1903035f9ee2efb1953306123f183124125dRaymond Hettingerexcept ImportError: 147097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger DecimalTuple = lambda *args: args 148097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger 14959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista# Rounding 1500ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_DOWN = 'ROUND_DOWN' 1510ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_UP = 'ROUND_HALF_UP' 1520ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_EVEN = 'ROUND_HALF_EVEN' 1530ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_CEILING = 'ROUND_CEILING' 1540ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_FLOOR = 'ROUND_FLOOR' 1550ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_UP = 'ROUND_UP' 1560ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_DOWN = 'ROUND_HALF_DOWN' 157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo BatistaROUND_05UP = 'ROUND_05UP' 1587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista# Errors 1607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DecimalException(ArithmeticError): 1625aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger """Base exception class. 1637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Used exceptions derive from this. 1657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If an exception derives from another exception besides this (such as 1667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Underflow (Inexact, Rounded, Subnormal) that indicates that it is only 1677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger called if the others are present. This isn't actually used for 1687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger anything, though. 1697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 170cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis handle -- Called when context._raise_error is called and the 171cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis trap_enabler is set. First argument is self, second is the 172cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis context. More arguments can be given, those being after 173cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis the explanation in _raise_error (For example, 174cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis context._raise_error(NewError, '(-x)!', self._sign) would 175cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis call NewError().handle(context, self._sign).) 176cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 1777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger To define a new exception, it should be sufficient to have it derive 1787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger from DecimalException. 1797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 1817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger pass 1827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Clamped(DecimalException): 1857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Exponent of a 0 changed to fit bounds. 1867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals clamped if the exponent of a result has been 1887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger altered in order to fit the constraints of a specific concrete 18959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista representation. This may occur when the exponent of a zero result would 19059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista be outside the bounds of a representation, or when a large normal 19159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista number would have an encoded exponent that cannot be represented. In 1927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger this latter case, the exponent is reduced to fit and the corresponding 1937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger number of zero digits are appended to the coefficient ("fold-down"). 1947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidOperation(DecimalException): 1977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """An invalid operation was performed. 1987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Various bad things cause this: 2007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Something creates a signaling NaN 2027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -INF + INF 20359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista 0 * (+-)INF 20459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista (+-)INF / (+-)INF 2057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x % 0 2067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (+-)INF % x 2077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x._rescale( non-integer ) 2087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sqrt(-x) , x > 0 2097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 ** 0 2107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x ** (non-integer) 2117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x ** (+-)INF 2127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger An operand is invalid 213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result of the operation after these is a quiet positive NaN, 215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista except when the cause is a signaling NaN, in which case the result is 216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista also a quiet NaN, but with the original sign, and an optional 217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista diagnostic information. 2187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if args: 2210f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True) 2220f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista return ans._fix_nan(context) 223c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson return _NaN 2247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass ConversionSyntax(InvalidOperation): 2267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Trying to convert badly formed string. 2277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if an string is being 2297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger converted to a number and it does not conform to the numeric string 23059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista syntax. The result is [0,qNaN]. 2317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 232cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis def handle(self, context, *args): 233c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson return _NaN 2347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionByZero(DecimalException, ZeroDivisionError): 2367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Division by 0. 2377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals division-by-zero if division of a finite number 2397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger by zero was attempted (during a divide-integer or divide operation, or a 2407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger power operation with negative right-hand operand), and the dividend was 2417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger not zero. 2427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result of the operation is [sign,inf], where sign is the exclusive 2447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger or of the signs of the operands for divide, or is 1 for an odd power of 2457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -0, for power. 2467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 247cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 248cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista def handle(self, context, sign, *args): 249b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[sign] 2507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionImpossible(InvalidOperation): 2527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Cannot perform the division adequately. 2537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if the integer result of a 2557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger divide-integer or remainder operation had too many digits (would be 25659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista longer than precision). The result is [0,qNaN]. 2577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 258cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 2597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 260c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson return _NaN 2617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionUndefined(InvalidOperation, ZeroDivisionError): 2637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Undefined result of division. 2647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if division by zero was 2667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger attempted (during a divide-integer, divide, or remainder operation), and 26759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista the dividend is also zero. The result is [0,qNaN]. 2687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 269cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 270cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista def handle(self, context, *args): 271c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson return _NaN 2727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Inexact(DecimalException): 2747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Had to round, losing information. 2757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals inexact whenever the result of an operation is 2777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger not exact (that is, it needed to be rounded and any discarded digits 27859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista were non-zero), or if an overflow or underflow condition occurs. The 2797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result in all cases is unchanged. 2807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The inexact signal may be tested (or trapped) to determine if a given 2827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation (or sequence of operations) was inexact. 2837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidContext(InvalidOperation): 2867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Invalid context. Unknown rounding, for example. 2877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if an invalid context was 28959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista detected during an operation. This can occur if contexts are not checked 2907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger on creation and either the precision exceeds the capability of the 2917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger underlying concrete representation or an unknown or unsupported rounding 29259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista was specified. These aspects of the context need only be checked when 29359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista the values are required to be used. The result is [0,qNaN]. 2947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 295cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 2967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 297c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson return _NaN 2987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Rounded(DecimalException): 3007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Number got rounded (not necessarily changed during rounding). 3017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals rounded whenever the result of an operation is 3037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounded (that is, some zero or non-zero digits were discarded from the 30459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista coefficient), or if an overflow or underflow condition occurs. The 3057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result in all cases is unchanged. 3067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The rounded signal may be tested (or trapped) to determine if a given 3087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation (or sequence of operations) caused a loss of precision. 3097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Subnormal(DecimalException): 3127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Exponent < Emin before rounding. 3137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals subnormal whenever the result of a conversion or 3157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation is subnormal (that is, its adjusted exponent is less than 31659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista Emin, before any rounding). The result in all cases is unchanged. 3177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The subnormal signal may be tested (or trapped) to determine if a given 3197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger or operation (or sequence of operations) yielded a subnormal result. 3207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Overflow(Inexact, Rounded): 3237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Numerical overflow. 3247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals overflow if the adjusted exponent of a result 3267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (from a conversion or from an operation that is not an attempt to divide 3277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger by zero), after rounding, would be greater than the largest value that 3287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger can be handled by the implementation (the value Emax). 3297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result depends on the rounding mode: 3317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger For round-half-up and round-half-even (and for round-half-down and 3337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger round-up, if implemented), the result of the operation is [sign,inf], 33459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista where sign is the sign of the intermediate result. For round-down, the 3357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result is the largest finite number that can be represented in the 33659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista current precision, with the sign of the intermediate result. For 3377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger round-ceiling, the result is the same as for round-down if the sign of 33859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista the intermediate result is 1, or is [0,inf] otherwise. For round-floor, 3397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the result is the same as for round-down if the sign of the intermediate 34059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded 3417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger will also be raised. 3420f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista """ 343cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 3447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, sign, *args): 3457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN, 346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ROUND_HALF_DOWN, ROUND_UP): 347b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[sign] 3487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sign == 0: 3497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_CEILING: 350b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[sign] 35172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(sign, '9'*context.prec, 35272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista context.Emax-context.prec+1) 3537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sign == 1: 3547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_FLOOR: 355b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[sign] 35672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(sign, '9'*context.prec, 35772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista context.Emax-context.prec+1) 3587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Underflow(Inexact, Rounded, Subnormal): 3617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Numerical underflow with result rounded to 0. 3627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals underflow if a result is inexact and the 3647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjusted exponent of the result would be smaller (more negative) than 3657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the smallest value that can be handled by the implementation (the value 36659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista Emin). That is, the result is both inexact and subnormal. 3677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result after an underflow will be a subnormal number rounded, if 36959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista necessary, so that its exponent is not less than Etiny. This may result 3707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger in 0 with the sign of the intermediate result and an exponent of Etiny. 3717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger In all cases, Inexact, Rounded, and Subnormal will also be raised. 3737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3755aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# List of public traps and flags 376fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded, 377cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis Underflow, InvalidOperation, Subnormal] 3787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3795aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# Map conditions (per the spec) to signals 3805aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger_condition_map = {ConversionSyntax:InvalidOperation, 3815aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger DivisionImpossible:InvalidOperation, 3825aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger DivisionUndefined:InvalidOperation, 3835aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger InvalidContext:InvalidOperation} 3847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Context Functions ################################################## 3867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 387ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# The getcontext() and setcontext() function manage access to a thread-local 388ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# current context. Py2.4 offers direct support for thread locals. If that 389ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# is not available, use threading.currentThread() which is slower but will 3907e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger# work for older Pythons. If threads are not part of the build, create a 391cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis# mock threading object with threading.local() returning the module namespace. 3927e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger 3937e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingertry: 3947e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger import threading 3957e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingerexcept ImportError: 3967e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger # Python was compiled without threads; create a mock object instead 3977e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger import sys 39859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista class MockThreading(object): 3997e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger def local(self, sys=sys): 4007e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger return sys.modules[__name__] 4017e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger threading = MockThreading() 4027e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger del sys, MockThreading 403ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 404ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingertry: 405ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger threading.local 406ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 407ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerexcept AttributeError: 408ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 40959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # To fix reloading, force it to create a new context 41059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Old contexts have different exceptions in their dicts, making problems. 411ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if hasattr(threading.currentThread(), '__decimal_context__'): 412ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger del threading.currentThread().__decimal_context__ 413ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 414ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def setcontext(context): 415ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Set this thread's context to context.""" 416ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if context in (DefaultContext, BasicContext, ExtendedContext): 4179fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context.copy() 41861992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger context.clear_flags() 4197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger threading.currentThread().__decimal_context__ = context 420ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 421ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def getcontext(): 422ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Returns this thread's context. 423ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 424ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger If this thread does not yet have a context, returns 425ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger a new context and sets this thread's context. 426ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger New contexts are copies of DefaultContext. 427ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """ 428ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger try: 429ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return threading.currentThread().__decimal_context__ 430ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger except AttributeError: 431ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger context = Context() 432ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger threading.currentThread().__decimal_context__ = context 433ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return context 434ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 435ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerelse: 436ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 437ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger local = threading.local() 4389fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger if hasattr(local, '__decimal_context__'): 4399fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger del local.__decimal_context__ 440ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 441ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def getcontext(_local=local): 442ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Returns this thread's context. 443ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 444ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger If this thread does not yet have a context, returns 445ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger a new context and sets this thread's context. 446ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger New contexts are copies of DefaultContext. 447ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """ 448ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger try: 449ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return _local.__decimal_context__ 450ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger except AttributeError: 451ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger context = Context() 452ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger _local.__decimal_context__ = context 453ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return context 454ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 455ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def setcontext(context, _local=local): 456ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Set this thread's context to context.""" 457ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if context in (DefaultContext, BasicContext, ExtendedContext): 4589fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context.copy() 45961992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger context.clear_flags() 460ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger _local.__decimal_context__ = context 461ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 462cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis del threading, local # Don't contaminate the namespace 4637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4648b6999b4c5fab174090be263ba90f193bdede141Nick Coghlandef localcontext(ctx=None): 4658b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan """Return a context manager for a copy of the supplied context 4668b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 4678b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan Uses a copy of the current context if no context is specified 4688b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan The returned context manager creates a local decimal context 4698b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan in a with statement: 4708b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan def sin(x): 4718b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan with localcontext() as ctx: 4728b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ctx.prec += 2 4738b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan # Rest of sin calculation algorithm 4748b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan # uses a precision 2 greater than normal 47559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista return +s # Convert result to normal precision 4768b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 4778b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan def sin(x): 4788b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan with localcontext(ExtendedContext): 4798b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan # Rest of sin calculation algorithm 4808b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan # uses the Extended Context from the 4818b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan # General Decimal Arithmetic Specification 48259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista return +s # Convert result to normal context 4838b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 484ee340e501d2a59d70a91748ebd948787bfac8044Facundo Batista >>> setcontext(DefaultContext) 4858b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan >>> print getcontext().prec 4868b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 28 4878b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan >>> with localcontext(): 4888b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ... ctx = getcontext() 489495df4716fce4156c1eb110f9342297164eecbb6Raymond Hettinger ... ctx.prec += 2 4908b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ... print ctx.prec 4918b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ... 4928b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 30 4938b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan >>> with localcontext(ExtendedContext): 4948b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ... print getcontext().prec 4958b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ... 4968b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 9 4978b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan >>> print getcontext().prec 4988b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 28 4998b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan """ 500ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan if ctx is None: ctx = getcontext() 501ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan return _ContextManager(ctx) 5028b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 5037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 50459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Decimal class ####################################################### 5057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Decimal(object): 5077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Floating point class for decimal arithmetic.""" 5087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 509636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger __slots__ = ('_exp','_int','_sign', '_is_special') 510636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Generally, the value of the Decimal instance is given by 511636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # (-1)**_sign * _int * 10**_exp 512636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Special values are signified by _is_special == True 5137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 514dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger # We're immutable, so use __new__ not __init__ 515636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger def __new__(cls, value="0", context=None): 5167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Create a decimal point instance. 5177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal('3.14') # string input 519abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3.14') 52059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista >>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent) 521abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3.14') 5227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal(314) # int or long 523abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('314') 5247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal(Decimal(314)) # another decimal instance 525abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('314') 52659bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson >>> Decimal(' 3.14 \\n') # leading and trailing whitespace okay 527abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3.14') 5287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 5297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # Note that the coefficient, self._int, is actually stored as 53172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # a string rather than as a tuple of digits. This speeds up 53272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # the "digits to integer" and "integer to digits" conversions 53372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # that are used in almost every arithmetic operation on 53472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # Decimals. This is an internal detail: the as_tuple function 53572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # and the Decimal constructor still deal with tuples of 53672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # digits. 53772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista 538636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self = object.__new__(cls) 539636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 5400d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista # From a string 5410d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista # REs insist on real strings, so we can too. 5420d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if isinstance(value, basestring): 54359bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson m = _parser(value.strip()) 5440d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if m is None: 5450d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if context is None: 5460d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista context = getcontext() 5470d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista return context._raise_error(ConversionSyntax, 5480d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista "Invalid literal for Decimal: %r" % value) 549636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 5500d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if m.group('sign') == "-": 5510d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._sign = 1 5520d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista else: 5530d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._sign = 0 5540d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista intpart = m.group('int') 5550d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if intpart is not None: 5560d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista # finite number 5574326ad8f72053140aa658a0392a509c9da382670Mark Dickinson fracpart = m.group('frac') or '' 5580d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista exp = int(m.group('exp') or '0') 5594326ad8f72053140aa658a0392a509c9da382670Mark Dickinson self._int = str(int(intpart+fracpart)) 5604326ad8f72053140aa658a0392a509c9da382670Mark Dickinson self._exp = exp - len(fracpart) 5610d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._is_special = False 5620d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista else: 5630d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista diag = m.group('diag') 5640d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if diag is not None: 5650d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista # NaN 5664326ad8f72053140aa658a0392a509c9da382670Mark Dickinson self._int = str(int(diag or '0')).lstrip('0') 5670d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if m.group('signal'): 5680d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._exp = 'N' 5690d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista else: 5700d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._exp = 'n' 5710d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista else: 5720d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista # infinity 5730d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._int = '0' 5740d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._exp = 'F' 5750d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._is_special = True 576636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 577636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 578636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # From an integer 5797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if isinstance(value, (int,long)): 580636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if value >= 0: 581636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._sign = 0 582636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger else: 583636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._sign = 1 584636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._exp = 0 58572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._int = str(abs(value)) 5860d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._is_special = False 5870d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista return self 5880d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista 5890d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista # From another decimal 5900d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if isinstance(value, Decimal): 5910d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._exp = value._exp 5920d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._sign = value._sign 5930d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._int = value._int 5940d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._is_special = value._is_special 5950d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista return self 5960d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista 5970d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista # From an internal working value 5980d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if isinstance(value, _WorkRep): 5990d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._sign = value.sign 6000d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._int = str(value.int) 6010d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._exp = int(value.exp) 6020d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._is_special = False 603636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 604636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 605636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # tuple/list conversion (possibly from as_tuple()) 606636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(value, (list,tuple)): 607636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if len(value) != 3: 6089b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista raise ValueError('Invalid tuple size in creation of Decimal ' 6099b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista 'from list or tuple. The list or tuple ' 6109b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista 'should have exactly three elements.') 6119b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista # process sign. The isinstance test rejects floats 6129b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista if not (isinstance(value[0], (int, long)) and value[0] in (0,1)): 6139b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista raise ValueError("Invalid sign. The first value in the tuple " 6149b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista "should be an integer; either 0 for a " 6159b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista "positive number or 1 for a negative number.") 616636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._sign = value[0] 6179b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista if value[2] == 'F': 6189b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista # infinity: value[1] is ignored 61972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._int = '0' 620636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._exp = value[2] 621636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self._is_special = True 622636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger else: 6239b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista # process and validate the digits in value[1] 6249b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista digits = [] 6259b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista for digit in value[1]: 6269b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista if isinstance(digit, (int, long)) and 0 <= digit <= 9: 6279b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista # skip leading zeros 6289b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista if digits or digit != 0: 6299b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista digits.append(digit) 6309b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista else: 6319b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista raise ValueError("The second value in the tuple must " 6329b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista "be composed of integers in the range " 6339b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista "0 through 9.") 6349b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista if value[2] in ('n', 'N'): 6359b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista # NaN: digits form the diagnostic 63672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._int = ''.join(map(str, digits)) 6379b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista self._exp = value[2] 6389b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista self._is_special = True 6399b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista elif isinstance(value[2], (int, long)): 6409b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista # finite number: digits give the coefficient 64172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._int = ''.join(map(str, digits or [0])) 6429b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista self._exp = value[2] 6439b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista self._is_special = False 6449b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista else: 6459b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista raise ValueError("The third value in the tuple must " 6469b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista "be an integer, or one of the " 6479b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista "strings 'F', 'n', 'N'.") 648636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self 649636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 650636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(value, float): 651636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger raise TypeError("Cannot convert float to Decimal. " + 652636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger "First convert the float to a string") 6537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 654636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger raise TypeError("Cannot convert %r to Decimal" % value) 6557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6566a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson # @classmethod, but @decorator is not valid Python 2.3 syntax, so 6576a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson # don't use it (see notes on Py2.3 compatibility at top of file) 658f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger def from_float(cls, f): 659f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger """Converts a float to a decimal number, exactly. 660f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger 661f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger Note that Decimal.from_float(0.1) is not the same as Decimal('0.1'). 662f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger Since 0.1 is not exactly representable in binary floating point, the 663f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger value is stored as the nearest representable value which is 664f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger 0x1.999999999999ap-4. The exact equivalent of the value in decimal 665f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger is 0.1000000000000000055511151231257827021181583404541015625. 666f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger 667f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger >>> Decimal.from_float(0.1) 668f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger Decimal('0.1000000000000000055511151231257827021181583404541015625') 669f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger >>> Decimal.from_float(float('nan')) 670f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger Decimal('NaN') 671f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger >>> Decimal.from_float(float('inf')) 672f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger Decimal('Infinity') 673f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger >>> Decimal.from_float(-float('inf')) 674f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger Decimal('-Infinity') 675f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger >>> Decimal.from_float(-0.0) 676f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger Decimal('-0') 677f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger 678f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger """ 679f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger if isinstance(f, (int, long)): # handle integer inputs 680f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger return cls(f) 681f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger if _math.isinf(f) or _math.isnan(f): # raises TypeError if not a float 682f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger return cls(repr(f)) 6836a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson if _math.copysign(1.0, f) == 1.0: 6846a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson sign = 0 6856a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson else: 6866a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson sign = 1 687f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger n, d = abs(f).as_integer_ratio() 688f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger k = d.bit_length() - 1 689f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger result = _dec_from_triple(sign, str(n*5**k), -k) 6906a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson if cls is Decimal: 6916a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson return result 6926a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson else: 6936a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson return cls(result) 6946a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson from_float = classmethod(from_float) 695f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger 6967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isnan(self): 6977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is not actually one. 6987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 if a number 7000f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista 1 if NaN 7017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2 if sNaN 7027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 703636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 704636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger exp = self._exp 705636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp == 'n': 706636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return 1 707636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger elif exp == 'N': 708636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return 2 7097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 7107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isinfinity(self): 7127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is infinite 7137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 if finite or not a number 7157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 if +INF 7167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -1 if -INF 7177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 7187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp == 'F': 7197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 7207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 7217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 7227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 7237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 724353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _check_nans(self, other=None, context=None): 7257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is not actually one. 7267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self, other are sNaN, signal 7287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self, other are NaN return nan 7297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 7307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Done before operations. 7327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 7337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 734636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self_is_nan = self._isnan() 735636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other is None: 736636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other_is_nan = False 737636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger else: 738636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other_is_nan = other._isnan() 739636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 740636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self_is_nan or other_is_nan: 741636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 742636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 743636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 744636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self_is_nan == 2: 745636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 'sNaN', 7460f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista self) 747636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other_is_nan == 2: 748636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 'sNaN', 7490f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista other) 750636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self_is_nan: 751353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._fix_nan(context) 752636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return other._fix_nan(context) 7547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 7557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7562fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def _compare_check_nans(self, other, context): 7572fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson """Version of _check_nans used for the signaling comparisons 7582fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson compare_signal, __le__, __lt__, __ge__, __gt__. 7592fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 7602fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson Signal InvalidOperation if either self or other is a (quiet 7612fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson or signaling) NaN. Signaling NaNs take precedence over quiet 7622fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson NaNs. 7632fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 7642fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson Return 0 if neither operand is a NaN. 7652fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 7662fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson """ 7672fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if context is None: 7682fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson context = getcontext() 7692fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 7702fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self._is_special or other._is_special: 7712fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self.is_snan(): 7722fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return context._raise_error(InvalidOperation, 7732fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 'comparison involving sNaN', 7742fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson self) 7752fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson elif other.is_snan(): 7762fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return context._raise_error(InvalidOperation, 7772fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 'comparison involving sNaN', 7782fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other) 7792fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson elif self.is_qnan(): 7802fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return context._raise_error(InvalidOperation, 7812fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 'comparison involving NaN', 7822fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson self) 7832fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson elif other.is_qnan(): 7842fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return context._raise_error(InvalidOperation, 7852fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 'comparison involving NaN', 7862fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other) 7872fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return 0 7882fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 7897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __nonzero__(self): 7901a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is nonzero; otherwise return False. 7917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7921a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista NaNs and infinities are considered nonzero. 7937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 79472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self._is_special or self._int != '0' 7957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7962fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def _cmp(self, other): 7972fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson """Compare the two non-NaN decimal instances self and other. 7987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7992fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson Returns -1 if self < other, 0 if self == other and 1 8002fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self > other. This routine is for internal use only.""" 801636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 8022fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self._is_special or other._is_special: 803e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson self_inf = self._isinfinity() 804e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson other_inf = other._isinfinity() 805e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson if self_inf == other_inf: 806e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson return 0 807e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson elif self_inf < other_inf: 808e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson return -1 809e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson else: 810e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson return 1 8117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 812e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson # check for zeros; Decimal('0') == Decimal('-0') 813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other: 815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return 0 816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return -((-1)**other._sign) 818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other: 819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return (-1)**self._sign 8207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 82159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If different signs, neg one is less 8227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._sign < self._sign: 8237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 8247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign < other._sign: 8257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 8267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 827636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self_adjusted = self.adjusted() 828636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other_adjusted = other.adjusted() 829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_adjusted == other_adjusted: 83072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self_padded = self._int + '0'*(self._exp - other._exp) 83172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista other_padded = other._int + '0'*(other._exp - self._exp) 832e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson if self_padded == other_padded: 833e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson return 0 834e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson elif self_padded < other_padded: 835e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson return -(-1)**self._sign 836e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson else: 837e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson return (-1)**self._sign 838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif self_adjusted > other_adjusted: 8397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (-1)**self._sign 840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: # self_adjusted < other_adjusted 8417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -((-1)**self._sign) 8427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8432fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # Note: The Decimal standard doesn't cover rich comparisons for 8442fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # Decimals. In particular, the specification is silent on the 8452fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # subject of what should happen for a comparison involving a NaN. 8462fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # We take the following approach: 8472fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # 8482fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # == comparisons involving a NaN always return False 8492fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # != comparisons involving a NaN always return True 8502fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # <, >, <= and >= comparisons involving a (quiet or signaling) 8512fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # NaN signal InvalidOperation, and return False if the 8523a94ee05f77d0200cfb7988d02f3fdf292932a94Mark Dickinson # InvalidOperation is not trapped. 8532fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # 8542fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # This behavior is designed to conform as closely as possible to 8552fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # that specified by IEEE 754. 8562fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 8570aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger def __eq__(self, other): 8582fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8592fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8602fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8612fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self.is_nan() or other.is_nan(): 8622fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return False 8632fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) == 0 8640aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger 8650aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger def __ne__(self, other): 8662fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8672fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8682fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8692fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self.is_nan() or other.is_nan(): 8702fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return True 8712fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) != 0 8722fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 8732fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def __lt__(self, other, context=None): 8742fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8752fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8762fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8772fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson ans = self._compare_check_nans(other, context) 8782fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if ans: 8792fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return False 8802fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) < 0 8812fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 8822fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def __le__(self, other, context=None): 8832fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8842fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8852fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8862fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson ans = self._compare_check_nans(other, context) 8872fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if ans: 8882fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return False 8892fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) <= 0 8902fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 8912fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def __gt__(self, other, context=None): 8922fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8932fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8942fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8952fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson ans = self._compare_check_nans(other, context) 8962fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if ans: 8972fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return False 8982fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) > 0 8992fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 9002fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def __ge__(self, other, context=None): 9012fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 9022fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 9032fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 9042fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson ans = self._compare_check_nans(other, context) 9052fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if ans: 9062fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return False 9072fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) >= 0 9080aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger 9097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def compare(self, other, context=None): 9107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Compares one to another. 9117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -1 => a < b 9137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 => a = b 9147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 => a > b 9157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN => one is NaN 9167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Like __cmp__, but returns Decimal instances. 9177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 9197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 92059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Compare(NaN, NaN) = NaN 921636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if (self._is_special or other and other._is_special): 922636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 923636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 924636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 9257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9262fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return Decimal(self._cmp(other)) 9277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __hash__(self): 9297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """x.__hash__() <==> hash(x)""" 9307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Decimal integers must hash the same as the ints 93152b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # 93252b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # The hash of a nonspecial noninteger Decimal must depend only 93352b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # on the value of that Decimal, and not on its representation. 934abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger # For example: hash(Decimal('100E-1')) == hash(Decimal('10')). 935bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger if self._is_special: 936bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger if self._isnan(): 937bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger raise TypeError('Cannot hash a NaN value.') 938bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger return hash(str(self)) 9398c202440699cef19602acc24822366d0d7c32083Facundo Batista if not self: 9408c202440699cef19602acc24822366d0d7c32083Facundo Batista return 0 9418c202440699cef19602acc24822366d0d7c32083Facundo Batista if self._isinteger(): 9428c202440699cef19602acc24822366d0d7c32083Facundo Batista op = _WorkRep(self.to_integral_value()) 9438c202440699cef19602acc24822366d0d7c32083Facundo Batista # to make computation feasible for Decimals with large 9448c202440699cef19602acc24822366d0d7c32083Facundo Batista # exponent, we use the fact that hash(n) == hash(m) for 9458c202440699cef19602acc24822366d0d7c32083Facundo Batista # any two nonzero integers n and m such that (i) n and m 9468c202440699cef19602acc24822366d0d7c32083Facundo Batista # have the same sign, and (ii) n is congruent to m modulo 9478c202440699cef19602acc24822366d0d7c32083Facundo Batista # 2**64-1. So we can replace hash((-1)**s*c*10**e) with 9488c202440699cef19602acc24822366d0d7c32083Facundo Batista # hash((-1)**s*c*pow(10, e, 2**64-1). 9498c202440699cef19602acc24822366d0d7c32083Facundo Batista return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1)) 95052b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # The value of a nonzero nonspecial Decimal instance is 95152b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # faithfully represented by the triple consisting of its sign, 95252b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # its adjusted exponent, and its coefficient with trailing 95352b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # zeros removed. 95452b25795c02442fc40f8932d05e5d728266339a4Facundo Batista return hash((self._sign, 95552b25795c02442fc40f8932d05e5d728266339a4Facundo Batista self._exp+len(self._int), 95652b25795c02442fc40f8932d05e5d728266339a4Facundo Batista self._int.rstrip('0'))) 9577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def as_tuple(self): 9597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Represents the number as a triple tuple. 9607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger To show the internals exactly as they are. 9627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 963097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp) 9647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __repr__(self): 9667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Represents the number as an instance of Decimal.""" 9677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Invariant: eval(repr(d)) == d 968abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger return "Decimal('%s')" % str(self) 9697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def __str__(self, eng=False, context=None): 9717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return string representation of the number in scientific notation. 9727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Captures all of the information in the underlying representation. 9747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 9757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 97662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista sign = ['', '-'][self._sign] 977e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger if self._is_special: 97862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista if self._exp == 'F': 97962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista return sign + 'Infinity' 98062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista elif self._exp == 'n': 98162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista return sign + 'NaN' + self._int 98262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista else: # self._exp == 'N' 98362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista return sign + 'sNaN' + self._int 98462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista 98562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # number of digits of self._int to left of decimal point 98662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista leftdigits = self._exp + len(self._int) 98762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista 98862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # dotplace is number of digits of self._int to the left of the 98962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # decimal point in the mantissa of the output string (that is, 99062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # after adjusting the exponent) 99162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista if self._exp <= 0 and leftdigits > -6: 99262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # no exponent required 99362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista dotplace = leftdigits 99462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista elif not eng: 99562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # usual scientific notation: 1 digit on left of the point 9967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dotplace = 1 99762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista elif self._int == '0': 99862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # engineering notation, zero 99962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista dotplace = (leftdigits + 1) % 3 - 1 10007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 100162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # engineering notation, nonzero 100262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista dotplace = (leftdigits - 1) % 3 + 1 100362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista 100462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista if dotplace <= 0: 100562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista intpart = '0' 100662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista fracpart = '.' + '0'*(-dotplace) + self._int 100762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista elif dotplace >= len(self._int): 100862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista intpart = self._int+'0'*(dotplace-len(self._int)) 100962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista fracpart = '' 101062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista else: 101162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista intpart = self._int[:dotplace] 101262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista fracpart = '.' + self._int[dotplace:] 101362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista if leftdigits == dotplace: 101462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista exp = '' 101562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista else: 101662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista if context is None: 101762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista context = getcontext() 101862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace) 101962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista 102062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista return sign + intpart + fracpart + exp 10217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_eng_string(self, context=None): 10237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Convert to engineering-type string. 10247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Engineering notation has an exponent which is a multiple of 3, so there 10267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger are up to 3 digits left of the decimal place. 10277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Same rules for when in exponential and when as a value as in __str__. 10297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self.__str__(eng=True, context=context) 10317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __neg__(self, context=None): 10337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a copy with the sign switched. 10347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds, if it has reason. 10367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1037636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1038636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1039636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1040636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 10417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 10437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # -Decimal('0') is Decimal('0'), not Decimal('-0') 10440f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista ans = self.copy_abs() 10457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 1046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self.copy_negate() 1047636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1048636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 1049636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 1050e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 10517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __pos__(self, context=None): 10537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a copy, unless it is a sNaN. 10547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds the number (if more then precision digits) 10567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1057636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1058636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1059636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1060636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 10617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 10637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # + (-0) = 0 10640f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista ans = self.copy_abs() 1065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = Decimal(self) 10677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1068636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 1069636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 1070e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 10717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1072e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista def __abs__(self, round=True, context=None): 10737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the absolute value of self. 10747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1075e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista If the keyword argument 'round' is false, do not round. The 1076e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista expression self.__abs__(round=False) is equivalent to 1077e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista self.copy_abs(). 10787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1079e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista if not round: 1080e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return self.copy_abs() 1081e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista 1082636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1083636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1084636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1085636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 10867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 10887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self.__neg__(context=context) 10897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 10907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self.__pos__(context=context) 10917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __add__(self, other, context=None): 10957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns self + other. 10967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -INF + INF (or the reverse) cause InvalidOperation errors. 10987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1099636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1100267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1101267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 1102636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 11037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 11047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 11057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1106636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1107636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 1108636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1109636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 11107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1111636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity(): 111259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If both INF, same sign => same as both, opposite => error. 1113636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._sign != other._sign and other._isinfinity(): 1114636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, '-INF + INF') 1115636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(self) 1116636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other._isinfinity(): 111759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista return Decimal(other) # Can't both be infinity here 11187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = min(self._exp, other._exp) 11207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negativezero = 0 11217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_FLOOR and self._sign != other._sign: 112259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If the answer is 0, the sign should be negative, in this case. 11237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negativezero = 1 11247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self and not other: 11267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = min(self._sign, other._sign) 11277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if negativezero: 11287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 112972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(sign, '0', exp) 1130e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 1131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 11327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 113399b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista exp = max(exp, other._exp - context.prec-1) 1134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = other._rescale(exp, context.rounding) 1135e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 11367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not other: 113899b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista exp = max(exp, self._exp - context.prec-1) 1139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._rescale(exp, context.rounding) 1140e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 11417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1 = _WorkRep(self) 11447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2 = _WorkRep(other) 1145e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista op1, op2 = _normalize(op1, op2, context.prec) 11467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result = _WorkRep() 11487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if op1.sign != op2.sign: 11497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Equal and opposite 115017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op1.int == op2.int: 115172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(negativezero, '0', exp) 1152e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 1153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 115417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op1.int < op2.int: 11557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1, op2 = op2, op1 115659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # OK, now abs(op1) > abs(op2) 115717931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op1.sign == 1: 115817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger result.sign = 1 11597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.sign, op2.sign = op2.sign, op1.sign 11607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 116117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger result.sign = 0 116259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # So we know the sign, and op1 > 0. 116317931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger elif op1.sign == 1: 11647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.sign = 1 116517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger op1.sign, op2.sign = (0, 0) 116617931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger else: 116717931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger result.sign = 0 116859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Now, op1 > abs(op2) > 0 11697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 117017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op2.sign == 0: 1171636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger result.int = op1.int + op2.int 11727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 1173636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger result.int = op1.int - op2.int 11747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.exp = op1.exp 11767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(result) 1177e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 11787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __radd__ = __add__ 11817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __sub__(self, other, context=None): 1183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Return self - other""" 1184636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1185267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1186267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 11877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1188636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1189636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context=context) 1190636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1191636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 11927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self - other is computed as self + other.copy_negate() 1194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self.__add__(other.copy_negate(), context=context) 11957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rsub__(self, other, context=None): 1197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Return other - self""" 1198636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1199267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1200267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 12017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return other.__sub__(self, context=context) 12037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __mul__(self, other, context=None): 12057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self * other. 12067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (+-) INF * 0 (or its reverse) raise InvalidOperation. 12087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1209636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1210267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1211267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 1212636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 12137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 12147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 12157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1216d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger resultsign = self._sign ^ other._sign 12177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1218636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1219636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 1220636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1221636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 1222636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1223636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity(): 1224636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not other: 1225636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, '(+-)INF * 0') 1226b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[resultsign] 1227636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1228636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other._isinfinity(): 1229636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not self: 1230636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, '0 * (+-)INF') 1231b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[resultsign] 12327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resultexp = self._exp + other._exp 12347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Special case for multiplying by zero 12367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self or not other: 123772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(resultsign, '0', resultexp) 1238e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista # Fixing in case the exponent is out of bounds 1239e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 12407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 12417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Special case for multiplying by power of 10 124372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista if self._int == '1': 124472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(resultsign, other._int, resultexp) 1245e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 12467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 124772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista if other._int == '1': 124872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(resultsign, self._int, resultexp) 1249e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 12507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 12517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1252636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger op1 = _WorkRep(self) 1253636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger op2 = _WorkRep(other) 1254636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 125572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp) 1256e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 12577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 12597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __rmul__ = __mul__ 12607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12618aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson def __truediv__(self, other, context=None): 12627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self / other.""" 1263636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1264267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1265cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return NotImplemented 1266636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 12677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 12687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 12697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1270636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger sign = self._sign ^ other._sign 1271636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1272636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1273636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 1274636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 12757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 12767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1277636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity() and other._isinfinity(): 12787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF') 12797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 1281b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[sign] 1282636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1283636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other._isinfinity(): 1284636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context._raise_error(Clamped, 'Division by infinity') 128572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(sign, '0', context.Etiny()) 1286636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1287636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Special cases for zeroes 1288636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not other: 1289cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not self: 1290cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionUndefined, '0 / 0') 1291636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(DivisionByZero, 'x / 0', sign) 12927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1293cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not self: 1294cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista exp = self._exp - other._exp 1295cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista coeff = 0 1296cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1297cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista # OK, so neither = 0, INF or NaN 1298cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista shift = len(other._int) - len(self._int) + context.prec + 1 1299cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista exp = self._exp - other._exp - shift 1300cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op1 = _WorkRep(self) 1301cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op2 = _WorkRep(other) 1302cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if shift >= 0: 1303cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista coeff, remainder = divmod(op1.int * 10**shift, op2.int) 1304cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1305cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista coeff, remainder = divmod(op1.int, op2.int * 10**-shift) 1306cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if remainder: 1307cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista # result is not exact; adjust to ensure correct rounding 1308cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if coeff % 5 == 0: 1309cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista coeff += 1 1310cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1311cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista # result is exact; get as close to ideal exponent as possible 1312cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ideal_exp = self._exp - other._exp 1313cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista while exp < ideal_exp and coeff % 10 == 0: 1314cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista coeff //= 10 1315cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista exp += 1 13167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 131772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(sign, str(coeff), exp) 1318cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans._fix(context) 13197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1320cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista def _divide(self, other, context): 1321cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista """Return (self // other, self % other), to context.prec precision. 13227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1323cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista Assumes that neither self nor other is a NaN, that self is not 1324cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista infinite and that other is nonzero. 1325cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista """ 1326cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista sign = self._sign ^ other._sign 1327cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if other._isinfinity(): 1328cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ideal_exp = self._exp 1329cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1330cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ideal_exp = min(self._exp, other._exp) 13317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1332cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista expdiff = self.adjusted() - other.adjusted() 1333cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not self or other._isinfinity() or expdiff <= -2: 133472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return (_dec_from_triple(sign, '0', 0), 1335cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista self._rescale(ideal_exp, context.rounding)) 1336cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if expdiff <= context.prec: 1337cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op1 = _WorkRep(self) 1338cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op2 = _WorkRep(other) 1339cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if op1.exp >= op2.exp: 1340cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op1.int *= 10**(op1.exp - op2.exp) 1341cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1342cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op2.int *= 10**(op2.exp - op1.exp) 1343cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista q, r = divmod(op1.int, op2.int) 1344cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if q < 10**context.prec: 134572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return (_dec_from_triple(sign, str(q), 0), 134672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista _dec_from_triple(self._sign, str(r), ideal_exp)) 13477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1348cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista # Here the quotient is too large to be representable 1349cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = context._raise_error(DivisionImpossible, 1350cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 'quotient too large in //, % or divmod') 1351cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans, ans 13527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13538aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson def __rtruediv__(self, other, context=None): 13548aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson """Swaps self/other and returns __truediv__.""" 1355636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1356267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1357267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 13588aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson return other.__truediv__(self, context=context) 13598aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson 13608aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson __div__ = __truediv__ 13618aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson __rdiv__ = __rtruediv__ 13627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __divmod__(self, other, context=None): 13647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1365cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista Return (self // other, self % other) 13667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1367cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista other = _convert_other(other) 1368cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if other is NotImplemented: 1369cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return other 1370cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1371cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if context is None: 1372cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista context = getcontext() 1373cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1374cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = self._check_nans(other, context) 1375cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if ans: 1376cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return (ans, ans) 1377cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1378cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista sign = self._sign ^ other._sign 1379cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if self._isinfinity(): 1380cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if other._isinfinity(): 1381cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)') 1382cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans, ans 1383cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1384b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return (_SignedInfinity[sign], 1385cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista context._raise_error(InvalidOperation, 'INF % x')) 1386cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1387cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not other: 1388cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not self: 1389cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)') 1390cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans, ans 1391cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1392cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return (context._raise_error(DivisionByZero, 'x // 0', sign), 1393cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista context._raise_error(InvalidOperation, 'x % 0')) 1394cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1395cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista quotient, remainder = self._divide(other, context) 1396e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista remainder = remainder._fix(context) 1397cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return quotient, remainder 13987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rdivmod__(self, other, context=None): 14007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __divmod__.""" 1401636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1402267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1403267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 14047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__divmod__(self, context=context) 14057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __mod__(self, other, context=None): 14077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 14087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self % other 14097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1410636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1411267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1412267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 14137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1414cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if context is None: 1415cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista context = getcontext() 14167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1417cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = self._check_nans(other, context) 1418cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if ans: 1419cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans 14207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1421cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if self._isinfinity(): 1422cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(InvalidOperation, 'INF % x') 1423cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista elif not other: 1424cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if self: 1425cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(InvalidOperation, 'x % 0') 1426cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1427cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionUndefined, '0 % 0') 1428cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1429cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista remainder = self._divide(other, context)[1] 1430e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista remainder = remainder._fix(context) 1431cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return remainder 14327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rmod__(self, other, context=None): 14347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __mod__.""" 1435636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1436267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1437267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 14387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__mod__(self, context=context) 14397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder_near(self, other, context=None): 14417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 14427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Remainder nearest to 0- abs(remainder-near) <= other/2 14437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1444636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 1445636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 14467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 14487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 1450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 1451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 14527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self == +/-infinity -> InvalidOperation 1454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 1455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'remainder_near(infinity, x)') 14577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # other == 0 -> either InvalidOperation or DivisionUndefined 1459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other: 1460353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self: 1461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1462353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'remainder_near(x, 0)') 1463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(DivisionUndefined, 1465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'remainder_near(0, 0)') 14667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # other = +/-infinity -> remainder = self 1468353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinfinity(): 1469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = Decimal(self) 1470353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 14717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self = 0 -> remainder = self, with ideal exponent 1473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ideal_exponent = min(self._exp, other._exp) 1474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 147572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(self._sign, '0', ideal_exponent) 1476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 14777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # catch most cases of large or small quotient 1479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista expdiff = self.adjusted() - other.adjusted() 1480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if expdiff >= context.prec + 1: 1481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expdiff >= prec+1 => abs(self/other) > 10**prec 1482cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionImpossible) 1483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if expdiff <= -2: 1484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expdiff <= -2 => abs(self/other) < 0.1 1485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._rescale(ideal_exponent, context.rounding) 1486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 14877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1488353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # adjust both arguments to have the same exponent, then divide 1489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op1 = _WorkRep(self) 1490353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op2 = _WorkRep(other) 1491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if op1.exp >= op2.exp: 1492353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op1.int *= 10**(op1.exp - op2.exp) 14937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 1494353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op2.int *= 10**(op2.exp - op1.exp) 1495353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q, r = divmod(op1.int, op2.int) 1496353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # remainder is r*10**ideal_exponent; other is +/-op2.int * 1497353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 10**ideal_exponent. Apply correction to ensure that 1498353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # abs(remainder) <= abs(other)/2 1499353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if 2*r + (q&1) > op2.int: 1500353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista r -= op2.int 1501353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q += 1 1502353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1503353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if q >= 10**context.prec: 1504cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionImpossible) 1505353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1506353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result has same sign as self unless r is negative 1507353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign = self._sign 1508353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if r < 0: 1509353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign = 1-sign 1510353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista r = -r 15117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 151272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(sign, str(r), ideal_exponent) 1513353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 15147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __floordiv__(self, other, context=None): 15167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """self // other""" 1517cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista other = _convert_other(other) 1518cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if other is NotImplemented: 1519cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return other 1520cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1521cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if context is None: 1522cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista context = getcontext() 1523cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1524cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = self._check_nans(other, context) 1525cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if ans: 1526cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans 1527cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1528cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if self._isinfinity(): 1529cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if other._isinfinity(): 1530cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(InvalidOperation, 'INF // INF') 1531cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1532b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[self._sign ^ other._sign] 1533cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1534cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not other: 1535cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if self: 1536cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionByZero, 'x // 0', 1537cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista self._sign ^ other._sign) 1538cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1539cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionUndefined, '0 // 0') 1540cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1541cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return self._divide(other, context)[0] 15427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rfloordiv__(self, other, context=None): 15447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __floordiv__.""" 1545636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1546267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1547267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 15487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__floordiv__(self, context=context) 15497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __float__(self): 15517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Float representation.""" 15527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return float(str(self)) 15537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __int__(self): 155546b0802ccd9a9c47b27a285526fbb2a8bee5b8cbBrett Cannon """Converts self to an int, truncating if necessary.""" 1556636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1557636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isnan(): 1558968f1690d39e8c825f9af1b634ff5b5a9517c290Mark Dickinson raise ValueError("Cannot convert NaN to integer") 1559636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger elif self._isinfinity(): 1560968f1690d39e8c825f9af1b634ff5b5a9517c290Mark Dickinson raise OverflowError("Cannot convert infinity to integer") 1561353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista s = (-1)**self._sign 15627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 156372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return s*int(self._int)*10**self._exp 1564605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger else: 156572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return s*int(self._int[:self._exp] or '0') 15667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15675a05364049a7b0c3eeee94fb7b77e6b41036b3aeRaymond Hettinger __trunc__ = __int__ 15685a05364049a7b0c3eeee94fb7b77e6b41036b3aeRaymond Hettinger 1569116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger def real(self): 1570116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger return self 157165808ff0c08e60572cf81ebe5dc24794a706f390Mark Dickinson real = property(real) 1572116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger 1573116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger def imag(self): 1574116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger return Decimal(0) 157565808ff0c08e60572cf81ebe5dc24794a706f390Mark Dickinson imag = property(imag) 1576116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger 1577116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger def conjugate(self): 1578116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger return self 1579116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger 1580116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger def __complex__(self): 1581116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger return complex(float(self)) 1582116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger 15837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __long__(self): 15847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts to a long. 15857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Equivalent to long(int(self)) 15877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 15887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return long(self.__int__()) 15897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1590353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _fix_nan(self, context): 1591353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Decapitate the payload of a NaN to fit the context""" 1592353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista payload = self._int 1593353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1594353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # maximum length of payload is precision if _clamp=0, 1595353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # precision-1 if _clamp=1. 1596353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista max_payload_len = context.prec - context._clamp 1597353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if len(payload) > max_payload_len: 159872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista payload = payload[len(payload)-max_payload_len:].lstrip('0') 159972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, payload, self._exp, True) 16006c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 1601353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1602dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger def _fix(self, context): 16037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Round if it is necessary to keep self within prec precision. 16047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds and fixes the exponent. Does not raise on a sNaN. 16067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Arguments: 16087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self - Decimal instance 16097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context - context used. 16107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1611636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1612353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special: 1613353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isnan(): 1614353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # decapitate payload if necessary 1615353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._fix_nan(context) 1616353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1617353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self is +/-Infinity; return unaltered 16186c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 16197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1620353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if self is zero then exponent should be between Etiny and 1621353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Emax if _clamp==0, and between Etiny and Etop if _clamp==1. 1622353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Etiny = context.Etiny() 1623353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Etop = context.Etop() 16247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 1625353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp_max = [context.Emax, Etop][context._clamp] 1626353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista new_exp = min(max(self._exp, Etiny), exp_max) 1627353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if new_exp != self._exp: 1628353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Clamped) 162972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, '0', new_exp) 16307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 16316c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 16327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1633353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp_min is the smallest allowable exponent of the result, 1634353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # equal to max(self.adjusted()-context.prec+1, Etiny) 1635353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp_min = len(self._int) + self._exp - context.prec 1636353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if exp_min > Etop: 1637353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # overflow: exp_min > Etop iff self.adjusted() > Emax 1638353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 1639353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 1640353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(Overflow, 'above Emax', self._sign) 1641353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self_is_subnormal = exp_min < Etiny 1642353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_is_subnormal: 1643353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Subnormal) 1644353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp_min = Etiny 16457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1646353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # round if self has too many digits 1647353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._exp < exp_min: 16487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 16492ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista digits = len(self._int) + self._exp - exp_min 16502ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if digits < 0: 16512ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista self = _dec_from_triple(self._sign, '1', exp_min-1) 16522ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista digits = 0 16532ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista this_function = getattr(self, self._pick_rounding_function[context.rounding]) 16542ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista changed = this_function(digits) 16552ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista coeff = self._int[:digits] or '0' 16562ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if changed == 1: 16572ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista coeff = str(int(coeff)+1) 16582ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista ans = _dec_from_triple(self._sign, coeff, exp_min) 16592ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista 16602ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if changed: 1661353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 1662353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_is_subnormal: 1663353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Underflow) 1664353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not ans: 1665353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # raise Clamped on underflow to 0 1666353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Clamped) 1667353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif len(ans._int) == context.prec+1: 1668353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # we get here only if rescaling rounds the 1669353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # cofficient up to exactly 10**context.prec 1670353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans._exp < Etop: 167172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(ans._sign, 167272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans._int[:-1], ans._exp+1) 1673353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1674353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Inexact and Rounded have already been raised 1675353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = context._raise_error(Overflow, 'above Emax', 1676353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self._sign) 16777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 16787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1679353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # fold down if _clamp == 1 and self has too few digits 1680353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context._clamp == 1 and self._exp > Etop: 1681353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Clamped) 168272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self_padded = self._int + '0'*(self._exp - Etop) 168372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, self_padded, Etop) 16847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1685353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # here self was representable to begin with; return unchanged 16866c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 16877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _pick_rounding_function = {} 16897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1690353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # for each of the rounding functions below: 1691353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self is a finite, nonzero Decimal 1692353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # prec is an integer satisfying 0 <= prec < len(self._int) 16932ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # 16942ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # each function returns either -1, 0, or 1, as follows: 16952ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # 1 indicates that self should be rounded up (away from zero) 16962ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # 0 indicates that self should be truncated, and that all the 16972ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # digits to be truncated are zeros (so the value is unchanged) 16982ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # -1 indicates that there are nonzero digits to be truncated 16997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1700353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_down(self, prec): 1701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Also known as round-towards-0, truncate.""" 17022ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if _all_zeros(self._int, prec): 17032ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return 0 17042ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista else: 17052ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -1 17067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1707353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_up(self, prec): 1708353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rounds away from 0.""" 17092ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -self._round_down(prec) 17107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_half_up(self, prec): 1712353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rounds 5 up (away from 0)""" 171372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista if self._int[prec] in '56789': 17142ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return 1 17152ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista elif _all_zeros(self._int, prec): 17162ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return 0 1717353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 17182ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -1 17197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1720353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_half_down(self, prec): 17217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Round 5 down""" 17222ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if _exact_half(self._int, prec): 17232ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -1 17242ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista else: 17252ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return self._round_half_up(prec) 17267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1727353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_half_even(self, prec): 1728353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Round 5 to even, rest to nearest.""" 17292ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if _exact_half(self._int, prec) and \ 17302ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista (prec == 0 or self._int[prec-1] in '02468'): 17312ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -1 1732353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 17332ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return self._round_half_up(prec) 17347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1735353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_ceiling(self, prec): 17367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds up (not away from 0 if negative.)""" 17377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 1738353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._round_down(prec) 17397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 17402ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -self._round_down(prec) 17417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_floor(self, prec): 17437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds down (not towards 0 if negative)""" 17447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self._sign: 1745353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._round_down(prec) 17467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 17472ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -self._round_down(prec) 17487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1749353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_05up(self, prec): 1750353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Round down unless digit prec-1 is 0 or 5.""" 17512ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if prec and self._int[prec-1] not in '05': 1752353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._round_down(prec) 17532ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista else: 17542ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -self._round_down(prec) 1755353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1756353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def fma(self, other, third, context=None): 1757353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Fused multiply-add. 17587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1759353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Returns self*other+third with no rounding of the intermediate 1760353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista product self*other. 1761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self and other are multiplied together, with no rounding of 1763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista the result. The third operand is then added to the result, 1764353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista and a single final rounding is performed. 17657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1766353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 17687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 176958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista # compute product; raise InvalidOperation if either operand is 177058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista # a signaling NaN or if the product is zero times infinity. 177158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if self._is_special or other._is_special: 177258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if context is None: 177358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista context = getcontext() 177458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if self._exp == 'N': 17750f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista return context._raise_error(InvalidOperation, 'sNaN', self) 177658f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if other._exp == 'N': 17770f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista return context._raise_error(InvalidOperation, 'sNaN', other) 177858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if self._exp == 'n': 177958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista product = self 178058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista elif other._exp == 'n': 178158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista product = other 178258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista elif self._exp == 'F': 178358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if not other: 178458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista return context._raise_error(InvalidOperation, 178558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista 'INF * 0 in fma') 1786b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger product = _SignedInfinity[self._sign ^ other._sign] 178758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista elif other._exp == 'F': 178858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if not self: 178958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista return context._raise_error(InvalidOperation, 179058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista '0 * INF in fma') 1791b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger product = _SignedInfinity[self._sign ^ other._sign] 179258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista else: 179358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista product = _dec_from_triple(self._sign ^ other._sign, 179458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista str(int(self._int) * int(other._int)), 179558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista self._exp + other._exp) 17967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 179758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista third = _convert_other(third, raiseit=True) 179858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista return product.__add__(third, context) 17997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _power_modulo(self, other, modulo, context=None): 1801353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Three argument version of __pow__""" 18027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if can't convert other and modulo to Decimal, raise 1804353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # TypeError; there's no point returning NotImplemented (no 1805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # equivalent of __rpow__ for three argument pow) 1806353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 1807353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista modulo = _convert_other(modulo, raiseit=True) 18087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 1810353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 18117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1812353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # deal with NaNs: if there are any sNaNs then first one wins, 1813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (i.e. behaviour for NaNs is identical to that of fma) 1814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self_is_nan = self._isnan() 1815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other_is_nan = other._isnan() 1816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista modulo_is_nan = modulo._isnan() 1817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_is_nan or other_is_nan or modulo_is_nan: 1818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_is_nan == 2: 1819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 'sNaN', 18200f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista self) 1821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_is_nan == 2: 1822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 'sNaN', 18230f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista other) 1824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if modulo_is_nan == 2: 1825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 'sNaN', 18260f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista modulo) 1827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_is_nan: 18286c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return self._fix_nan(context) 1829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_is_nan: 18306c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return other._fix_nan(context) 18316c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return modulo._fix_nan(context) 1832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # check inputs: we apply same restrictions as Python's pow() 1834353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (self._isinteger() and 1835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other._isinteger() and 1836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista modulo._isinteger()): 1837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'pow() 3rd argument not allowed ' 1839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'unless all arguments are integers') 1840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other < 0: 1841353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1842353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'pow() 2nd argument cannot be ' 1843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'negative when 3rd argument specified') 1844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not modulo: 1845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'pow() 3rd argument cannot be 0') 1847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # additional restriction for decimal: the modulus must be less 1849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # than 10**prec in absolute value 1850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if modulo.adjusted() >= context.prec: 1851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'insufficient precision: pow() 3rd ' 1853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'argument must not have more than ' 1854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'precision digits') 1855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # define 0**0 == NaN, for consistency with two-argument pow 1857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (even though it hurts!) 1858353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other and not self: 1859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'at least one of pow() 1st argument ' 1861353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'and 2nd argument must be nonzero ;' 1862353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '0**0 is not defined') 1863353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute sign of result 1865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._iseven(): 1866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign = 0 1867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign = self._sign 1869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # convert modulo to a Python integer, and self and other to 1871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Decimal integers (i.e. force their exponents to be >= 0) 1872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista modulo = abs(int(modulo)) 1873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista base = _WorkRep(self.to_integral_value()) 1874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exponent = _WorkRep(other.to_integral_value()) 1875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute result using integer pow() 1877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo 1878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista for i in xrange(exponent.exp): 1879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista base = pow(base, 10, modulo) 1880353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista base = pow(base, exponent.int, modulo) 1881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 188272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(sign, str(base), 0) 1883353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _power_exact(self, other, p): 1885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Attempt to compute self**other exactly. 1886353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Given Decimals self and other and an integer p, attempt to 1888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista compute an exact result for the power self**other, with p 1889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista digits of precision. Return None if self**other is not 1890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exactly representable in p digits. 1891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Assumes that elimination of special cases has already been 1893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista performed: self and other must both be nonspecial; self must 1894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista be positive and not numerically equal to 1; other must be 1895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista nonzero. For efficiency, other._exp should not be too large, 1896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista so that 10**abs(other._exp) is a feasible calculation.""" 1897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # In the comments below, we write x for the value of self and 1899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # y for the value of other. Write x = xc*10**xe and y = 1900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # yc*10**ye. 1901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1902353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # The main purpose of this method is to identify the *failure* 1903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # of x**y to be exactly representable with as little effort as 1904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # possible. So we look for cheap and easy tests that 1905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # eliminate the possibility of x**y being exact. Only if all 1906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # these tests are passed do we go on to actually compute x**y. 1907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Here's the main idea. First normalize both x and y. We 1909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # express y as a rational m/n, with m and n relatively prime 1910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # and n>0. Then for x**y to be exactly representable (at 1911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # *any* precision), xc must be the nth power of a positive 1912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # integer and xe must be divisible by n. If m is negative 1913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # then additionally xc must be a power of either 2 or 5, hence 1914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # a power of 2**n or 5**n. 1915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # There's a limit to how small |y| can be: if y=m/n as above 1917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # then: 1918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (1) if xc != 1 then for the result to be representable we 1920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So 1921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <= 1922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 2**(1/|y|), hence xc**|y| < 2 and the result is not 1923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # representable. 1924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if 1926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # |y| < 1/|xe| then the result is not representable. 1927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Note that since x is not equal to 1, at least one of (1) and 1929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) < 1930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye. 1931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # There's also a limit to how large y can be, at least if it's 1933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # positive: the normalized result will have coefficient xc**y, 1934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # so if it's representable then xc**y < 10**p, and y < 1935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # p/log10(xc). Hence if y*log10(xc) >= p then the result is 1936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # not exactly representable. 1937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye, 1939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # so |y| < 1/xe and the result is not representable. 1940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y| 1941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # < 1/nbits(xc). 1942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista x = _WorkRep(self) 1944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc, xe = x.int, x.exp 1945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while xc % 10 == 0: 1946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc //= 10 1947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe += 1 1948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _WorkRep(other) 1950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista yc, ye = y.int, y.exp 1951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while yc % 10 == 0: 1952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista yc //= 10 1953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ye += 1 1954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # case where xc == 1: result is 10**(xe*y), with xe*y 1956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # required to be an integer 1957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc == 1: 1958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ye >= 0: 1959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exponent = xe*yc*10**ye 1960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exponent, remainder = divmod(xe*yc, 10**-ye) 1962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 1963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if y.sign == 1: 1965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exponent = -exponent 1966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if other is a nonnegative integer, use ideal exponent 1967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinteger() and other._sign == 0: 1968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ideal_exponent = self._exp*int(other) 1969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista zeros = min(exponent-ideal_exponent, p-1) 1970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista zeros = 0 197272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros) 1973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # case where y is negative: xc must be either a power 1975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # of 2 or a power of 5. 1976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if y.sign == 1: 1977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista last_digit = xc % 10 1978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if last_digit in (2,4,6,8): 1979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # quick test for power of 2 1980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc & -xc != xc: 1981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # now xc is a power of 2; e is its exponent 1983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e = _nbits(xc)-1 1984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # find e*y and xe*y; both must be integers 1985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ye >= 0: 1986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y_as_int = yc*10**ye 1987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e = e*y_as_int 1988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe = xe*y_as_int 1989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ten_pow = 10**-ye 1991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e, remainder = divmod(e*yc, ten_pow) 1992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 1993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe, remainder = divmod(xe*yc, ten_pow) 1995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 1996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if e*65 >= p*93: # 93/65 > log(10)/log(5) 1999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc = 5**e 2001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif last_digit == 5: 2003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # e >= log_5(xc) if xc is a power of 5; we have 2004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # equality all the way up to xc=5**2658 2005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e = _nbits(xc)*28//65 2006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc, remainder = divmod(5**e, xc) 2007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 2008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while xc % 5 == 0: 2010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc //= 5 2011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e -= 1 2012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ye >= 0: 2013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y_as_integer = yc*10**ye 2014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e = e*y_as_integer 2015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe = xe*y_as_integer 2016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ten_pow = 10**-ye 2018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e, remainder = divmod(e*yc, ten_pow) 2019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 2020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe, remainder = divmod(xe*yc, ten_pow) 2022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 2023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if e*3 >= p*10: # 10/3 > log(10)/log(2) 2025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc = 2**e 2027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 20297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc >= 10**p: 2031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe = -e-xe 203372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, str(xc), xe) 20347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # now y is positive; find m and n such that y = m/n 2036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ye >= 0: 2037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista m, n = yc*10**ye, 1 2038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xe != 0 and len(str(abs(yc*xe))) <= -ye: 2040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc_bits = _nbits(xc) 2042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye: 2043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista m, n = yc, 10**(-ye) 2045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while m % 2 == n % 2 == 0: 2046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista m //= 2 2047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n //= 2 2048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while m % 5 == n % 5 == 0: 2049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista m //= 5 2050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n //= 5 2051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute nth root of xc*10**xe 2053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if n > 1: 2054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if 1 < xc < 2**n then xc isn't an nth power 2055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc != 1 and xc_bits <= n: 2056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe, rem = divmod(xe, n) 2059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if rem != 0: 2060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute nth root of xc using Newton's method 2063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista a = 1L << -(-_nbits(xc)//n) # initial estimate 2064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 2065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q, r = divmod(xc, a**(n-1)) 2066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if a <= q: 2067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista break 2068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista a = (a*(n-1) + q)//n 2070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (a == q and r == 0): 2071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc = a 2073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # now xc*10**xe is the nth root of the original xc*10**xe 2075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute mth power of xc*10**xe 2076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m > 2078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 10**p and the result is not representable. 2079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc > 1 and m > p*100//_log10_lb(xc): 2080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc = xc**m 2082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe *= m 2083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc > 10**p: 2084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # by this point the result *is* exactly representable 2087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # adjust the exponent to get as close as possible to the ideal 2088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exponent, if necessary 2089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista str_xc = str(xc) 2090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinteger() and other._sign == 0: 2091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ideal_exponent = self._exp*int(other) 2092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista zeros = min(xe-ideal_exponent, p-len(str_xc)) 2093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista zeros = 0 209572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros) 2096cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 2097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def __pow__(self, other, modulo=None, context=None): 2098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Return self ** other [ % modulo]. 20997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista With two arguments, compute self**other. 21017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista With three arguments, compute (self**other) % modulo. For the 2103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista three argument form, the following restrictions on the 2104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista arguments hold: 21057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - all three arguments must be integral 2107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - other must be nonnegative 2108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - either self or other (or both) must be nonzero 2109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - modulo must be nonzero and must have at most p digits, 2110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista where p is the context precision. 21117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista If any of these restrictions is violated the InvalidOperation 2113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista flag is raised. 2114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result of pow(self, other, modulo) is identical to the 2116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista result that would be obtained by computing (self**other) % 2117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista modulo with unbounded precision, but is computed more 2118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista efficiently. It is always exact. 2119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if modulo is not None: 2122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._power_modulo(other, modulo, context) 21237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2124636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 2125267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 2126267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 21277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 21307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # either argument is a NaN => result is NaN 2132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 2133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 2134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 21357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity) 2137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other: 2138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 2139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, '0 ** 0') 2140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2141b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 21427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result has sign 1 iff self._sign is 1 and other is an odd integer 2144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista result_sign = 0 2145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign == 1: 2146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinteger(): 2147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other._iseven(): 2148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista result_sign = 1 2149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # -ve**noninteger = NaN 2151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (-0)**noninteger = 0**noninteger 2152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self: 2153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'x ** y with x negative and y not an integer') 2155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # negate self, without doing any unwanted rounding 215672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self = self.copy_negate() 2157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity 2159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 2160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._sign == 0: 216172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(result_sign, '0', 0) 2162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2163b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[result_sign] 2164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0 2166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 2167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._sign == 0: 2168b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[result_sign] 2169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 217072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(result_sign, '0', 0) 2171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1**other = 1, but the choice of exponent and the flags 2173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # depend on the exponent of self, and on whether other is a 2174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # positive integer, a negative integer, or neither 2175b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger if self == _One: 2176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinteger(): 2177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp = max(self._exp*max(int(other), 0), 2178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1-context.prec) but evaluating int(other) directly 2179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # is dangerous until we know other is small (other 2180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # could be 1e999999999) 2181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._sign == 1: 2182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista multiplier = 0 2183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif other > context.prec: 2184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista multiplier = context.prec 2185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista multiplier = int(other) 2187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp = self._exp * multiplier 2189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if exp < 1-context.prec: 2190353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp = 1-context.prec 2191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 2192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 2194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 2195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp = 1-context.prec 2196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 219772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(result_sign, '1'+'0'*-exp, exp) 2198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute adjusted exponent of self 2200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self_adj = self.adjusted() 2201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self ** infinity is infinity if self > 1, 0 if self < 1 2203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self ** -infinity is infinity if self < 1, 0 if self > 1 2204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinfinity(): 2205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if (other._sign == 0) == (self_adj < 0): 220672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(result_sign, '0', 0) 2207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2208b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _SignedInfinity[result_sign] 2209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # from here on, the result always goes through the call 2211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # to _fix at the end of this function. 2212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = None 2213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # crude test to catch cases of extreme overflow/underflow. If 2215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(self)*other >= 10**bound and bound >= len(str(Emax)) 2216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence 2217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self**other >= 10**(Emax+1), so overflow occurs. The test 2218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # for underflow is similar. 2219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista bound = self._log10_exp_bound() + other.adjusted() 2220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if (self_adj >= 0) == (other._sign == 0): 2221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self > 1 and other +ve, or self < 1 and other -ve 2222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # possibility of overflow 2223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if bound >= len(str(context.Emax)): 222472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(result_sign, '1', context.Emax+1) 2225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self > 1 and other -ve, or self < 1 and other +ve 2227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # possibility of underflow to 0 2228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Etiny = context.Etiny() 2229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if bound >= len(str(-Etiny)): 223072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(result_sign, '1', Etiny-1) 2231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # try for an exact result with precision +1 2233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans is None: 2234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._power_exact(other, context.prec + 1) 2235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans is not None and result_sign == 1: 223672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(1, ans._int, ans._exp) 2237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # usual case: inexact result, x**y computed directly as exp(y*log(x)) 2239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans is None: 2240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p = context.prec 2241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista x = _WorkRep(self) 2242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc, xe = x.int, x.exp 2243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _WorkRep(other) 2244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista yc, ye = y.int, y.exp 2245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if y.sign == 1: 2246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista yc = -yc 2247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute correctly rounded result: start with precision +3, 2249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # then increase precision until result is unambiguously roundable 2250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista extra = 3 2251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 2252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff, exp = _dpower(xc, xe, yc, ye, p+extra) 2253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if coeff % (5*10**(len(str(coeff))-p-1)): 2254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista break 2255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista extra += 3 2256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 225772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(result_sign, str(coeff), exp) 2258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the specification says that for non-integer other we need to 2260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # raise Inexact, even when the result is actually exact. In 2261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the same way, we need to raise Underflow here if the result 2262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # is subnormal. (The call to _fix will take care of raising 2263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Rounded and Subnormal, as usual.) 2264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other._isinteger(): 2265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 2266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # pad with zeros up to length context.prec+1 if necessary 2267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if len(ans._int) <= context.prec: 2268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista expdiff = context.prec+1 - len(ans._int) 226972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff, 227072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans._exp-expdiff) 2271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans.adjusted() < context.Emin: 2272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Underflow) 2273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # unlike exp, ln and log10, the power function respects the 2275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # rounding mode; no need to use ROUND_HALF_EVEN here 2276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = ans._fix(context) 2277353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def __rpow__(self, other, context=None): 2280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Swaps self/other and returns __pow__.""" 2281353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other) 2282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other is NotImplemented: 2283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return other 2284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return other.__pow__(self, context=context) 2285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def normalize(self, context=None): 2287353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Normalize- strip trailing 0s, change anything equal to 0 to 0e0""" 2288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2289353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 2291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special: 2293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 2294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 2295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista dup = self._fix(context) 2298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if dup._isinfinity(): 2299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return dup 2300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not dup: 230272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(dup._sign, '0', 0) 2303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp_max = [context.Emax, context.Etop()][context._clamp] 2304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista end = len(dup._int) 23057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = dup._exp 230672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista while dup._int[end-1] == '0' and exp < exp_max: 23077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp += 1 23087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger end -= 1 230972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(dup._sign, dup._int[:end], exp) 23107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2311bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista def quantize(self, exp, rounding=None, context=None, watchexp=True): 23127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Quantize self so its exponent is the same as that of exp. 23137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Similar to self._rescale(exp._exp) but with error checking. 23157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2316bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista exp = _convert_other(exp, raiseit=True) 2317bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista 2318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 2320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if rounding is None: 2321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context.rounding 2322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2323636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or exp._is_special: 2324636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(exp, context) 2325636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 2326636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 23277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2328636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp._isinfinity() or self._isinfinity(): 2329636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp._isinfinity() and self._isinfinity(): 23306c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) # if both are inf, it is OK 2331636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 2332636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 'quantize with one INF') 2333353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2334bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista # if we're not watching exponents, do a simple rescale 2335bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista if not watchexp: 2336bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista ans = self._rescale(exp._exp, rounding) 2337bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista # raise Inexact and Rounded where appropriate 2338bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista if ans._exp > self._exp: 2339bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista context._raise_error(Rounded) 2340bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista if ans != self: 2341bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista context._raise_error(Inexact) 2342bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista return ans 2343bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista 2344353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp._exp should be between Etiny and Emax 2345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (context.Etiny() <= exp._exp <= context.Emax): 2346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'target exponent out of bounds in quantize') 2348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 235072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(self._sign, '0', exp._exp) 2351353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 2352353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2353353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self_adjusted = self.adjusted() 2354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_adjusted > context.Emax: 2355353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2356353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'exponent of quantize result too large for current context') 2357353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_adjusted - exp._exp + 1 > context.prec: 2358353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2359353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'quantize result has too many digits for current context') 2360353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2361353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._rescale(exp._exp, rounding) 2362353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans.adjusted() > context.Emax: 2363353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2364353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'exponent of quantize result too large for current context') 2365353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if len(ans._int) > context.prec: 2366353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'quantize result has too many digits for current context') 2368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2369353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # raise appropriate flags 2370353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans._exp > self._exp: 2371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 2372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans != self: 2373353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 2374353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans and ans.adjusted() < context.Emin: 2375353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Subnormal) 2376353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2377353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # call to fix takes care of any necessary folddown 2378353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = ans._fix(context) 2379353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 23807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def same_quantum(self, other): 23821a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self and other have the same exponent; otherwise 23831a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return False. 23847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23851a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista If either operand is a special value, the following rules are used: 23861a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista * return True if both operands are infinities 23871a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista * return True if both operands are NaNs 23881a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista * otherwise, return False. 23897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23901a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista other = _convert_other(other, raiseit=True) 2391636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 23921a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return (self.is_nan() and other.is_nan() or 23931a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista self.is_infinite() and other.is_infinite()) 23947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._exp == other._exp 23957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2396353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _rescale(self, exp, rounding): 2397353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rescale self so that the exponent is exp, either by padding with zeros 2398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista or by truncating digits, using the given rounding mode. 2399353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2400353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Specials are returned without change. This operation is 2401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista quiet: it raises no flags, and uses no information from the 2402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context. 24037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = exp to scale to (an integer) 2405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = rounding mode 24067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2407636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 24086c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 24097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 241072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, '0', exp) 24117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2412353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._exp >= exp: 2413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # pad answer with zeros if necessary 241472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, 241572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._int + '0'*(self._exp - exp), exp) 24167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # too many digits; round and lose data. If self.adjusted() < 2418353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp-1, replace self by 10**(exp-1) before rounding 2419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista digits = len(self._int) + self._exp - exp 24207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if digits < 0: 242172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self = _dec_from_triple(self._sign, '1', exp-1) 2422353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista digits = 0 2423353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista this_function = getattr(self, self._pick_rounding_function[rounding]) 24242ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista changed = this_function(digits) 24252ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista coeff = self._int[:digits] or '0' 24262ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if changed == 1: 24272ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista coeff = str(int(coeff)+1) 24282ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return _dec_from_triple(self._sign, coeff, exp) 24297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson def _round(self, places, rounding): 24311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """Round a nonzero, nonspecial Decimal to a fixed number of 24321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson significant figures, using the given rounding mode. 24331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 24341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson Infinities, NaNs and zeros are returned unaltered. 24351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 24361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson This operation is quiet: it raises no flags, and uses no 24371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson information from the context. 24381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 24391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """ 24401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if places <= 0: 24411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson raise ValueError("argument should be at least 1 in _round") 24421ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if self._is_special or not self: 24431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson return Decimal(self) 24441ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson ans = self._rescale(self.adjusted()+1-places, rounding) 24451ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # it can happen that the rescale alters the adjusted exponent; 24461ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # for example when rounding 99.97 to 3 significant figures. 24471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # When this happens we end up with an extra 0 at the end of 24481ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # the number; a second rescale fixes this. 24491ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if ans.adjusted() != self.adjusted(): 24501ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson ans = ans._rescale(ans.adjusted()+1-places, rounding) 24511ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson return ans 24521ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 2453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def to_integral_exact(self, rounding=None, context=None): 2454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rounds to a nearby integer. 24557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista If no rounding mode is specified, take the rounding mode from 2457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista the context. This method raises the Rounded and Inexact flags 2458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista when appropriate. 24597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2460353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista See also: to_integral_value, which does exactly the same as 2461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista this method except that it doesn't raise Inexact or Rounded. 2462353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2463636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 2464636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 2465636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 2466636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 24676c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 24687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 24696c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 2470353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 247172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, '0', 0) 2472636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 2473636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 2474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if rounding is None: 2475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context.rounding 2476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 2477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._rescale(0, rounding) 2478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans != self: 2479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 24807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 24817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2482353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def to_integral_value(self, rounding=None, context=None): 2483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rounds to the nearest integer, without raising inexact, rounded.""" 2484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 2486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if rounding is None: 2487353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context.rounding 2488353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special: 2489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 2490353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 2491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 24926c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 2493353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._exp >= 0: 24946c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 2495353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2496353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._rescale(0, rounding) 24977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2498353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the method name changed, but we provide also the old one, for compatibility 2499353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista to_integral = to_integral_value 2500353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2501353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def sqrt(self, context=None): 2502353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Return the square root of self.""" 25033b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson if context is None: 25043b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson context = getcontext() 25053b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson 2506636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 2507636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 2508636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 2509636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 25107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2511636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity() and self._sign == 0: 2512636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(self) 25137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 2515353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exponent = self._exp // 2. sqrt(-0) = -0 251672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(self._sign, '0', self._exp // 2) 2517353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 25187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign == 1: 25207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0') 25217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2522353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # At this point self represents a positive number. Let p be 2523353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the desired precision and express self in the form c*100**e 2524353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # with c a positive real number and e an integer, c and e 2525353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # being chosen so that 100**(p-1) <= c < 100**p. Then the 2526353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1) 2527353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # <= sqrt(c) < 10**p, so the closest representable Decimal at 2528353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # precision p is n*10**e where n = round_half_even(sqrt(c)), 2529353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the closest integer to sqrt(c) with the even integer chosen 2530353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # in the case of a tie. 2531353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 2532353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # To ensure correct rounding in all cases, we use the 2533353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # following trick: we compute the square root to an extra 2534353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # place (precision p+1 instead of precision p), rounding down. 2535353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Then, if the result is inexact and its last digit is 0 or 5, 2536353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # we increase the last digit to 1 or 6 respectively; if it's 2537353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exact we leave the last digit alone. Now the final round to 2538353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # p places (or fewer in the case of underflow) will round 2539353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # correctly and raise the appropriate flags. 2540353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # use an extra digit of precision 2542353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista prec = context.prec+1 2543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2544353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # write argument in the form c*100**e where e = self._exp//2 2545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # is the 'ideal' exponent, to be used if the square root is 2546353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exactly representable. l is the number of 'digits' of c in 2547353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # base 100, so that 100**(l-1) <= c < 100**l. 2548353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 2549353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e = op.exp >> 1 2550353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if op.exp & 1: 2551353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = op.int * 10 2552353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista l = (len(self._int) >> 1) + 1 25537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 2554353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = op.int 2555353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista l = len(self._int)+1 >> 1 2556353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2557353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # rescale so that c has exactly prec base 100 'digits' 2558353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista shift = prec-l 2559353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if shift >= 0: 2560353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c *= 100**shift 2561353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exact = True 25627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 2563353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, remainder = divmod(c, 100**-shift) 2564353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exact = not remainder 2565353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e -= shift 2566353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2567353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # find n = floor(sqrt(c)) using Newton's method 2568353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n = 10**prec 2569353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 2570353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q = c//n 2571353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if n <= q: 25727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 2573353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2574353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n = n + q >> 1 2575353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exact = exact and n*n == c 2576353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2577353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if exact: 2578353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result is exact; rescale to use ideal exponent e 2579353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if shift >= 0: 2580353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # assert n % 10**shift == 0 2581353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n //= 10**shift 2582353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2583353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n *= 10**-shift 2584353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e += shift 25857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 2586353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result is not exact; fix last digit as described above 2587353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if n % 5 == 0: 2588353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n += 1 25897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 259072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, str(n), e) 25917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2592353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # round, and fit to current context 2593353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context._shallow_copy() 2594353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context._set_rounding(ROUND_HALF_EVEN) 2595dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 2596353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context.rounding = rounding 25977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2598353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 25997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def max(self, other, context=None): 26017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the larger value. 26027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2603353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Like max(self, other) except if one is not a number, returns 26047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN (and signals if one is sNaN). Also rounds. 26057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2606353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 2607636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 26086c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista if context is None: 26096c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista context = getcontext() 26106c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista 2611636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 261259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If one operand is a quiet NaN and the other is number, then the 2613636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # number is always returned 2614636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger sn = self._isnan() 2615636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger on = other._isnan() 2616636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if sn or on: 2617e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista if on == 1 and sn == 0: 2618e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista return self._fix(context) 2619e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista if sn == 1 and on == 0: 2620e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista return other._fix(context) 2621636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self._check_nans(other, context) 26227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26232fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson c = self._cmp(other) 2624d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger if c == 0: 262559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If both operands are finite and equal in numerical value 2626d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # then an ordering is applied: 2627d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # 262859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If the signs differ then max returns the operand with the 2629d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # positive sign and min returns the operand with the negative sign 2630d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # 263159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If the signs are the same then the exponent is used to select 2632353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the result. This is exactly the ordering used in compare_total. 2633353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = self.compare_total(other) 2634353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2635353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == -1: 26367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = other 2637353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2638353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self 2639636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2640e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 26417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def min(self, other, context=None): 26437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the smaller value. 26447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 264559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista Like min(self, other) except if one is not a number, returns 26467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN (and signals if one is sNaN). Also rounds. 26477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2648353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 2649636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 26506c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista if context is None: 26516c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista context = getcontext() 26526c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista 2653636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 265459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If one operand is a quiet NaN and the other is number, then the 2655636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # number is always returned 2656636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger sn = self._isnan() 2657636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger on = other._isnan() 2658636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if sn or on: 2659e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista if on == 1 and sn == 0: 2660e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista return self._fix(context) 2661e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista if sn == 1 and on == 0: 2662e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista return other._fix(context) 2663636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self._check_nans(other, context) 26647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26652fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson c = self._cmp(other) 2666d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger if c == 0: 2667353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = self.compare_total(other) 2668353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2669353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == -1: 2670353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self 2671353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 26727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = other 2673636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2674e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 26757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isinteger(self): 26777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether self is an integer""" 2678353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special: 2679353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return False 26807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 26817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return True 26827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rest = self._int[self._exp:] 268372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return rest == '0'*len(rest) 26847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _iseven(self): 2686353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns True if self is even. Assumes self is an integer.""" 2687353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self or self._exp > 0: 2688353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return True 268972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self._int[-1+self._exp] in '02468' 26907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def adjusted(self): 26927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the adjusted exponent of self""" 26937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger try: 26947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._exp + len(self._int) - 1 269559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If NaN or Infinity, self._exp is string 26967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger except TypeError: 26977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 26987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def canonical(self, context=None): 2700353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the same Decimal object. 2701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2702353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista As we do not have different encodings for the same number, the 2703353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista received object already is in its canonical form. 2704353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2705353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self 2706353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2707353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_signal(self, other, context=None): 2708353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares self to the other operand numerically. 2709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2710353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista It's pretty much like compare(), but all NaNs signal, with signaling 2711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista NaNs taking precedence over quiet NaNs. 2712353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 27132fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other, raiseit = True) 27142fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson ans = self._compare_check_nans(other, context) 27152fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if ans: 27162fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return ans 2717353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self.compare(other, context=context) 2718353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2719353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_total(self, other): 2720353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares self to other using the abstract representations. 2721353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2722353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista This is not like the standard compare, which use their numerical 2723353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista value. Note that a total ordering is defined for all possible abstract 2724353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista representations. 2725353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2726353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if one is negative and the other is positive, it's easy 2727353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign and not other._sign: 2728b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeOne 2729353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self._sign and other._sign: 2730b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2731353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign = self._sign 2732353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2733353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # let's handle both NaN types 2734353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self_nan = self._isnan() 2735353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other_nan = other._isnan() 2736353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan or other_nan: 2737353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan == other_nan: 27387a7739d75ed505033445248a126830bedb17101bMark Dickinson # compare payloads as though they're integers 27397a7739d75ed505033445248a126830bedb17101bMark Dickinson self_key = len(self._int), self._int 27407a7739d75ed505033445248a126830bedb17101bMark Dickinson other_key = len(other._int), other._int 27417a7739d75ed505033445248a126830bedb17101bMark Dickinson if self_key < other_key: 2742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sign: 2743b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2745b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeOne 27467a7739d75ed505033445248a126830bedb17101bMark Dickinson if self_key > other_key: 2747353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sign: 2748b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeOne 2749353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2750b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2751b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _Zero 2752353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sign: 2754353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan == 1: 2755b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeOne 2756353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_nan == 1: 2757b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2758353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan == 2: 2759b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeOne 2760353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_nan == 2: 2761b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan == 1: 2764b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_nan == 1: 2766b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeOne 2767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan == 2: 2768b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2769353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_nan == 2: 2770b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeOne 2771353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2772353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self < other: 2773b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeOne 2774353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self > other: 2775b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2776353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2777353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._exp < other._exp: 2778353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sign: 2779b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2780353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2781b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeOne 2782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._exp > other._exp: 2783353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sign: 2784b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeOne 2785353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2786b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2787b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _Zero 2788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2790353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_total_mag(self, other): 2791353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares self to other using abstract repr., ignoring sign. 2792353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2793353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Like compare_total, but with operand's sign ignored and assumed to be 0. 2794353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista s = self.copy_abs() 2796353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista o = other.copy_abs() 2797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return s.compare_total(o) 2798353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_abs(self): 2800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a copy with the sign set to 0. """ 280172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, self._int, self._exp, self._is_special) 2802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_negate(self): 2804353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a copy with the sign inverted.""" 2805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign: 280672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, self._int, self._exp, self._is_special) 2807353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 280872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(1, self._int, self._exp, self._is_special) 2809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2810353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_sign(self, other): 2811353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns self with the sign of other.""" 281272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(other._sign, self._int, 281372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._exp, self._is_special) 2814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def exp(self, context=None): 2816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns e ** self.""" 2817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 2820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp(NaN) = NaN 2822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 2823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 2824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp(-Infinity) = 0 2827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == -1: 2828b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _Zero 2829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp(0) = 1 2831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 2832b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _One 2833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2834353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp(Infinity) = Infinity 2835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == 1: 2836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Decimal(self) 2837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the result is now guaranteed to be inexact (the true 2839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # mathematical result is transcendental). There's no need to 2840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # raise Rounded and Inexact here---they'll always be raised as 2841353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # a result of the call to _fix. 2842353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p = context.prec 2843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista adj = self.adjusted() 2844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # we only need to do any computation for quite a small range 2846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # of adjusted exponents---for example, -29 <= adj <= 10 for 2847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the default context. For smaller exponent the result is 2848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # indistinguishable from 1 at the given precision, while for 2849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # larger exponent the result either overflows or underflows. 2850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign == 0 and adj > len(str((context.Emax+1)*3)): 2851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # overflow 285272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, '1', context.Emax+1) 2853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)): 2854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # underflow to 0 285572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, '1', context.Etiny()-1) 2856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif self._sign == 0 and adj < -p: 2857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # p+1 digits; final round will raise correct flags 285872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p) 2859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif self._sign == 1 and adj < -p-1: 2860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # p+1 digits; final round will raise correct flags 286172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, '9'*(p+1), -p-1) 2862353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # general case 2863353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 2865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, e = op.int, op.exp 2866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if op.sign == 1: 2867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = -c 2868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute correctly rounded result: increase precision by 2870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 3 digits at a time until we get an unambiguously 2871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # roundable result 2872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista extra = 3 2873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 2874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff, exp = _dexp(c, e, p+extra) 2875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if coeff % (5*10**(len(str(coeff))-p-1)): 2876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista break 2877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista extra += 3 2878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 287972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, str(coeff), exp) 2880353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # at this stage, ans should round correctly with *any* 2882353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # rounding mode, not just with ROUND_HALF_EVEN 2883353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context._shallow_copy() 2884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context._set_rounding(ROUND_HALF_EVEN) 2885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = ans._fix(context) 2886353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context.rounding = rounding 2887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_canonical(self): 28911a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is canonical; otherwise return False. 28921a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista 28931a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista Currently, the encoding of a Decimal instance is always 28941a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista canonical, so this method returns True for any Decimal. 28951a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """ 28961a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return True 2897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_finite(self): 28991a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is finite; otherwise return False. 2900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 29011a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista A Decimal instance is considered finite if it is neither 29021a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista infinite nor a NaN. 2903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 29041a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return not self._is_special 2905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_infinite(self): 29071a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is infinite; otherwise return False.""" 29081a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self._exp == 'F' 2909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_nan(self): 29111a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is a qNaN or sNaN; otherwise return False.""" 29121a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self._exp in ('n', 'N') 2913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_normal(self, context=None): 29151a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is a normal number; otherwise return False.""" 29161a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista if self._is_special or not self: 29171a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return False 2918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 29201a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return context.Emin <= self.adjusted() <= context.Emax 2921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_qnan(self): 29231a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is a quiet NaN; otherwise return False.""" 29241a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self._exp == 'n' 2925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_signed(self): 29271a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is negative; otherwise return False.""" 29281a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self._sign == 1 2929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_snan(self): 29311a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is a signaling NaN; otherwise return False.""" 29321a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self._exp == 'N' 2933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_subnormal(self, context=None): 29351a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is subnormal; otherwise return False.""" 29361a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista if self._is_special or not self: 29371a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return False 2938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 29401a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self.adjusted() < context.Emin 2941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_zero(self): 29431a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is a zero; otherwise return False.""" 294472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return not self._is_special and self._int == '0' 2945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _ln_exp_bound(self): 2947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compute a lower bound for the adjusted exponent of self.ln(). 2948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista In other words, compute r such that self.ln() >= 10**r. Assumes 2949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista that self is finite and positive and that self != 1. 2950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1 2953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista adj = self._exp + len(self._int) - 1 2954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj >= 1: 2955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10) 2956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(str(adj*23//10)) - 1 2957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj <= -2: 2958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # argument <= 0.1 2959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(str((-1-adj)*23//10)) - 1 2960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 2961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, e = op.int, op.exp 2962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj == 0: 2963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1 < self < 10 2964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista num = str(c-10**-e) 2965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista den = str(c) 2966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(num) - len(den) - (num < den) 2967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # adj == -1, 0.1 <= self < 1 2968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return e + len(str(10**-e - c)) - 1 2969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def ln(self, context=None): 2972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the natural (base e) logarithm of self.""" 2973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 2976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # ln(NaN) = NaN 2978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 2979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 2980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # ln(0.0) == -Infinity 2983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 2984b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeInfinity 2985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # ln(Infinity) = Infinity 2987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == 1: 2988b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _Infinity 2989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # ln(1.0) == 0.0 2991b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger if self == _One: 2992b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _Zero 2993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # ln(negative) raises InvalidOperation 2995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign == 1: 2996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'ln of a negative value') 2998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result is irrational, so necessarily inexact 3000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 3001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, e = op.int, op.exp 3002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p = context.prec 3003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # correctly rounded result: repeatedly increase precision by 3 3005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # until we get an unambiguously roundable result 3006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista places = p - self._ln_exp_bound() + 2 # at least p+3 places 3007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 3008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff = _dlog(c, e, places) 3009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # assert len(str(abs(coeff)))-p >= 1 3010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if coeff % (5*10**(len(str(abs(coeff)))-p-1)): 3011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista break 3012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista places += 3 301372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places) 3014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context._shallow_copy() 3016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context._set_rounding(ROUND_HALF_EVEN) 3017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = ans._fix(context) 3018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context.rounding = rounding 3019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _log10_exp_bound(self): 3022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compute a lower bound for the adjusted exponent of self.log10(). 3023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista In other words, find r such that self.log10() >= 10**r. 3024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Assumes that self is finite and positive and that self != 1. 3025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # For x >= 10 or x < 0.1 we only need a bound on the integer 3028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # part of log10(self), and this comes directly from the 3029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exponent of x. For 0.1 <= x <= 10 we use the inequalities 3030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| > 3031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0 3032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista adj = self._exp + len(self._int) - 1 3034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj >= 1: 3035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self >= 10 3036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(str(adj))-1 3037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj <= -2: 3038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self < 0.1 3039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(str(-1-adj))-1 3040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 3041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, e = op.int, op.exp 3042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj == 0: 3043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1 < self < 10 3044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista num = str(c-10**-e) 3045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista den = str(231*c) 3046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(num) - len(den) - (num < den) + 2 3047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # adj == -1, 0.1 <= self < 1 3048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista num = str(10**-e-c) 3049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(num) + e - (num < "231") - 1 3050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def log10(self, context=None): 3052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the base 10 logarithm of self.""" 3053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(NaN) = NaN 3058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 3059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(0.0) == -Infinity 3063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 3064b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeInfinity 3065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(Infinity) = Infinity 3067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == 1: 3068b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _Infinity 3069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(negative or -Infinity) raises InvalidOperation 3071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign == 1: 3072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 3073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'log10 of a negative value') 3074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(10**n) = n 307672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1): 3077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # answer may need rounding 3078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = Decimal(self._exp + len(self._int) - 1) 3079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result is irrational, so necessarily inexact 3081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 3082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, e = op.int, op.exp 3083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p = context.prec 3084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # correctly rounded result: repeatedly increase precision 3086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # until result is unambiguously roundable 3087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista places = p-self._log10_exp_bound()+2 3088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 3089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff = _dlog10(c, e, places) 3090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # assert len(str(abs(coeff)))-p >= 1 3091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if coeff % (5*10**(len(str(abs(coeff)))-p-1)): 3092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista break 3093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista places += 3 309472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places) 3095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context._shallow_copy() 3097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context._set_rounding(ROUND_HALF_EVEN) 3098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = ans._fix(context) 3099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context.rounding = rounding 3100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logb(self, context=None): 3103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ Returns the exponent of the magnitude of self's MSD. 3104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result is the integer which is the exponent of the magnitude 3106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista of the most significant digit of self (as though it were truncated 3107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista to a single digit while maintaining the value of that digit and 3108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista without limiting the resulting exponent). 3109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # logb(NaN) = NaN 3111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 3112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # logb(+/-Inf) = +Inf 3119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 3120b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _Infinity 3121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # logb(0) = -Inf, DivisionByZero 3123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 3124cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionByZero, 'logb(0)', 1) 3125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # otherwise, simply return the adjusted exponent of self, as a 3127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Decimal. Note that no attempt is made to fit the result 3128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # into the current context. 3129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Decimal(self.adjusted()) 3130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _islogical(self): 3132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Return True if self is a logical operand. 3133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3134c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling For being logical, it must be a finite number with a sign of 0, 3135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista an exponent of 0, and a coefficient whose digits must all be 3136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista either 0 or 1. 3137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign != 0 or self._exp != 0: 3139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return False 3140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista for dig in self._int: 314172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista if dig not in '01': 3142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return False 3143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return True 3144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _fill_logical(self, context, opa, opb): 3146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista dif = context.prec - len(opa) 3147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if dif > 0: 314872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista opa = '0'*dif + opa 3149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif dif < 0: 3150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista opa = opa[-context.prec:] 3151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista dif = context.prec - len(opb) 3152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if dif > 0: 315372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista opb = '0'*dif + opb 3154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif dif < 0: 3155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista opb = opb[-context.prec:] 3156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return opa, opb 3157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_and(self, other, context=None): 3159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies an 'and' operation between self and other's digits.""" 3160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self._islogical() or not other._islogical(): 3163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # fill to context.prec 3166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (opa, opb) = self._fill_logical(context, self._int, other._int) 3167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # make the operation, and clean starting zeroes 316972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)]) 317072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, result.lstrip('0') or '0', 0) 3171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_invert(self, context=None): 3173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Invert all its digits.""" 3174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 317672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0), 317772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista context) 3178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_or(self, other, context=None): 3180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies an 'or' operation between self and other's digits.""" 3181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self._islogical() or not other._islogical(): 3184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # fill to context.prec 3187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (opa, opb) = self._fill_logical(context, self._int, other._int) 3188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # make the operation, and clean starting zeroes 319065808ff0c08e60572cf81ebe5dc24794a706f390Mark Dickinson result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)]) 319172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, result.lstrip('0') or '0', 0) 3192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_xor(self, other, context=None): 3194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies an 'xor' operation between self and other's digits.""" 3195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self._islogical() or not other._islogical(): 3198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # fill to context.prec 3201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (opa, opb) = self._fill_logical(context, self._int, other._int) 3202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # make the operation, and clean starting zeroes 320465808ff0c08e60572cf81ebe5dc24794a706f390Mark Dickinson result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)]) 320572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, result.lstrip('0') or '0', 0) 3206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def max_mag(self, other, context=None): 3208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares the values numerically with their sign ignored.""" 3209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 3210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 32116c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista if context is None: 32126c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista context = getcontext() 32136c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista 3214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special or other._is_special: 3215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # If one operand is a quiet NaN and the other is number, then the 3216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # number is always returned 3217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sn = self._isnan() 3218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista on = other._isnan() 3219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sn or on: 3220e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista if on == 1 and sn == 0: 3221e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista return self._fix(context) 3222e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista if sn == 1 and on == 0: 3223e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista return other._fix(context) 3224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._check_nans(other, context) 3225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 32262fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson c = self.copy_abs()._cmp(other.copy_abs()) 3227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == 0: 3228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = self.compare_total(other) 3229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == -1: 3231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = other 3232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self 3234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3235e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 3236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def min_mag(self, other, context=None): 3238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares the values numerically with their sign ignored.""" 3239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 3240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 32416c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista if context is None: 32426c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista context = getcontext() 32436c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista 3244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special or other._is_special: 3245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # If one operand is a quiet NaN and the other is number, then the 3246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # number is always returned 3247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sn = self._isnan() 3248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista on = other._isnan() 3249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sn or on: 3250e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista if on == 1 and sn == 0: 3251e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista return self._fix(context) 3252e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista if sn == 1 and on == 0: 3253e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista return other._fix(context) 3254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._check_nans(other, context) 3255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 32562fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson c = self.copy_abs()._cmp(other.copy_abs()) 3257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == 0: 3258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = self.compare_total(other) 3259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == -1: 3261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self 3262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = other 3264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3265e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 3266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_minus(self, context=None): 3268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the largest representable number smaller than itself.""" 3269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 3273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == -1: 3277b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _NegativeInfinity 3278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == 1: 327972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, '9'*context.prec, context.Etop()) 3280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3281353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context.copy() 3282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._set_rounding(ROUND_FLOOR) 3283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._ignore_all_flags() 3284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista new_self = self._fix(context) 3285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if new_self != self: 3286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return new_self 328772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1), 328872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista context) 3289353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_plus(self, context=None): 3291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the smallest representable number larger than itself.""" 3292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 3296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == 1: 3300b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger return _Infinity 3301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == -1: 330272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(1, '9'*context.prec, context.Etop()) 3303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context.copy() 3305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._set_rounding(ROUND_CEILING) 3306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._ignore_all_flags() 3307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista new_self = self._fix(context) 3308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if new_self != self: 3309353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return new_self 331072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1), 331172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista context) 3312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_toward(self, other, context=None): 3314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the number closest to self, in the direction towards other. 3315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result is the closest representable number to self 3317353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (excluding self) that is in the direction towards other, 3318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista unless both have the same value. If the two operands are 3319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista numerically equal, then the result is a copy of self with the 3320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign set to be the same as the sign of other. 3321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 3323353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 3328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3329353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 33312fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson comparison = self._cmp(other) 3332353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if comparison == 0: 333372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self.copy_sign(other) 3334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3335353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if comparison == -1: 3336353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self.next_plus(context) 3337353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: # comparison == 1 3338353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self.next_minus(context) 3339353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3340353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # decide which flags to raise using value of ans 3341353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans._isinfinity(): 3342353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Overflow, 3343353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'Infinite result from next_toward', 3344353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans._sign) 3345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 3346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 3347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif ans.adjusted() < context.Emin: 3348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Underflow) 3349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Subnormal) 3350353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 3351353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 3352353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if precision == 1 then we don't raise Clamped for a 3353353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result 0E-Etiny. 3354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not ans: 3355353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Clamped) 3356353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3357353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3358353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3359353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def number_class(self, context=None): 3360353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns an indication of the class of self. 3361353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3362353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The class is one of the following strings: 33630f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista sNaN 33640f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista NaN 3365353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Infinity 3366353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Normal 3367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Subnormal 3368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Zero 3369353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Zero 3370353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Subnormal 3371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Normal 3372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Infinity 3373353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3374353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self.is_snan(): 3375353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "sNaN" 3376353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self.is_qnan(): 3377353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "NaN" 3378353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista inf = self._isinfinity() 3379353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if inf == 1: 3380353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "+Infinity" 3381353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if inf == -1: 3382353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "-Infinity" 3383353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self.is_zero(): 3384353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign: 3385353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "-Zero" 3386353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3387353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "+Zero" 3388353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3389353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3390353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self.is_subnormal(context=context): 3391353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign: 3392353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "-Subnormal" 3393353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3394353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "+Subnormal" 3395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # just a normal, regular, boring number, :) 3396353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign: 3397353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "-Normal" 3398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3399353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "+Normal" 3400353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def radix(self): 3402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Just returns 10, as this is Decimal, :)""" 3403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Decimal(10) 3404353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def rotate(self, other, context=None): 3406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a rotated copy of self, value-of-other times.""" 3407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3408353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3410353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 3411353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3412353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3414353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._exp != 0: 3415353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3416353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (-context.prec <= int(other) <= context.prec): 3417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3418353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 34206c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 3421353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3422353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # get values, pad if necessary 3423353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista torot = int(other) 3424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotdig = self._int 3425353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista topad = context.prec - len(rotdig) 3426353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if topad: 342772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista rotdig = '0'*topad + rotdig 3428353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3429353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # let's rotate! 3430353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotated = rotdig[torot:] + rotdig[:torot] 343172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, 343272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista rotated.lstrip('0') or '0', self._exp) 3433353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def scaleb (self, other, context=None): 3435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns self operand after adding the second value to its exp.""" 3436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 3440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3441353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3443353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._exp != 0: 3444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3445353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista liminf = -2 * (context.Emax + context.prec) 3446353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista limsup = 2 * (context.Emax + context.prec) 3447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (liminf <= int(other) <= limsup): 3448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 34516c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 3452353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 345372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista d = _dec_from_triple(self._sign, self._int, self._exp + int(other)) 3454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista d = d._fix(context) 3455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return d 3456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def shift(self, other, context=None): 3458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a shifted copy of self, value-of-other times.""" 3459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3460353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3462353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 3463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3466353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._exp != 0: 3467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3468353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (-context.prec <= int(other) <= context.prec): 3469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3470353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 34726c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 3473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # get values, pad if necessary 3475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista torot = int(other) 3476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not torot: 34776c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 3478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotdig = self._int 3479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista topad = context.prec - len(rotdig) 3480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if topad: 348172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista rotdig = '0'*topad + rotdig 3482353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # let's shift! 3484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if torot < 0: 3485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotated = rotdig[:torot] 3486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 348772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista rotated = rotdig + '0'*torot 3488353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotated = rotated[-context.prec:] 3489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 349072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, 349172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista rotated.lstrip('0') or '0', self._exp) 3492353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 349359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Support for pickling, copy, and deepcopy 34947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __reduce__(self): 34957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (self.__class__, (str(self),)) 34967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 34977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __copy__(self): 34987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if type(self) == Decimal: 3499cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis return self # I'm immutable; therefore I am my own clone 35007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__class__(str(self)) 35017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 35027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __deepcopy__(self, memo): 35037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if type(self) == Decimal: 3504cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis return self # My components are also immutable 35057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__class__(str(self)) 35067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3507277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # PEP 3101 support. the _localeconv keyword argument should be 3508277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # considered private: it's provided for ease of testing only. 3509277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson def __format__(self, specifier, context=None, _localeconv=None): 3510f4da77765f8581e31620e9f49c68028e57b0ae85Mark Dickinson """Format a Decimal instance according to the given specifier. 35111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 35121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson The specifier should be a standard format specifier, with the 35131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson form described in PEP 3101. Formatting types 'e', 'E', 'f', 3514277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 'F', 'g', 'G', 'n' and '%' are supported. If the formatting 3515277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson type is omitted it defaults to 'g' or 'G', depending on the 3516277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson value of context.capitals. 35171ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """ 35181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 35191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # Note: PEP 3101 says that if the type is not present then 35201ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # there should be at least one digit after the decimal point. 35211ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # We take the liberty of ignoring this requirement for 35221ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # Decimal---it's presumably there to make sure that 35231ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # format(float, '') behaves similarly to str(float). 35241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if context is None: 35251ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson context = getcontext() 35261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 3527277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson spec = _parse_format_specifier(specifier, _localeconv=_localeconv) 35281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 3529277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # special values don't care about the type or precision 35301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if self._is_special: 3531277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson sign = _format_sign(self._sign, spec) 3532277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson body = str(self.copy_abs()) 3533277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson return _format_align(sign, body, spec) 35341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 35351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # a type of None defaults to 'g' or 'G', depending on context 35361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if spec['type'] is None: 35371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson spec['type'] = ['g', 'G'][context.capitals] 3538277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 3539277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # if type is '%', adjust exponent of self accordingly 3540277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if spec['type'] == '%': 35411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson self = _dec_from_triple(self._sign, self._int, self._exp+2) 35421ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 35431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # round if necessary, taking rounding mode from the context 35441ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson rounding = context.rounding 35451ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson precision = spec['precision'] 35461ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if precision is not None: 35471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if spec['type'] in 'eE': 35481ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson self = self._round(precision+1, rounding) 35491ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif spec['type'] in 'fF%': 35501ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson self = self._rescale(-precision, rounding) 3551277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson elif spec['type'] in 'gG' and len(self._int) > precision: 3552277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson self = self._round(precision, rounding) 35531ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # special case: zeros with a positive exponent can't be 35541ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # represented in fixed point; rescale them to 0e0. 3555277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if not self and self._exp > 0 and spec['type'] in 'fF%': 35561ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson self = self._rescale(0, rounding) 35571ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 35581ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # figure out placement of the decimal point 35591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson leftdigits = self._exp + len(self._int) 3560277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if spec['type'] in 'eE': 35611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if not self and precision is not None: 35621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson dotplace = 1 - precision 35631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson else: 35641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson dotplace = 1 3565277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson elif spec['type'] in 'fF%': 3566277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson dotplace = leftdigits 35671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif spec['type'] in 'gG': 35681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if self._exp <= 0 and leftdigits > -6: 35691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson dotplace = leftdigits 35701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson else: 35711ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson dotplace = 1 35721ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 3573277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # find digits before and after decimal point, and get exponent 3574277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if dotplace < 0: 3575277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson intpart = '0' 3576277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson fracpart = '0'*(-dotplace) + self._int 3577277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson elif dotplace > len(self._int): 3578277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson intpart = self._int + '0'*(dotplace-len(self._int)) 3579277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson fracpart = '' 35801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson else: 3581277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson intpart = self._int[:dotplace] or '0' 3582277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson fracpart = self._int[dotplace:] 3583277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson exp = leftdigits-dotplace 35841ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 3585277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # done with the decimal-specific stuff; hand over the rest 3586277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # of the formatting to the _format_number function 3587277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson return _format_number(self._sign, intpart, fracpart, exp, spec) 35881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 358972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batistadef _dec_from_triple(sign, coefficient, exponent, special=False): 359072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista """Create a decimal instance directly, without any validation, 359172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista normalization (e.g. removal of leading zeros) or argument 359272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista conversion. 359372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista 359472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista This function is for *internal use only*. 359572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista """ 359672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista 359772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self = object.__new__(Decimal) 359872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._sign = sign 359972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._int = coefficient 360072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._exp = exponent 360172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._is_special = special 360272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista 360372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self 360472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista 36052c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger# Register Decimal as a kind of Number (an abstract base class). 36062c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger# However, do not register it as Real (because Decimals are not 36072c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger# interoperable with floats). 36082c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger_numbers.Number.register(Decimal) 36092c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger 36102c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger 361159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Context class ####################################################### 3612cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 36137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3614cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis# get rounding method function: 361559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batistarounding_functions = [name for name in Decimal.__dict__.keys() 361659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista if name.startswith('_round_')] 36177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerfor name in rounding_functions: 361859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value. 36197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger globalname = name[1:].upper() 36207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = globals()[globalname] 36217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal._pick_rounding_function[val] = name 36227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 36239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettingerdel name, val, globalname, rounding_functions 36247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3625ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlanclass _ContextManager(object): 36268b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan """Context manager class to support localcontext(). 36271a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum 3628ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan Sets a copy of the supplied context in __enter__() and restores 36298b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan the previous decimal context in __exit__() 36308b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan """ 36311a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum def __init__(self, new_context): 3632ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan self.new_context = new_context.copy() 36331a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum def __enter__(self): 36341a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum self.saved_context = getcontext() 36351a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum setcontext(self.new_context) 36361a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum return self.new_context 36371a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum def __exit__(self, t, v, tb): 36381a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum setcontext(self.saved_context) 36391a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum 36407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Context(object): 36417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Contains the context for a Decimal instance. 36427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 36437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Contains: 36447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec - precision (for use in rounding, division, square roots..) 364559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista rounding - rounding type (how you round) 3646bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps - If traps[exception] = 1, then the exception is 36477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raised when it is caused. Otherwise, a value is 36487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger substituted in. 36491840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson flags - When an exception is caused, flags[exception] is set. 36507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (Whether or not the trap_enabler is set) 36517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Should be reset by user of Decimal instance. 36520ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emin - Minimum exponent 36530ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emax - Maximum exponent 36547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger capitals - If 1, 1*10^1 is printed as 1E+1. 36557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If 0, printed as 1e1 3656e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger _clamp - If 1, change exponents if too high (Default 0) 36577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 36589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger 36597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __init__(self, prec=None, rounding=None, 3660abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger traps=None, flags=None, 36610ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emin=None, Emax=None, 3662e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger capitals=None, _clamp=0, 3663abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger _ignored_flags=None): 3664abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger if flags is None: 3665abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger flags = [] 3666abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger if _ignored_flags is None: 3667abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger _ignored_flags = [] 3668bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if not isinstance(flags, dict): 366971f3b85497f25bad3b00555173c51378f64edbb5Mark Dickinson flags = dict([(s, int(s in flags)) for s in _signals]) 3670b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger del s 3671bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if traps is not None and not isinstance(traps, dict): 367271f3b85497f25bad3b00555173c51378f64edbb5Mark Dickinson traps = dict([(s, int(s in traps)) for s in _signals]) 3673b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger del s 36747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for name, val in locals().items(): 36757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if val is None: 3676eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettinger setattr(self, name, _copy.copy(getattr(DefaultContext, name))) 36777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 36787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger setattr(self, name, val) 36797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger del self.self 36807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3681b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger def __repr__(self): 3682bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger """Show the current context.""" 3683b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger s = [] 368459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista s.append('Context(prec=%(prec)d, rounding=%(rounding)s, ' 368559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' 368659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista % vars(self)) 368759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista names = [f.__name__ for f, v in self.flags.items() if v] 368859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista s.append('flags=[' + ', '.join(names) + ']') 368959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista names = [t.__name__ for t, v in self.traps.items() if v] 369059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista s.append('traps=[' + ', '.join(names) + ']') 3691b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger return ', '.join(s) + ')' 3692b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger 3693d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger def clear_flags(self): 3694d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger """Reset all flags to zero""" 3695d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger for flag in self.flags: 3696b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger self.flags[flag] = 0 3697d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger 36989fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger def _shallow_copy(self): 36999fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger """Returns a shallow copy from self.""" 3700e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista nc = Context(self.prec, self.rounding, self.traps, 3701e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista self.flags, self.Emin, self.Emax, 3702e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista self.capitals, self._clamp, self._ignored_flags) 37037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return nc 37049fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger 37059fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger def copy(self): 37069fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger """Returns a deep copy from self.""" 370759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista nc = Context(self.prec, self.rounding, self.traps.copy(), 3708e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista self.flags.copy(), self.Emin, self.Emax, 3709e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista self.capitals, self._clamp, self._ignored_flags) 37109fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger return nc 37119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger __copy__ = copy 37127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37135aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger def _raise_error(self, condition, explanation = None, *args): 37147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Handles an error 37157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the flag is in _ignored_flags, returns the default response. 37171840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson Otherwise, it sets the flag, then, if the corresponding 37187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger trap_enabler is set, it reaises the exception. Otherwise, it returns 37191840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson the default value after setting the flag. 37207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 37215aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger error = _condition_map.get(condition, condition) 37227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if error in self._ignored_flags: 372359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Don't touch the flag 37247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return error().handle(self, *args) 37257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37261840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson self.flags[error] = 1 3727bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if not self.traps[error]: 372859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # The errors define how to handle themselves. 37295aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger return condition().handle(self, *args) 37307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Errors should only be risked on copies of the context 373259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # self._ignored_flags = [] 37338aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson raise error(explanation) 37347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _ignore_all_flags(self): 37367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Ignore all flags, if they are raised""" 3737fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger return self._ignore_flags(*_signals) 37387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _ignore_flags(self, *flags): 37407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Ignore the flags, if they are raised""" 37417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Do not mutate-- This way, copies of a context leave the original 37427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # alone. 37437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._ignored_flags = (self._ignored_flags + list(flags)) 37447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return list(flags) 37457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _regard_flags(self, *flags): 37477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Stop ignoring the flags, if they are raised""" 37487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if flags and isinstance(flags[0], (tuple,list)): 37497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = flags[0] 37507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for flag in flags: 37517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._ignored_flags.remove(flag) 37527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 375353663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan # We inherit object.__hash__, so we must deny this explicitly 375453663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan __hash__ = None 37555aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger 37567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def Etiny(self): 37577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns Etiny (= Emin - prec + 1)""" 37587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(self.Emin - self.prec + 1) 37597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def Etop(self): 3761e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger """Returns maximum exponent (= Emax - prec + 1)""" 37627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(self.Emax - self.prec + 1) 37637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _set_rounding(self, type): 37657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Sets the rounding type. 37667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Sets the rounding type, and returns the current (previous) 37687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding type. Often used like: 37697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 37717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # so you don't change the calling context 37727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # if an error occurs in the middle. 37737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding(ROUND_UP) 37747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = self.__sub__(other, context=context) 37757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding(rounding) 37767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This will make it round up for that operation. 37787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 37797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = self.rounding 37807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.rounding= type 37817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return rounding 37827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3783fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger def create_decimal(self, num='0'): 378459bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson """Creates a new Decimal instance but using self as context. 378559bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson 378659bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson This method implements the to-number operation of the 378759bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson IBM Decimal specification.""" 378859bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson 378959bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson if isinstance(num, basestring) and num != num.strip(): 379059bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson return self._raise_error(ConversionSyntax, 379159bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson "no trailing or leading whitespace is " 379259bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson "permitted.") 379359bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson 37947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger d = Decimal(num, context=self) 3795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if d._isnan() and len(d._int) > self.prec - self._clamp: 3796353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._raise_error(ConversionSyntax, 3797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista "diagnostic info too long in NaN") 3798dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return d._fix(self) 37997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3800f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger def create_decimal_from_float(self, f): 3801f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger """Creates a new Decimal instance from a float but rounding using self 3802f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger as the context. 3803f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger 3804f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger >>> context = Context(prec=5, rounding=ROUND_DOWN) 3805f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger >>> context.create_decimal_from_float(3.1415926535897932) 3806f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger Decimal('3.1415') 3807f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger >>> context = Context(prec=5, traps=[Inexact]) 3808f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger >>> context.create_decimal_from_float(3.1415926535897932) 3809f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger Traceback (most recent call last): 3810f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger ... 3811f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger Inexact: None 3812f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger 3813f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger """ 3814f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger d = Decimal.from_float(f) # An exact conversion 3815f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger return d._fix(self) # Apply the context rounding 3816f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger 381759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Methods 38187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def abs(self, a): 38197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the absolute value of the operand. 38207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the operand is negative, the result is the same as using the minus 382259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista operation on the operand. Otherwise, the result is the same as using 38237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the plus operation on the operand. 38247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('2.1')) 3826abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.1') 38279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('-100')) 3828abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 38299ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('101.5')) 3830abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('101.5') 38319ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('-101.5')) 3832abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('101.5') 38337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 38347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__abs__(context=self) 38357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def add(self, a, b): 38377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the sum of the two operands. 38387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38399ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.add(Decimal('12'), Decimal('7.00')) 3840abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('19.00') 38419ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4')) 3842abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.02E+4') 38437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 38447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__add__(b, context=self) 38457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _apply(self, a): 3847dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return str(a._fix(self)) 38487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def canonical(self, a): 3850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the same Decimal object. 3851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista As we do not have different encodings for the same number, the 3853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista received object already is in its canonical form. 3854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.canonical(Decimal('2.50')) 3856abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.50') 3857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3858353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.canonical(context=self) 3859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 38607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def compare(self, a, b): 38617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Compares values numerically. 38627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the signs of the operands differ, a value representing each operand 38647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ('-1' if the operand is less than zero, '0' if the operand is zero or 38657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negative zero, or '1' if the operand is greater than zero) is used in 38667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger place of that operand for the comparison instead of the actual 38677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operand. 38687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The comparison is then effected by subtracting the second operand from 38707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the first and then returning a value according to the result of the 38717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger subtraction: '-1' if the result is less than zero, '0' if the result is 38727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger zero or negative zero, or '1' if the result is greater than zero. 38737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3')) 3875abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 38769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1')) 3877abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 38789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10')) 3879abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 38809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1')) 3881abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 38829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3')) 3883abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 38849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1')) 3885abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 38867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 38877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.compare(b, context=self) 38887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_signal(self, a, b): 3890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares the values of the two operands numerically. 3891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista It's pretty much like compare(), but all NaNs signal, with signaling 3893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista NaNs taking precedence over quiet NaNs. 3894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext 3896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.compare_signal(Decimal('2.1'), Decimal('3')) 3897abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 3898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.compare_signal(Decimal('2.1'), Decimal('2.1')) 3899abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 3900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.flags[InvalidOperation] = 0 3901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> print c.flags[InvalidOperation] 3902353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 0 3903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.compare_signal(Decimal('NaN'), Decimal('2.1')) 3904abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 3905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> print c.flags[InvalidOperation] 3906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1 3907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.flags[InvalidOperation] = 0 3908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> print c.flags[InvalidOperation] 3909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 0 3910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1')) 3911abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 3912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> print c.flags[InvalidOperation] 3913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1 3914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.compare_signal(b, context=self) 3916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_total(self, a, b): 3918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares two operands using their abstract representation. 3919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista This is not like the standard compare, which use their numerical 3921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista value. Note that a total ordering is defined for all possible abstract 3922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista representations. 3923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9')) 3925abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 3926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('-127'), Decimal('12')) 3927abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 3928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3')) 3929abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 3930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30')) 3931abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 3932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('12.300')) 3933abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 3934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN')) 3935abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 3936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.compare_total(b) 3938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_total_mag(self, a, b): 3940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares two operands using their abstract representation ignoring sign. 3941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Like compare_total, but with operand's sign ignored and assumed to be 0. 3943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.compare_total_mag(b) 3945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_abs(self, a): 3947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a copy of the operand with the sign set to 0. 3948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_abs(Decimal('2.1')) 3950abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.1') 3951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_abs(Decimal('-100')) 3952abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 3953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.copy_abs() 3955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_decimal(self, a): 3957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a copy of the decimal objet. 3958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_decimal(Decimal('2.1')) 3960abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.1') 3961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_decimal(Decimal('-1.00')) 3962abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.00') 3963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 39646c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(a) 3965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_negate(self, a): 3967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a copy of the operand with the sign inverted. 3968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_negate(Decimal('101.5')) 3970abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-101.5') 3971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_negate(Decimal('-101.5')) 3972abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('101.5') 3973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.copy_negate() 3975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_sign(self, a, b): 3977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Copies the second operand's sign to the first one. 3978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista In detail, it returns a copy of the first operand with the sign 3980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista equal to the sign of the second operand. 3981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33')) 3983abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.50') 3984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33')) 3985abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.50') 3986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33')) 3987abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.50') 3988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33')) 3989abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.50') 3990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.copy_sign(b) 3992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 39937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divide(self, a, b): 39947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Decimal division in a specified context. 39957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 39969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1'), Decimal('3')) 3997abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.333333333') 39989ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2'), Decimal('3')) 3999abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.666666667') 40009ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('5'), Decimal('2')) 4001abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.5') 40029ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1'), Decimal('10')) 4003abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.1') 40049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('12'), Decimal('12')) 4005abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 40069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2')) 4007abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('4.00') 40089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0')) 4009abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.20') 40109ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1000'), Decimal('100')) 4011abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('10') 40129ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1000'), Decimal('1')) 4013abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1000') 40149ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2')) 4015abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.20E+6') 40167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 40177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__div__(b, context=self) 40187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 40197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divide_int(self, a, b): 40207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Divides two numbers and returns the integer part of the result. 40217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 40229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3')) 4023abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 40249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3')) 4025abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3') 40269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3')) 4027abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3') 40287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 40297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__floordiv__(b, context=self) 40307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 40317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divmod(self, a, b): 40327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__divmod__(b, context=self) 40337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def exp(self, a): 4035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns e ** a. 4036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('-Infinity')) 4041abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('-1')) 4043abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.367879441') 4044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('0')) 4045abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('1')) 4047abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.71828183') 4048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('0.693147181')) 4049abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.00000000') 4050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('+Infinity')) 4051abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('Infinity') 4052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.exp(context=self) 4054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def fma(self, a, b, c): 4056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a multiplied by b, plus c. 4057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The first two operands are multiplied together, using multiply, 4059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista the third operand is then added to the result of that 4060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista multiplication, using add, all with only one final rounding. 4061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7')) 4063abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('22') 4064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7')) 4065abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-8') 4066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578')) 4067abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.38435736E+12') 4068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.fma(b, c, context=self) 4070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_canonical(self, a): 40721a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is canonical; otherwise return False. 40731a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista 40741a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista Currently, the encoding of a Decimal instance is always 40751a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista canonical, so this method returns True for any Decimal. 4076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_canonical(Decimal('2.50')) 40781a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 40801a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return a.is_canonical() 4081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_finite(self, a): 40831a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is finite; otherwise return False. 4084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 40851a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista A Decimal instance is considered finite if it is neither 40861a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista infinite nor a NaN. 4087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_finite(Decimal('2.50')) 40891a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_finite(Decimal('-0.3')) 40911a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_finite(Decimal('0')) 40931a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_finite(Decimal('Inf')) 40951a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_finite(Decimal('NaN')) 40971a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_finite() 4100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_infinite(self, a): 41021a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is infinite; otherwise return False. 4103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_infinite(Decimal('2.50')) 41051a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_infinite(Decimal('-Inf')) 41071a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_infinite(Decimal('NaN')) 41091a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_infinite() 4112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_nan(self, a): 41141a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is a qNaN or sNaN; 41151a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista otherwise return False. 4116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_nan(Decimal('2.50')) 41181a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_nan(Decimal('NaN')) 41201a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_nan(Decimal('-sNaN')) 41221a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_nan() 4125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_normal(self, a): 41271a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is a normal number; 41281a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista otherwise return False. 4129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_normal(Decimal('2.50')) 41341a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_normal(Decimal('0.1E-999')) 41361a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_normal(Decimal('0.00')) 41381a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_normal(Decimal('-Inf')) 41401a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_normal(Decimal('NaN')) 41421a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_normal(context=self) 4145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_qnan(self, a): 41471a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is a quiet NaN; otherwise return False. 4148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_qnan(Decimal('2.50')) 41501a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_qnan(Decimal('NaN')) 41521a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_qnan(Decimal('sNaN')) 41541a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_qnan() 4157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_signed(self, a): 41591a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is negative; otherwise return False. 4160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_signed(Decimal('2.50')) 41621a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_signed(Decimal('-12')) 41641a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_signed(Decimal('-0')) 41661a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_signed() 4169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4170353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_snan(self, a): 41711a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is a signaling NaN; 41721a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista otherwise return False. 4173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_snan(Decimal('2.50')) 41751a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_snan(Decimal('NaN')) 41771a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_snan(Decimal('sNaN')) 41791a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_snan() 4182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_subnormal(self, a): 41841a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is subnormal; otherwise return False. 4185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_subnormal(Decimal('2.50')) 41901a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_subnormal(Decimal('0.1E-999')) 41921a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_subnormal(Decimal('0.00')) 41941a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_subnormal(Decimal('-Inf')) 41961a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_subnormal(Decimal('NaN')) 41981a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_subnormal(context=self) 4201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_zero(self, a): 42031a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is a zero; otherwise return False. 4204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_zero(Decimal('0')) 42061a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_zero(Decimal('2.50')) 42081a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_zero(Decimal('-0E+2')) 42101a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_zero() 4213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def ln(self, a): 4215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the natural (base e) logarithm of the operand. 4216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.ln(Decimal('0')) 4221abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 4222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.ln(Decimal('1.000')) 4223abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.ln(Decimal('2.71828183')) 4225abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.00000000') 4226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.ln(Decimal('10')) 4227abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.30258509') 4228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.ln(Decimal('+Infinity')) 4229abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('Infinity') 4230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.ln(context=self) 4232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def log10(self, a): 4234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the base 10 logarithm of the operand. 4235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('0')) 4240abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 4241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('0.001')) 4242abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-3') 4243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('1.000')) 4244abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('2')) 4246abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.301029996') 4247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('10')) 4248abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('70')) 4250abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.84509804') 4251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('+Infinity')) 4252abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('Infinity') 4253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.log10(context=self) 4255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logb(self, a): 4257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ Returns the exponent of the magnitude of the operand's MSD. 4258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result is the integer which is the exponent of the magnitude 4260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista of the most significant digit of the operand (as though the 4261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista operand were truncated to a single digit while maintaining the 4262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista value of that digit and without limiting the resulting exponent). 4263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logb(Decimal('250')) 4265abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2') 4266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logb(Decimal('2.50')) 4267abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logb(Decimal('0.03')) 4269abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-2') 4270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logb(Decimal('0')) 4271abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 4272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.logb(context=self) 4274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_and(self, a, b): 4276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies the logical operation 'and' between each operand's digits. 4277353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The operands must be both logical numbers. 4279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0')) 4281abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1')) 4283abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0')) 4285abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1')) 4287abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010')) 4289abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1000') 4290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10')) 4291abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('10') 4292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.logical_and(b, context=self) 4294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_invert(self, a): 4296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Invert all the digits in the operand. 4297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The operand must be a logical number. 4299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_invert(Decimal('0')) 4301abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('111111111') 4302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_invert(Decimal('1')) 4303abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('111111110') 4304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_invert(Decimal('111111111')) 4305abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_invert(Decimal('101010101')) 4307abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('10101010') 4308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4309353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.logical_invert(context=self) 4310353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_or(self, a, b): 4312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies the logical operation 'or' between each operand's digits. 4313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The operands must be both logical numbers. 4315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0')) 4317abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1')) 4319abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0')) 4321abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1')) 4323abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010')) 4325abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1110') 4326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10')) 4327abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1110') 4328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4329353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.logical_or(b, context=self) 4330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4331353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_xor(self, a, b): 4332353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies the logical operation 'xor' between each operand's digits. 4333353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The operands must be both logical numbers. 4335353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4336353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0')) 4337abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4338353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1')) 4339abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4340353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0')) 4341abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4342353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1')) 4343abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4344353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010')) 4345abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('110') 4346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10')) 4347abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1101') 4348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.logical_xor(b, context=self) 4350353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 43517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def max(self, a,b): 43527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """max compares two values numerically and returns the maximum. 43537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 43547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If either operand is a NaN then the general rules apply. 4355c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling Otherwise, the operands are compared as though by the compare 435659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista operation. If they are numerically equal then the left-hand operand 435759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista is chosen as the result. Otherwise the maximum (closer to positive 43587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger infinity) of the two operands is chosen as the result. 43597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 43609ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('3'), Decimal('2')) 4361abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3') 43629ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('-10'), Decimal('3')) 4363abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3') 43649ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('1.0'), Decimal('1')) 4365abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4366d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger >>> ExtendedContext.max(Decimal('7'), Decimal('NaN')) 4367abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7') 43687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 43697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.max(b, context=self) 43707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def max_mag(self, a, b): 4372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares the values numerically with their sign ignored.""" 4373353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.max_mag(b, context=self) 4374353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 43757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def min(self, a,b): 43767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """min compares two values numerically and returns the minimum. 43777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 43787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If either operand is a NaN then the general rules apply. 4379c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling Otherwise, the operands are compared as though by the compare 438059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista operation. If they are numerically equal then the left-hand operand 438159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista is chosen as the result. Otherwise the minimum (closer to negative 43827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger infinity) of the two operands is chosen as the result. 43837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 43849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('3'), Decimal('2')) 4385abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2') 43869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('-10'), Decimal('3')) 4387abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-10') 43889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('1.0'), Decimal('1')) 4389abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0') 4390d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger >>> ExtendedContext.min(Decimal('7'), Decimal('NaN')) 4391abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7') 43927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 43937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.min(b, context=self) 43947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def min_mag(self, a, b): 4396353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares the values numerically with their sign ignored.""" 4397353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.min_mag(b, context=self) 4398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 43997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def minus(self, a): 44007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Minus corresponds to unary prefix minus in Python. 44017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 44027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is evaluated using the same rules as subtract; the 44037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation minus(a) is calculated as subtract('0', a) where the '0' 44047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger has the same exponent as the operand. 44057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 44069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.minus(Decimal('1.3')) 4407abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.3') 44089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.minus(Decimal('-1.3')) 4409abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.3') 44107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 44117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__neg__(context=self) 44127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 44137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def multiply(self, a, b): 44147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """multiply multiplies two operands. 44157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4416cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis If either operand is a special value then the general rules apply. 4417cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis Otherwise, the operands are multiplied together ('long multiplication'), 4418cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis resulting in a number which may be as long as the sum of the lengths 4419cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis of the two operands. 44207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 44219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3')) 4422abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3.60') 44239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('7'), Decimal('3')) 4424abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('21') 44259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8')) 4426abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.72') 44279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0')) 4428abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0.0') 44299ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321')) 4430abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('4.28135971E+11') 44317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 44327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__mul__(b, context=self) 44337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_minus(self, a): 4435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the largest representable number smaller than a. 4436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.next_minus(Decimal('1')) 4441abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.999999999') 4442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_minus(Decimal('1E-1007')) 4443abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0E-1007') 4444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.next_minus(Decimal('-1.00000003')) 4445abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.00000004') 4446353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_minus(Decimal('Infinity')) 4447abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('9.99999999E+999') 4448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.next_minus(context=self) 4450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_plus(self, a): 4452353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the smallest representable number larger than a. 4453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.next_plus(Decimal('1')) 4458abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.00000001') 4459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_plus(Decimal('-1E-1007')) 4460abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0E-1007') 4461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.next_plus(Decimal('-1.00000003')) 4462abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.00000002') 4463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_plus(Decimal('-Infinity')) 4464abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-9.99999999E+999') 4465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4466353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.next_plus(context=self) 4467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4468353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_toward(self, a, b): 4469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the number closest to a, in direction towards b. 4470353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result is the closest representable number from the first 4472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista operand (but not the first operand) that is in the direction 4473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista towards the second operand, unless the operands have the same 4474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista value. 4475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('1'), Decimal('2')) 4480abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.00000001') 4481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('-1E-1007'), Decimal('1')) 4482abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0E-1007') 4483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('-1.00000003'), Decimal('0')) 4484abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.00000002') 4485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('1'), Decimal('0')) 4486abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.999999999') 4487353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('1E-1007'), Decimal('-100')) 4488abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0E-1007') 4489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10')) 4490abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.00000004') 4491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000')) 4492abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0.00') 4493353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4494353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.next_toward(b, context=self) 4495353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 44967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def normalize(self, a): 4497e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger """normalize reduces an operand to its simplest form. 44987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 44997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Essentially a plus operation with all trailing zeros removed from the 45007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result. 45017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45029ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('2.1')) 4503abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.1') 45049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('-2.0')) 4505abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-2') 45069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('1.200')) 4507abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.2') 45089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('-120')) 4509abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.2E+2') 45109ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('120.00')) 4511abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.2E+2') 45129ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('0.00')) 4513abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 45147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 45157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.normalize(context=self) 45167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4517353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def number_class(self, a): 4518353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns an indication of the class of the operand. 4519353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4520353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The class is one of the following strings: 4521353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -sNaN 4522353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -NaN 4523353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Infinity 4524353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Normal 4525353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Subnormal 4526353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Zero 4527353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Zero 4528353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Subnormal 4529353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Normal 4530353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Infinity 4531353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4532353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = Context(ExtendedContext) 4533353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4534353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4535353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('Infinity')) 4536353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '+Infinity' 4537353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('1E-10')) 4538353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '+Normal' 4539353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('2.50')) 4540353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '+Normal' 4541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('0.1E-999')) 4542353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '+Subnormal' 4543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('0')) 4544353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '+Zero' 4545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-0')) 4546353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '-Zero' 4547353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-0.1E-999')) 4548353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '-Subnormal' 4549353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-1E-10')) 4550353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '-Normal' 4551353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-2.50')) 4552353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '-Normal' 4553353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-Infinity')) 4554353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '-Infinity' 4555353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('NaN')) 4556353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'NaN' 4557353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-NaN')) 4558353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'NaN' 4559353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('sNaN')) 4560353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'sNaN' 4561353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4562353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.number_class(context=self) 4563353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 45647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def plus(self, a): 45657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Plus corresponds to unary prefix plus in Python. 45667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is evaluated using the same rules as add; the 45687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation plus(a) is calculated as add('0', a) where the '0' 45697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger has the same exponent as the operand. 45707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45719ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.plus(Decimal('1.3')) 4572abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.3') 45739ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.plus(Decimal('-1.3')) 4574abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.3') 45757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 45767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__pos__(context=self) 45777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def power(self, a, b, modulo=None): 45797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Raises a to the power of b, to modulo if given. 45807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4581353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista With two arguments, compute a**b. If a is negative then b 4582353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista must be integral. The result will be inexact unless b is 4583353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista integral and the result is finite and can be expressed exactly 4584353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista in 'precision' digits. 4585353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4586353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista With three arguments, compute (a**b) % modulo. For the 4587353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista three argument form, the following restrictions on the 4588353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista arguments hold: 4589353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4590353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - all three arguments must be integral 4591353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - b must be nonnegative 4592353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - at least one of a or b must be nonzero 4593353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - modulo must be nonzero and have at most 'precision' digits 4594353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4595353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result of pow(a, b, modulo) is identical to the result 4596353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista that would be obtained by computing (a**b) % modulo with 4597353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista unbounded precision, but is computed more efficiently. It is 4598353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista always exact. 4599353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4600353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4601353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4602353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4603353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('2'), Decimal('3')) 4604abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('8') 4605353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-2'), Decimal('3')) 4606abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-8') 4607353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('2'), Decimal('-3')) 4608abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.125') 4609353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('1.7'), Decimal('8')) 4610abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('69.7575744') 4611353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('10'), Decimal('0.301029996')) 4612abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.00000000') 4613353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('Infinity'), Decimal('-1')) 4614abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4615353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('Infinity'), Decimal('0')) 4616abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4617353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('Infinity'), Decimal('1')) 4618abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('Infinity') 4619353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-Infinity'), Decimal('-1')) 4620abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0') 4621353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-Infinity'), Decimal('0')) 4622abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4623353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-Infinity'), Decimal('1')) 4624abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 4625353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-Infinity'), Decimal('2')) 4626abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('Infinity') 4627353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('0'), Decimal('0')) 4628abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 4629353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4630353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('3'), Decimal('7'), Decimal('16')) 4631abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('11') 4632353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16')) 4633abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-11') 4634353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16')) 4635abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4636353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16')) 4637abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('11') 4638353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789')) 4639abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('11729830') 4640353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729')) 4641abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0') 4642353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537')) 4643abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 46447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 46457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__pow__(b, modulo, context=self) 46467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def quantize(self, a, b): 464859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista """Returns a value equal to 'a' (rounded), having the exponent of 'b'. 46497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The coefficient of the result is derived from that of the left-hand 465159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista operand. It may be rounded using the current rounding setting (if the 46527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exponent is being increased), multiplied by a positive power of ten (if 46537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the exponent is being decreased), or is unchanged (if the exponent is 46547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger already equal to that of the right-hand operand). 46557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Unlike other operations, if the length of the coefficient after the 46577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger quantize operation would be greater than precision then an Invalid 465859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista operation condition is raised. This guarantees that, unless there is 465959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista an error condition, the exponent of the result of a quantize is always 46607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger equal to that of the right-hand operand. 46617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Also unlike other operations, quantize will never raise Underflow, even 46637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if the result is subnormal and inexact. 46647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001')) 4666abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.170') 46679ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01')) 4668abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.17') 46699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1')) 4670abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.2') 46719ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0')) 4672abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2') 46739ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1')) 4674abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0E+1') 46759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity')) 4676abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 46779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity')) 4678abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 46799ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1')) 4680abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0') 46819ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5')) 4682abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0E+5') 46839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2')) 4684abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 46859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2')) 4686abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 46879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1')) 4688abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('217.0') 46899ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0')) 4690abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('217') 46919ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1')) 4692abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.2E+2') 46939ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2')) 4694abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2E+2') 46957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 46967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.quantize(b, context=self) 46977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4698353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def radix(self): 4699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Just returns 10, as this is Decimal, :) 4700353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.radix() 4702abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('10') 4703353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4704353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Decimal(10) 4705353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 47067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder(self, a, b): 47077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the remainder from integer division. 47087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result is the residue of the dividend after the operation of 471059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista calculating integer division as described for divide-integer, rounded 47110d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz to precision digits if necessary. The sign of the result, if 471259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista non-zero, is the same as that of the original dividend. 47137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This operation will fail under the same conditions as integer division 47157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (that is, if integer division on the same two operands would fail, the 47167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger remainder cannot be calculated). 47177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3')) 4719abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.1') 47209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10'), Decimal('3')) 4721abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 47229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3')) 4723abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 47249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1')) 4725abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.2') 47269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3')) 4727abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.1') 47289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3')) 4729abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0') 47307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 47317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__mod__(b, context=self) 47327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder_near(self, a, b): 47347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns to be "a - b * n", where n is the integer nearest the exact 47357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger value of "x / b" (if two integers are equally near then the even one 473659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista is chosen). If the result is equal to 0 then its sign will be the 47377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign of a. 47387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This operation will fail under the same conditions as integer division 47407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (that is, if integer division on the same two operands would fail, the 47417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger remainder cannot be calculated). 47427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47439ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3')) 4744abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0.9') 47459ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6')) 4746abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-2') 47479ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3')) 4748abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 47499ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3')) 4750abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 47519ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1')) 4752abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.2') 47539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3')) 4754abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.1') 47559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3')) 4756abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0.3') 47577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 47587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.remainder_near(b, context=self) 47597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4760353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def rotate(self, a, b): 4761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a rotated copy of a, b times. 4762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The coefficient of the result is a rotated copy of the digits in 4764353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista the coefficient of the first operand. The number of places of 4765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotation is taken from the absolute value of the second operand, 4766353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista with the rotation being to the left if the second operand is 4767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista positive or to the right otherwise. 4768353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4769353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.rotate(Decimal('34'), Decimal('8')) 4770abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('400000003') 4771353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.rotate(Decimal('12'), Decimal('9')) 4772abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('12') 4773353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2')) 4774abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('891234567') 4775353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0')) 4776abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('123456789') 4777353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2')) 4778abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('345678912') 4779353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4780353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.rotate(b, context=self) 4781353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 47827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def same_quantum(self, a, b): 47837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns True if the two operands have the same exponent. 47847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result is never affected by either the sign or the coefficient of 47867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger either operand. 47877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001')) 47897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger False 47909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01')) 47917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger True 47929ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1')) 47937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger False 47949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf')) 47957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger True 47967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 47977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.same_quantum(b) 47987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def scaleb (self, a, b): 4800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the first operand after adding the second value its exp. 4801353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2')) 4803abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.0750') 4804353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0')) 4805abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7.50') 4806353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3')) 4807abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7.50E+3') 4808353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.scaleb (b, context=self) 4810353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4811353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def shift(self, a, b): 4812353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a shifted copy of a, b times. 4813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The coefficient of the result is a shifted copy of the digits 4815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista in the coefficient of the first operand. The number of places 4816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista to shift is taken from the absolute value of the second operand, 4817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista with the shift being to the left if the second operand is 4818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista positive or to the right otherwise. Digits shifted into the 4819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coefficient are zeros. 4820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.shift(Decimal('34'), Decimal('8')) 4822abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('400000000') 4823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.shift(Decimal('12'), Decimal('9')) 4824abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2')) 4826abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1234567') 4827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0')) 4828abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('123456789') 4829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2')) 4830abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('345678900') 4831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.shift(b, context=self) 4833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 48347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def sqrt(self, a): 483559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista """Square root of a non-negative number to context precision. 48367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the result must be inexact, it is rounded using the round-half-even 48387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger algorithm. 48397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('0')) 4841abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 48429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('-0')) 4843abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0') 48449ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('0.39')) 4845abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.624499800') 48469ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('100')) 4847abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('10') 48489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1')) 4849abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 48509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1.0')) 4851abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0') 48529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1.00')) 4853abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0') 48549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('7')) 4855abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.64575131') 48569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('10')) 4857abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3.16227766') 48589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.prec 48596ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger 9 48607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 48617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.sqrt(context=self) 48627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def subtract(self, a, b): 4864f33d01d304c349a7f555779c7c99930f1203adb7Georg Brandl """Return the difference between the two operands. 48657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48669ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07')) 4867abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.23') 48689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30')) 4869abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.00') 48709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07')) 4871abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0.77') 48727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 48737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__sub__(b, context=self) 48747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_eng_string(self, a): 48767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts a number to a string, using scientific notation. 48777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is not affected by the context. 48797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 48807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.to_eng_string(context=self) 48817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_sci_string(self, a): 48837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts a number to a string, using scientific notation. 48847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is not affected by the context. 48867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 48877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__str__(context=self) 48887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def to_integral_exact(self, a): 4890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rounds to an integer. 4891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista When the operand has a negative exponent, the result is the same 4893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista as using the quantize() operation using the given operand as the 4894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista left-hand-operand, 1E+0 as the right-hand-operand, and the precision 4895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista of the operand as the precision setting; Inexact and Rounded flags 4896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista are allowed in this operation. The rounding mode is taken from the 4897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context. 4898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('2.1')) 4900abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2') 4901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('100')) 4902abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 4903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('100.0')) 4904abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 4905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('101.5')) 4906abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('102') 4907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('-101.5')) 4908abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-102') 4909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('10E+5')) 4910abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0E+6') 4911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77')) 4912abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7.89E+77') 4913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('-Inf')) 4914abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 4915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.to_integral_exact(context=self) 4917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def to_integral_value(self, a): 49197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds to an integer. 49207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger When the operand has a negative exponent, the result is the same 49227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger as using the quantize() operation using the given operand as the 49237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger left-hand-operand, 1E+0 as the right-hand-operand, and the precision 49247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger of the operand as the precision setting, except that no flags will 492559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista be set. The rounding mode is taken from the context. 49267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('2.1')) 4928abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2') 4929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('100')) 4930abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 4931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('100.0')) 4932abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 4933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('101.5')) 4934abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('102') 4935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('-101.5')) 4936abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-102') 4937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('10E+5')) 4938abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0E+6') 4939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('7.89E+77')) 4940abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7.89E+77') 4941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('-Inf')) 4942abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 49437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 4944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.to_integral_value(context=self) 4945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the method name changed, but we provide also the old one, for compatibility 4947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista to_integral = to_integral_value 49487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass _WorkRep(object): 49507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __slots__ = ('sign','int','exp') 495117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger # sign: 0 or 1 4952636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # int: int or long 49537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # exp: None, int, or string 49547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __init__(self, value=None): 49567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if value is None: 49577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.sign = None 4958636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self.int = 0 49597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = None 496017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger elif isinstance(value, Decimal): 496117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger self.sign = value._sign 496272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self.int = int(value._int) 49637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = value._exp 496417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger else: 496517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger # assert isinstance(value, tuple) 49667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.sign = value[0] 49677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.int = value[1] 49687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = value[2] 49697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __repr__(self): 49717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return "(%r, %r, %r)" % (self.sign, self.int, self.exp) 49727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __str__ = __repr__ 49747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4977e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batistadef _normalize(op1, op2, prec = 0): 49787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Normalizes op1, op2 to have the same exp and length of coefficient. 49797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Done during addition. 49817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 4982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if op1.exp < op2.exp: 49837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = op2 49847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = op1 49857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 49867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = op1 49877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = op2 49887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1). 4990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Then adding 10**exp to tmp has the same effect (after rounding) 4991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # as adding any positive quantity smaller than 10**exp; similarly 4992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # for subtraction. So if other is smaller than 10**exp we replace 4993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # it with 10**exp. This avoids tmp.exp - other.exp getting too large. 4994e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista tmp_len = len(str(tmp.int)) 4995e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista other_len = len(str(other.int)) 4996e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista exp = tmp.exp + min(-1, tmp_len - prec - 2) 4997e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista if other_len + other.exp - 1 < exp: 4998e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista other.int = 1 4999e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista other.exp = exp 5000636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 5001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista tmp.int *= 10 ** (tmp.exp - other.exp) 5002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista tmp.exp = other.exp 50037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return op1, op2 50047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista##### Integer arithmetic functions used by ln, log10, exp and __pow__ ##### 5006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# This function from Tim Peters was taken from here: 5008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# http://mail.python.org/pipermail/python-list/1999-July/007758.html 5009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# The correction being in the function definition is for speed, and 5010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# the whole function is not resolved with math.log because of avoiding 5011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# the use of floats. 5012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _nbits(n, correction = { 5013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '0': 4, '1': 3, '2': 2, '3': 2, 5014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '4': 1, '5': 1, '6': 1, '7': 1, 5015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '8': 0, '9': 0, 'a': 0, 'b': 0, 5016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'c': 0, 'd': 0, 'e': 0, 'f': 0}): 5017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Number of bits in binary representation of the positive integer n, 5018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista or 0 if n == 0. 5019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 5020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if n < 0: 5021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista raise ValueError("The argument to _nbits should be nonnegative.") 5022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista hex_n = "%x" % n 5023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return 4*len(hex_n) - correction[hex_n[0]] 5024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _sqrt_nearest(n, a): 5026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Closest integer to the square root of the positive integer n. a is 5027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista an initial approximation to the square root. Any positive integer 5028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista will do for a, but the closer a is to the square root of n the 5029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista faster convergence will be. 5030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 5032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if n <= 0 or a <= 0: 5033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista raise ValueError("Both arguments to _sqrt_nearest should be positive.") 5034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista b=0 5036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while a != b: 5037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista b, a = a, a--n//a>>1 5038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a 5039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _rshift_nearest(x, shift): 5041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Given an integer x and a nonnegative integer shift, return closest 5042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista integer to x / 2**shift; use round-to-even in case of a tie. 5043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 5045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista b, q = 1L << shift, x >> shift 5046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return q + (2*(x & (b-1)) + (q&1) > b) 5047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _div_nearest(a, b): 5049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Closest integer to a/b, a and b positive integers; rounds to even 5050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista in the case of a tie. 5051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 5053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q, r = divmod(a, b) 5054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return q + (2*r + (q&1) > b) 5055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _ilog(x, M, L = 8): 5057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Integer approximation to M*log(x/M), with absolute error boundable 5058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista in terms only of x/M. 5059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Given positive integers x and M, return an integer approximation to 5061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference 5062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista between the approximation and the exact result is at most 22. For 5063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In 5064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista both cases these are upper bounds on the error; it will usually be 5065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista much smaller.""" 5066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # The basic algorithm is the following: let log1p be the function 5068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use 5069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the reduction 5070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log1p(y) = 2*log1p(y/(1+sqrt(1+y))) 5072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # repeatedly until the argument to log1p is small (< 2**-L in 5074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # absolute value). For small y we can use the Taylor series 5075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expansion 5076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T 5078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # truncating at T such that y**T is small enough. The whole 5080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # computation is carried out in a form of fixed-point arithmetic, 5081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # with a real number z being represented by an integer 5082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # approximation to z*M. To avoid loss of precision, the y below 5083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # is actually an integer approximation to 2**R*y*M, where R is the 5084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # number of reductions performed so far. 5085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = x-M 5087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # argument reduction; R = number of reductions performed 5088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista R = 0 5089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while (R <= L and long(abs(y)) << L-R >= M or 5090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista R > L and abs(y) >> R-L >= M): 5091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _div_nearest(long(M*y) << 1, 5092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M)) 5093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista R += 1 5094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Taylor series with T terms 5096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista T = -int(-10*len(str(M))//(3*L)) 5097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista yshift = _rshift_nearest(y, R) 5098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista w = _div_nearest(M, T) 5099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista for k in xrange(T-1, 0, -1): 5100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista w = _div_nearest(M, k) - _div_nearest(yshift*w, M) 5101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return _div_nearest(w*y, M) 5103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dlog10(c, e, p): 5105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Given integers c, e and p with c > 0, p >= 0, compute an integer 5106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista approximation to 10**p * log10(c*10**e), with an absolute error of 5107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista at most 1. Assumes that c*10**e is not exactly 1.""" 5108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # increase precision by 2; compensate for this by dividing 5110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # final result by 100 5111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p += 2 5112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # write c*10**e as d*10**f with either: 5114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # f >= 0 and 1 <= d <= 10, or 5115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # f <= 0 and 0.1 <= d <= 1. 5116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Thus for c*10**e close to 1, f = 0 5117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista l = len(str(c)) 5118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista f = e+l - (e+l >= 1) 5119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if p > 0: 5121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista M = 10**p 5122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista k = e+p-f 5123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if k >= 0: 5124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c *= 10**k 5125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = _div_nearest(c, 10**-k) 5127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_d = _ilog(c, M) # error < 5 + 22 = 27 5129be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista log_10 = _log10_digits(p) # error < 1 5130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_d = _div_nearest(log_d*M, log_10) 5131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_tenpower = f*M # exact 5132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_d = 0 # error < 2.31 513418aa388ca084e1d40aa48c8c8f1b4f730c6fe059Neal Norwitz log_tenpower = _div_nearest(f, 10**-p) # error < 0.5 5135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return _div_nearest(log_tenpower+log_d, 100) 5137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dlog(c, e, p): 5139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Given integers c, e and p with c > 0, compute an integer 5140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista approximation to 10**p * log(c*10**e), with an absolute error of 5141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista at most 1. Assumes that c*10**e is not exactly 1.""" 5142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Increase precision by 2. The precision increase is compensated 5144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # for at the end with a division by 100. 5145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p += 2 5146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10, 5148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e) 5149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # as 10**p * log(d) + 10**p*f * log(10). 5150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista l = len(str(c)) 5151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista f = e+l - (e+l >= 1) 5152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute approximation to 10**p*log(d), with error < 27 5154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if p > 0: 5155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista k = e+p-f 5156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if k >= 0: 5157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c *= 10**k 5158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = _div_nearest(c, 10**-k) # error of <= 0.5 in c 5160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # _ilog magnifies existing error in c by a factor of at most 10 5162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_d = _ilog(c, 10**p) # error < 5 + 22 = 27 5163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # p <= 0: just approximate the whole thing by 0; error < 2.31 5165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_d = 0 5166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5167be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # compute approximation to f*10**p*log(10), with error < 11. 5168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if f: 5169be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista extra = len(str(abs(f)))-1 5170be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista if p + extra >= 0: 5171be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # error in f * _log10_digits(p+extra) < |f| * 1 = |f| 5172be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11 5173be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra) 5174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista f_log_ten = 0 5176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista f_log_ten = 0 5178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5179be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1 5180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return _div_nearest(f_log_ten + log_d, 100) 5181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5182be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batistaclass _Log10Memoize(object): 5183be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista """Class to compute, store, and allow retrieval of, digits of the 5184be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista constant log(10) = 2.302585.... This constant is needed by 5185be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__.""" 5186be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista def __init__(self): 5187be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista self.digits = "23025850929940456840179914546843642076011014886" 5188be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista 5189be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista def getdigits(self, p): 5190be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista """Given an integer p >= 0, return floor(10**p)*log(10). 5191be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista 5192be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista For example, self.getdigits(3) returns 2302. 5193be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista """ 5194be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # digits are stored as a string, for quick conversion to 5195be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # integer in the case that we've already computed enough 5196be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # digits; the stored digits should always be correct 5197be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # (truncated, not rounded to nearest). 5198be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista if p < 0: 5199be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista raise ValueError("p should be nonnegative") 5200be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista 5201be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista if p >= len(self.digits): 5202be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # compute p+3, p+6, p+9, ... digits; continue until at 5203be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # least one of the extra digits is nonzero 5204be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista extra = 3 5205be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista while True: 5206be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # compute p+extra digits, correct to within 1ulp 5207be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista M = 10**(p+extra+2) 5208be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista digits = str(_div_nearest(_ilog(10*M, M), 100)) 5209be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista if digits[-extra:] != '0'*extra: 5210be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista break 5211be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista extra += 3 5212be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # keep all reliable digits so far; remove trailing zeros 5213be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # and next nonzero digit 5214be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista self.digits = digits.rstrip('0')[:-1] 5215be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista return int(self.digits[:p+1]) 5216be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista 5217be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista_log10_digits = _Log10Memoize().getdigits 5218be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista 5219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _iexp(x, M, L=8): 5220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Given integers x and M, M > 0, such that x/M is small in absolute 5221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista value, compute an integer approximation to M*exp(x/M). For 0 <= 5222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista x/M <= 2.4, the absolute error in the result is bounded by 60 (and 5223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista is usually much smaller).""" 5224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Algorithm: to compute exp(z) for a real number z, first divide z 5226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then 5227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor 5228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # series 5229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expm1(x) = x + x**2/2! + x**3/3! + ... 5231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Now use the identity 5233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expm1(2x) = expm1(x)*(expm1(x)+2) 5235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # R times to compute the sequence expm1(z/2**R), 5237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expm1(z/2**(R-1)), ... , exp(z/2), exp(z). 5238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Find R such that x/2**R/M <= 2**-L 5240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista R = _nbits((long(x)<<L)//M) 5241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Taylor series. (2**L)**T > M 5243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista T = -int(-10*len(str(M))//(3*L)) 5244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _div_nearest(x, T) 5245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Mshift = long(M)<<R 5246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista for i in xrange(T-1, 0, -1): 5247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _div_nearest(x*(Mshift + y), Mshift * i) 5248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Expansion 5250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista for k in xrange(R-1, -1, -1): 5251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Mshift = long(M)<<(k+2) 5252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _div_nearest(y*(y+Mshift), Mshift) 5253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return M+y 5255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dexp(c, e, p): 5257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compute an approximation to exp(c*10**e), with p decimal places of 5258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista precision. 5259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5260be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista Returns integers d, f such that: 5261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 10**(p-1) <= d <= 10**p, and 5263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (d-1)*10**f < exp(c*10**e) < (d+1)*10**f 5264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista In other words, d*10**f is an approximation to exp(c*10**e) with p 5266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista digits of precision, and with an error in d of at most 1. This is 5267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista almost, but not quite, the same as the error being < 1ulp: when d 5268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista = 10**(p-1) the error could be up to 10 ulp.""" 5269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision 5271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p += 2 5272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5273be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # compute log(10) with extra precision = adjusted exponent of c*10**e 5274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista extra = max(0, e + len(str(c)) - 1) 5275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q = p + extra 5276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5277be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q), 5278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # rounding down 5279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista shift = e+q 5280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if shift >= 0: 5281353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista cshift = c*10**shift 5282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista cshift = c//10**-shift 5284be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista quot, rem = divmod(cshift, _log10_digits(q)) 5285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # reduce remainder back to original precision 5287353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rem = _div_nearest(rem, 10**extra) 5288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5289353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # error in result of _iexp < 120; error after division < 0.62 5290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3 5291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dpower(xc, xe, yc, ye, p): 5293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and 5294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that: 5295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 10**(p-1) <= c <= 10**p, and 5297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (c-1)*10**e < x**y < (c+1)*10**e 5298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista in other words, c*10**e is an approximation to x**y with p digits 5300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista of precision, and with an error in c of at most 1. (This is 5301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista almost, but not quite, the same as the error being < 1ulp: when c 5302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista == 10**(p-1) we can only guarantee error < 10ulp.) 5303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista We assume that: x is positive and not equal to 1, and y is nonzero. 5305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 5306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Find b such that 10**(b-1) <= |y| <= 10**b 5308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista b = len(str(abs(yc))) + ye 5309353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5310353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point 5311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista lxc = _dlog(xc, xe, p+b+1) 5312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1) 5314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista shift = ye-b 5315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if shift >= 0: 5316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista pc = lxc*yc*10**shift 5317353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista pc = _div_nearest(lxc*yc, 10**-shift) 5319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if pc == 0: 5321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # we prefer a result that isn't exactly 1; this makes it 5322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # easier to compute a correctly rounded result in __pow__ 5323353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1: 5324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff, exp = 10**(p-1)+1, 1-p 5325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff, exp = 10**p-1, -p 5327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff, exp = _dexp(pc, -(p+1), p+1) 5329353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff = _div_nearest(coeff, 10) 5330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp += 1 5331353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5332353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return coeff, exp 5333353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _log10_lb(c, correction = { 5335353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '1': 100, '2': 70, '3': 53, '4': 40, '5': 31, 5336353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '6': 23, '7': 16, '8': 10, '9': 5}): 5337353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compute a lower bound for 100*log10(c) for a positive integer c.""" 5338353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c <= 0: 5339353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista raise ValueError("The argument to _log10_lb should be nonnegative.") 5340353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista str_c = str(c) 5341353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return 100*len(str_c) - correction[str_c[0]] 5342353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 534359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Helper Functions #################################################### 53447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _convert_other(other, raiseit=False): 5346636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger """Convert other to Decimal. 5347636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 5348636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger Verifies that it's ok to use in an implicit construction. 5349636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger """ 5350636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(other, Decimal): 5351636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return other 5352636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(other, (int, long)): 5353636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(other) 5354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if raiseit: 5355353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista raise TypeError("Unable to convert %s to Decimal" % other) 5356267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return NotImplemented 5357636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 535859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Setup Specific Contexts ############################################ 53597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# The default context prototype used by Context() 5361fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger# Is mutable, so that new contexts can have different default values 53627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDefaultContext = Context( 53646ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger prec=28, rounding=ROUND_HALF_EVEN, 5365bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[DivisionByZero, Overflow, InvalidOperation], 5366bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 536799148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger Emax=999999999, 536899148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger Emin=-999999999, 5369e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger capitals=1 53707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 53717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Pre-made alternate contexts offered by the specification 53737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Don't change these; the user should be able to select these 53747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# contexts and be able to reproduce results from other implementations 53757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# of the spec. 53767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerBasicContext = Context( 53787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec=9, rounding=ROUND_HALF_UP, 5379bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow], 5380bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 53817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 53827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerExtendedContext = Context( 53846ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger prec=9, rounding=ROUND_HALF_EVEN, 5385bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[], 5386bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 53877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 53887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 539059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### crud for parsing strings ############################################# 53916a123cb7827859748a0096570dfbb5ceba0e59dcMark Dickinson# 539272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Regular expression used for parsing numeric strings. Additional 539372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# comments: 539472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 539572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 1. Uncomment the two '\s*' lines to allow leading and/or trailing 539672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# whitespace. But note that the specification disallows whitespace in 539772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# a numeric string. 539872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 539972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 2. For finite numbers (not infinities and NaNs) the body of the 540072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# number between the optional sign and the optional exponent must have 540172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# at least one decimal digit, possibly after the decimal point. The 540272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# lookahead expression '(?=\d|\.\d)' checks this. 54037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 540472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batistaimport re 540570c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson_parser = re.compile(r""" # A numeric string consists of: 54067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# \s* 540770c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson (?P<sign>[-+])? # an optional sign, followed by either... 54087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ( 54094326ad8f72053140aa658a0392a509c9da382670Mark Dickinson (?=\d|\.\d) # ...a number (with at least one digit) 54104326ad8f72053140aa658a0392a509c9da382670Mark Dickinson (?P<int>\d*) # having a (possibly empty) integer part 54114326ad8f72053140aa658a0392a509c9da382670Mark Dickinson (\.(?P<frac>\d*))? # followed by an optional fractional part 54124326ad8f72053140aa658a0392a509c9da382670Mark Dickinson (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or... 54137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger | 541470c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson Inf(inity)? # ...an infinity, or... 541572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista | 541670c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson (?P<signal>s)? # ...an (optionally signaling) 541770c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson NaN # NaN 54184326ad8f72053140aa658a0392a509c9da382670Mark Dickinson (?P<diag>\d*) # with (possibly empty) diagnostic info. 54197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ) 54207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# \s* 542159bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson \Z 54224326ad8f72053140aa658a0392a509c9da382670Mark Dickinson""", re.VERBOSE | re.IGNORECASE | re.UNICODE).match 54237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 54242ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista_all_zeros = re.compile('0*$').match 54252ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista_exact_half = re.compile('50*$').match 54261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54271ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson##### PEP3101 support functions ############################################## 5428277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# The functions in this section have little to do with the Decimal 5429277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# class, and could potentially be reused or adapted for other pure 54301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# Python numeric classes that want to implement __format__ 54311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# 54321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# A format specifier for Decimal looks like: 54331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# 5434277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# [[fill]align][sign][0][minimumwidth][,][.precision][type] 54351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson_parse_format_specifier_regex = re.compile(r"""\A 54371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?: 54381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson (?P<fill>.)? 54391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson (?P<align>[<>=^]) 54401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson)? 54411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<sign>[-+ ])? 54421ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<zeropad>0)? 54431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<minimumwidth>(?!0)\d+)? 5444277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson(?P<thousands_sep>,)? 54451ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?:\.(?P<precision>0|(?!0)\d+))? 5446277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson(?P<type>[eEfFgGn%])? 54471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson\Z 54481ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson""", re.VERBOSE) 54491ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdel re 54517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5452277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# The locale module is only needed for the 'n' format specifier. The 5453277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# rest of the PEP 3101 code functions quite happily without it, so we 5454277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# don't care too much if locale isn't present. 5455277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsontry: 5456277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson import locale as _locale 5457277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsonexcept ImportError: 5458277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson pass 5459277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5460277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _parse_format_specifier(format_spec, _localeconv=None): 54611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """Parse and validate a format specifier. 54621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson Turns a standard numeric format specifier into a dict, with the 54641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson following entries: 54651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson fill: fill character to pad field to minimum width 54671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson align: alignment type, either '<', '>', '=' or '^' 54681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson sign: either '+', '-' or ' ' 54691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson minimumwidth: nonnegative integer giving minimum width 5470277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson zeropad: boolean, indicating whether to pad with zeros 5471277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson thousands_sep: string to use as thousands separator, or '' 5472277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson grouping: grouping for thousands separators, in format 5473277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson used by localeconv 5474277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson decimal_point: string to use for decimal point 54751ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson precision: nonnegative integer giving precision, or None 54761ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson type: one of the characters 'eEfFgG%', or None 5477277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson unicode: boolean (always True for Python 3.x) 54781ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """ 54801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson m = _parse_format_specifier_regex.match(format_spec) 54811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if m is None: 54821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson raise ValueError("Invalid format specifier: " + format_spec) 54831ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54841ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # get the dictionary 54851ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict = m.groupdict() 54861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 5487277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # zeropad; defaults for fill and alignment. If zero padding 5488277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # is requested, the fill and align fields should be absent. 54891ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson fill = format_dict['fill'] 54901ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson align = format_dict['align'] 5491277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format_dict['zeropad'] = (format_dict['zeropad'] is not None) 5492277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if format_dict['zeropad']: 5493277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if fill is not None: 54941ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson raise ValueError("Fill character conflicts with '0'" 54951ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson " in format specifier: " + format_spec) 5496277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if align is not None: 54971ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson raise ValueError("Alignment conflicts with '0' in " 54981ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson "format specifier: " + format_spec) 54991ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['fill'] = fill or ' ' 55005cfa8044ff9fd26dc4915fc2ce5b2d005eea3261Mark Dickinson # PEP 3101 originally specified that the default alignment should 55015cfa8044ff9fd26dc4915fc2ce5b2d005eea3261Mark Dickinson # be left; it was later agreed that right-aligned makes more sense 55025cfa8044ff9fd26dc4915fc2ce5b2d005eea3261Mark Dickinson # for numeric types. See http://bugs.python.org/issue6857. 55035cfa8044ff9fd26dc4915fc2ce5b2d005eea3261Mark Dickinson format_dict['align'] = align or '>' 55041ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 5505277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # default sign handling: '-' for negative, '' for positive 55061ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if format_dict['sign'] is None: 55071ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['sign'] = '-' 55081ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 55091ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # minimumwidth defaults to 0; precision remains None if not given 55101ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0') 55111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if format_dict['precision'] is not None: 55121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['precision'] = int(format_dict['precision']) 55131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 55141ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # if format type is 'g' or 'G' then a precision of 0 makes little 55151ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # sense; convert it to 1. Same if format type is unspecified. 55161ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if format_dict['precision'] == 0: 5517491ea55f2866cc0b4fee036069fc07748920b0cfMark Dickinson if format_dict['type'] is None or format_dict['type'] in 'gG': 55181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['precision'] = 1 55191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 5520277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # determine thousands separator, grouping, and decimal separator, and 5521277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # add appropriate entries to format_dict 5522277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if format_dict['type'] == 'n': 5523277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # apart from separators, 'n' behaves just like 'g' 5524277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format_dict['type'] = 'g' 5525277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if _localeconv is None: 5526277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson _localeconv = _locale.localeconv() 5527277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if format_dict['thousands_sep'] is not None: 5528277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson raise ValueError("Explicit thousands separator conflicts with " 5529277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson "'n' type in format specifier: " + format_spec) 5530277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format_dict['thousands_sep'] = _localeconv['thousands_sep'] 5531277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format_dict['grouping'] = _localeconv['grouping'] 5532277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format_dict['decimal_point'] = _localeconv['decimal_point'] 5533277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson else: 5534277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if format_dict['thousands_sep'] is None: 5535277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format_dict['thousands_sep'] = '' 5536277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format_dict['grouping'] = [3, 0] 5537277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format_dict['decimal_point'] = '.' 5538277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 55391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # record whether return type should be str or unicode 55401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['unicode'] = isinstance(format_spec, unicode) 55411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 55421ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson return format_dict 55431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 5544277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _format_align(sign, body, spec): 5545277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson """Given an unpadded, non-aligned numeric string 'body' and sign 5546277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson string 'sign', add padding and aligment conforming to the given 5547277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format specifier dictionary 'spec' (as produced by 5548277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson parse_format_specifier). 55491ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 5550277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson Also converts result to unicode if necessary. 55511ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 55521ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """ 55531ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # how much extra space do we have to play with? 5554277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson minimumwidth = spec['minimumwidth'] 5555277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson fill = spec['fill'] 5556277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson padding = fill*(minimumwidth - len(sign) - len(body)) 55571ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 5558277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson align = spec['align'] 55591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if align == '<': 55601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson result = sign + body + padding 5561b065e52bc284c2c28a967c4e82aa7ece6d09c562Mark Dickinson elif align == '>': 5562b065e52bc284c2c28a967c4e82aa7ece6d09c562Mark Dickinson result = padding + sign + body 55631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif align == '=': 55641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson result = sign + padding + body 5565277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson elif align == '^': 55661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson half = len(padding)//2 55671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson result = padding[:half] + sign + body + padding[half:] 5568277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson else: 5569277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson raise ValueError('Unrecognised alignment field') 55701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 55711ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # make sure that result is unicode if necessary 5572277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if spec['unicode']: 55731ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson result = unicode(result) 55741ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 55751ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson return result 55760d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz 5577277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _group_lengths(grouping): 5578277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson """Convert a localeconv-style grouping into a (possibly infinite) 5579277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson iterable of integers representing group lengths. 5580277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5581277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson """ 5582277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # The result from localeconv()['grouping'], and the input to this 5583277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # function, should be a list of integers in one of the 5584277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # following three forms: 5585277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # 5586277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # (1) an empty list, or 5587277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # (2) nonempty list of positive integers + [0] 5588277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # (3) list of positive integers + [locale.CHAR_MAX], or 5589277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5590277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson from itertools import chain, repeat 5591277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if not grouping: 5592277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson return [] 5593277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson elif grouping[-1] == 0 and len(grouping) >= 2: 5594277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson return chain(grouping[:-1], repeat(grouping[-2])) 5595277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson elif grouping[-1] == _locale.CHAR_MAX: 5596277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson return grouping[:-1] 5597277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson else: 5598277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson raise ValueError('unrecognised format for grouping') 5599277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5600277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _insert_thousands_sep(digits, spec, min_width=1): 5601277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson """Insert thousands separators into a digit string. 5602277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5603277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson spec is a dictionary whose keys should include 'thousands_sep' and 5604277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 'grouping'; typically it's the result of parsing the format 5605277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson specifier using _parse_format_specifier. 5606277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5607277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson The min_width keyword argument gives the minimum length of the 5608277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson result, which will be padded on the left with zeros if necessary. 5609277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5610277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson If necessary, the zero padding adds an extra '0' on the left to 5611277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson avoid a leading thousands separator. For example, inserting 5612277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson commas every three digits in '123456', with min_width=8, gives 5613277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson '0,123,456', even though that has length 9. 5614277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5615277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson """ 5616277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5617277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson sep = spec['thousands_sep'] 5618277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson grouping = spec['grouping'] 5619277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5620277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson groups = [] 5621277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson for l in _group_lengths(grouping): 5622277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if l <= 0: 5623277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson raise ValueError("group length should be positive") 5624277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson # max(..., 1) forces at least 1 digit to the left of a separator 5625277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson l = min(max(len(digits), min_width, 1), l) 5626277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson groups.append('0'*(l - len(digits)) + digits[-l:]) 5627277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson digits = digits[:-l] 5628277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson min_width -= l 5629277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if not digits and min_width <= 0: 5630277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson break 5631b14514a153857141631d602cadf094bc932f12eeMark Dickinson min_width -= len(sep) 5632277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson else: 5633277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson l = max(len(digits), min_width, 1) 5634277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson groups.append('0'*(l - len(digits)) + digits[-l:]) 5635277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson return sep.join(reversed(groups)) 5636277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5637277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _format_sign(is_negative, spec): 5638277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson """Determine sign character.""" 5639277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5640277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if is_negative: 5641277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson return '-' 5642277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson elif spec['sign'] in ' +': 5643277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson return spec['sign'] 5644277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson else: 5645277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson return '' 5646277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5647277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _format_number(is_negative, intpart, fracpart, exp, spec): 5648277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson """Format a number, given the following data: 5649277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5650277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson is_negative: true if the number is negative, else false 5651277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson intpart: string of digits that must appear before the decimal point 5652277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson fracpart: string of digits that must come after the point 5653277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson exp: exponent, as an integer 5654277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson spec: dictionary resulting from parsing the format specifier 5655277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5656277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson This function uses the information in spec to: 5657277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson insert separators (decimal separator and thousands separators) 5658277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format the sign 5659277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson format the exponent 5660277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson add trailing '%' for the '%' type 5661277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson zero-pad if necessary 5662277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson fill and align if necessary 5663277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson """ 5664277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5665277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson sign = _format_sign(is_negative, spec) 5666277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5667277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if fracpart: 5668277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson fracpart = spec['decimal_point'] + fracpart 5669277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5670277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if exp != 0 or spec['type'] in 'eE': 5671277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']] 5672277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson fracpart += "{0}{1:+}".format(echar, exp) 5673277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if spec['type'] == '%': 5674277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson fracpart += '%' 5675277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5676277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson if spec['zeropad']: 5677277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson min_width = spec['minimumwidth'] - len(fracpart) - len(sign) 5678277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson else: 5679277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson min_width = 0 5680277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson intpart = _insert_thousands_sep(intpart, spec, min_width) 5681277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5682277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson return _format_align(sign, intpart+fracpart, spec) 5683277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 5684277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson 568572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista##### Useful Constants (internal use only) ################################ 56867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 568772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Reusable defaults 5688b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_Infinity = Decimal('Inf') 5689b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_NegativeInfinity = Decimal('-Inf') 5690c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson_NaN = Decimal('NaN') 5691b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_Zero = Decimal(0) 5692b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_One = Decimal(1) 5693b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_NegativeOne = Decimal(-1) 5694c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson 5695b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger# _SignedInfinity[sign] is infinity w/ that sign 5696b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_SignedInfinity = (_Infinity, _NegativeInfinity) 56977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 56987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 56997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 57007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerif __name__ == '__main__': 57017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger import doctest, sys 57027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger doctest.testmod(sys.modules[__name__]) 5703