decimal.py revision 53663a695ef2bb96ac0252cd4cc4aa40d4f953be
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 137eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettingerimport copy as _copy 1387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 139097a1903035f9ee2efb1953306123f183124125dRaymond Hettingertry: 140097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger from collections import namedtuple as _namedtuple 141097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent') 142097a1903035f9ee2efb1953306123f183124125dRaymond Hettingerexcept ImportError: 143097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger DecimalTuple = lambda *args: args 144097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger 14559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista# Rounding 1460ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_DOWN = 'ROUND_DOWN' 1470ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_UP = 'ROUND_HALF_UP' 1480ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_EVEN = 'ROUND_HALF_EVEN' 1490ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_CEILING = 'ROUND_CEILING' 1500ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_FLOOR = 'ROUND_FLOOR' 1510ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_UP = 'ROUND_UP' 1520ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_DOWN = 'ROUND_HALF_DOWN' 153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo BatistaROUND_05UP = 'ROUND_05UP' 1547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista# Errors 1567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DecimalException(ArithmeticError): 1585aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger """Base exception class. 1597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Used exceptions derive from this. 1617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If an exception derives from another exception besides this (such as 1627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Underflow (Inexact, Rounded, Subnormal) that indicates that it is only 1637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger called if the others are present. This isn't actually used for 1647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger anything, though. 1657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 166cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis handle -- Called when context._raise_error is called and the 167cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis trap_enabler is set. First argument is self, second is the 168cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis context. More arguments can be given, those being after 169cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis the explanation in _raise_error (For example, 170cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis context._raise_error(NewError, '(-x)!', self._sign) would 171cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis call NewError().handle(context, self._sign).) 172cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 1737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger To define a new exception, it should be sufficient to have it derive 1747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger from DecimalException. 1757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 1777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger pass 1787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Clamped(DecimalException): 1817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Exponent of a 0 changed to fit bounds. 1827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals clamped if the exponent of a result has been 1847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger altered in order to fit the constraints of a specific concrete 18559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista representation. This may occur when the exponent of a zero result would 18659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista be outside the bounds of a representation, or when a large normal 18759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista number would have an encoded exponent that cannot be represented. In 1887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger this latter case, the exponent is reduced to fit and the corresponding 1897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger number of zero digits are appended to the coefficient ("fold-down"). 1907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidOperation(DecimalException): 1937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """An invalid operation was performed. 1947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Various bad things cause this: 1967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Something creates a signaling NaN 1987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -INF + INF 19959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista 0 * (+-)INF 20059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista (+-)INF / (+-)INF 2017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x % 0 2027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (+-)INF % x 2037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x._rescale( non-integer ) 2047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sqrt(-x) , x > 0 2057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 ** 0 2067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x ** (non-integer) 2077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger x ** (+-)INF 2087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger An operand is invalid 209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result of the operation after these is a quiet positive NaN, 211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista except when the cause is a signaling NaN, in which case the result is 212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista also a quiet NaN, but with the original sign, and an optional 213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista diagnostic information. 2147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if args: 2170f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True) 2180f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista return ans._fix_nan(context) 2197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return NaN 2207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass ConversionSyntax(InvalidOperation): 2227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Trying to convert badly formed string. 2237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if an string is being 2257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger converted to a number and it does not conform to the numeric string 22659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista syntax. The result is [0,qNaN]. 2277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 228cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis def handle(self, context, *args): 229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return NaN 2307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionByZero(DecimalException, ZeroDivisionError): 2327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Division by 0. 2337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals division-by-zero if division of a finite number 2357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger by zero was attempted (during a divide-integer or divide operation, or a 2367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger power operation with negative right-hand operand), and the dividend was 2377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger not zero. 2387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result of the operation is [sign,inf], where sign is the exclusive 2407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger or of the signs of the operands for divide, or is 1 for an odd power of 2417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -0, for power. 2427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 243cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 244cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista def handle(self, context, sign, *args): 2457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 2467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionImpossible(InvalidOperation): 2487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Cannot perform the division adequately. 2497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if the integer result of a 2517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger divide-integer or remainder operation had too many digits (would be 25259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista longer than precision). The result is [0,qNaN]. 2537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 254cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 2557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 256cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return NaN 2577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionUndefined(InvalidOperation, ZeroDivisionError): 2597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Undefined result of division. 2607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if division by zero was 2627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger attempted (during a divide-integer, divide, or remainder operation), and 26359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista the dividend is also zero. The result is [0,qNaN]. 2647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 265cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 266cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista def handle(self, context, *args): 2677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return NaN 2687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Inexact(DecimalException): 2707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Had to round, losing information. 2717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals inexact whenever the result of an operation is 2737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger not exact (that is, it needed to be rounded and any discarded digits 27459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista were non-zero), or if an overflow or underflow condition occurs. The 2757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result in all cases is unchanged. 2767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The inexact signal may be tested (or trapped) to determine if a given 2787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation (or sequence of operations) was inexact. 2797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidContext(InvalidOperation): 2827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Invalid context. Unknown rounding, for example. 2837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals invalid-operation if an invalid context was 28559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista detected during an operation. This can occur if contexts are not checked 2867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger on creation and either the precision exceeds the capability of the 2877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger underlying concrete representation or an unknown or unsupported rounding 28859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista was specified. These aspects of the context need only be checked when 28959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista the values are required to be used. The result is [0,qNaN]. 2907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 291cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 2927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, *args): 2937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return NaN 2947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Rounded(DecimalException): 2967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Number got rounded (not necessarily changed during rounding). 2977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals rounded whenever the result of an operation is 2997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounded (that is, some zero or non-zero digits were discarded from the 30059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista coefficient), or if an overflow or underflow condition occurs. The 3017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result in all cases is unchanged. 3027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The rounded signal may be tested (or trapped) to determine if a given 3047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation (or sequence of operations) caused a loss of precision. 3057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Subnormal(DecimalException): 3087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Exponent < Emin before rounding. 3097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals subnormal whenever the result of a conversion or 3117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation is subnormal (that is, its adjusted exponent is less than 31259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista Emin, before any rounding). The result in all cases is unchanged. 3137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The subnormal signal may be tested (or trapped) to determine if a given 3157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger or operation (or sequence of operations) yielded a subnormal result. 3167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Overflow(Inexact, Rounded): 3197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Numerical overflow. 3207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals overflow if the adjusted exponent of a result 3227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (from a conversion or from an operation that is not an attempt to divide 3237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger by zero), after rounding, would be greater than the largest value that 3247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger can be handled by the implementation (the value Emax). 3257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result depends on the rounding mode: 3277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger For round-half-up and round-half-even (and for round-half-down and 3297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger round-up, if implemented), the result of the operation is [sign,inf], 33059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista where sign is the sign of the intermediate result. For round-down, the 3317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result is the largest finite number that can be represented in the 33259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista current precision, with the sign of the intermediate result. For 3337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger round-ceiling, the result is the same as for round-down if the sign of 33459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista the intermediate result is 1, or is [0,inf] otherwise. For round-floor, 3357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the result is the same as for round-down if the sign of the intermediate 33659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded 3377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger will also be raised. 3380f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista """ 339cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 3407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def handle(self, context, sign, *args): 3417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN, 342353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ROUND_HALF_DOWN, ROUND_UP): 3437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 3447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sign == 0: 3457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_CEILING: 3467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 34772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(sign, '9'*context.prec, 34872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista context.Emax-context.prec+1) 3497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if sign == 1: 3507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_FLOOR: 3517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return Infsign[sign] 35272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(sign, '9'*context.prec, 35372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista context.Emax-context.prec+1) 3547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Underflow(Inexact, Rounded, Subnormal): 3577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Numerical underflow with result rounded to 0. 3587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This occurs and signals underflow if a result is inexact and the 3607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger adjusted exponent of the result would be smaller (more negative) than 3617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the smallest value that can be handled by the implementation (the value 36259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista Emin). That is, the result is both inexact and subnormal. 3637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result after an underflow will be a subnormal number rounded, if 36559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista necessary, so that its exponent is not less than Etiny. This may result 3667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger in 0 with the sign of the intermediate result and an exponent of Etiny. 3677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger In all cases, Inexact, Rounded, and Subnormal will also be raised. 3697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 3707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3715aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# List of public traps and flags 372fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded, 373cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis Underflow, InvalidOperation, Subnormal] 3747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3755aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# Map conditions (per the spec) to signals 3765aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger_condition_map = {ConversionSyntax:InvalidOperation, 3775aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger DivisionImpossible:InvalidOperation, 3785aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger DivisionUndefined:InvalidOperation, 3795aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger InvalidContext:InvalidOperation} 3807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Context Functions ################################################## 3827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 383ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# The getcontext() and setcontext() function manage access to a thread-local 384ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# current context. Py2.4 offers direct support for thread locals. If that 385ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# is not available, use threading.currentThread() which is slower but will 3867e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger# work for older Pythons. If threads are not part of the build, create a 387cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis# mock threading object with threading.local() returning the module namespace. 3887e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger 3897e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingertry: 3907e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger import threading 3917e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingerexcept ImportError: 3927e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger # Python was compiled without threads; create a mock object instead 3937e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger import sys 39459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista class MockThreading(object): 3957e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger def local(self, sys=sys): 3967e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger return sys.modules[__name__] 3977e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger threading = MockThreading() 3987e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger del sys, MockThreading 399ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 400ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingertry: 401ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger threading.local 402ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 403ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerexcept AttributeError: 404ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 40559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # To fix reloading, force it to create a new context 40659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Old contexts have different exceptions in their dicts, making problems. 407ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if hasattr(threading.currentThread(), '__decimal_context__'): 408ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger del threading.currentThread().__decimal_context__ 409ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 410ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def setcontext(context): 411ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Set this thread's context to context.""" 412ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if context in (DefaultContext, BasicContext, ExtendedContext): 4139fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context.copy() 41461992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger context.clear_flags() 4157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger threading.currentThread().__decimal_context__ = context 416ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 417ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def getcontext(): 418ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Returns this thread's context. 419ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 420ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger If this thread does not yet have a context, returns 421ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger a new context and sets this thread's context. 422ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger New contexts are copies of DefaultContext. 423ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """ 424ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger try: 425ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return threading.currentThread().__decimal_context__ 426ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger except AttributeError: 427ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger context = Context() 428ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger threading.currentThread().__decimal_context__ = context 429ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return context 430ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 431ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerelse: 432ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 433ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger local = threading.local() 4349fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger if hasattr(local, '__decimal_context__'): 4359fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger del local.__decimal_context__ 436ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 437ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def getcontext(_local=local): 438ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Returns this thread's context. 439ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 440ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger If this thread does not yet have a context, returns 441ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger a new context and sets this thread's context. 442ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger New contexts are copies of DefaultContext. 443ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """ 444ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger try: 445ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return _local.__decimal_context__ 446ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger except AttributeError: 447ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger context = Context() 448ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger _local.__decimal_context__ = context 449ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger return context 450ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 451ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger def setcontext(context, _local=local): 452ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger """Set this thread's context to context.""" 453ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger if context in (DefaultContext, BasicContext, ExtendedContext): 4549fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger context = context.copy() 45561992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger context.clear_flags() 456ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger _local.__decimal_context__ = context 457ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger 458cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis del threading, local # Don't contaminate the namespace 4597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4608b6999b4c5fab174090be263ba90f193bdede141Nick Coghlandef localcontext(ctx=None): 4618b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan """Return a context manager for a copy of the supplied context 4628b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 4638b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan Uses a copy of the current context if no context is specified 4648b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan The returned context manager creates a local decimal context 4658b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan in a with statement: 4668b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan def sin(x): 4678b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan with localcontext() as ctx: 4688b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ctx.prec += 2 4698b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan # Rest of sin calculation algorithm 4708b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan # uses a precision 2 greater than normal 47159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista return +s # Convert result to normal precision 4728b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 4738b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan def sin(x): 4748b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan with localcontext(ExtendedContext): 4758b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan # Rest of sin calculation algorithm 4768b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan # uses the Extended Context from the 4778b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan # General Decimal Arithmetic Specification 47859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista return +s # Convert result to normal context 4798b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 480ee340e501d2a59d70a91748ebd948787bfac8044Facundo Batista >>> setcontext(DefaultContext) 4818b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan >>> print getcontext().prec 4828b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 28 4838b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan >>> with localcontext(): 4848b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ... ctx = getcontext() 485495df4716fce4156c1eb110f9342297164eecbb6Raymond Hettinger ... ctx.prec += 2 4868b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ... print ctx.prec 4878b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ... 4888b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 30 4898b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan >>> with localcontext(ExtendedContext): 4908b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ... print getcontext().prec 4918b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan ... 4928b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 9 4938b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan >>> print getcontext().prec 4948b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 28 4958b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan """ 496ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan if ctx is None: ctx = getcontext() 497ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan return _ContextManager(ctx) 4988b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan 4997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 50059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Decimal class ####################################################### 5017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Decimal(object): 5037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Floating point class for decimal arithmetic.""" 5047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 505636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger __slots__ = ('_exp','_int','_sign', '_is_special') 506636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Generally, the value of the Decimal instance is given by 507636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # (-1)**_sign * _int * 10**_exp 508636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Special values are signified by _is_special == True 5097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 510dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger # We're immutable, so use __new__ not __init__ 511636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger def __new__(cls, value="0", context=None): 5127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Create a decimal point instance. 5137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal('3.14') # string input 515abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3.14') 51659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista >>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent) 517abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3.14') 5187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal(314) # int or long 519abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('314') 5207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger >>> Decimal(Decimal(314)) # another decimal instance 521abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('314') 52259bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson >>> Decimal(' 3.14 \\n') # leading and trailing whitespace okay 523abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3.14') 5247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 5257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 52672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # Note that the coefficient, self._int, is actually stored as 52772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # a string rather than as a tuple of digits. This speeds up 52872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # the "digits to integer" and "integer to digits" conversions 52972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # that are used in almost every arithmetic operation on 53072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # Decimals. This is an internal detail: the as_tuple function 53172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # and the Decimal constructor still deal with tuples of 53272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista # digits. 53372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista 534636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self = object.__new__(cls) 535636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 5360d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista # From a string 5370d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista # REs insist on real strings, so we can too. 5380d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if isinstance(value, basestring): 53959bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson m = _parser(value.strip()) 5400d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if m is None: 5410d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if context is None: 5420d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista context = getcontext() 5430d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista return context._raise_error(ConversionSyntax, 5440d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista "Invalid literal for Decimal: %r" % value) 545636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 5460d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if m.group('sign') == "-": 5470d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._sign = 1 5480d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista else: 5490d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._sign = 0 5500d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista intpart = m.group('int') 5510d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if intpart is not None: 5520d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista # finite number 5530d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista fracpart = m.group('frac') 5540d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista exp = int(m.group('exp') or '0') 5550d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista if fracpart is not None: 5568e85ffa4b213be809109180142a107a1ac66f4d5Mark Dickinson self._int = str((intpart+fracpart).lstrip('0') or '0') 5570d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._exp = exp - len(fracpart) 5580d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista else: 5598e85ffa4b213be809109180142a107a1ac66f4d5Mark Dickinson self._int = str(intpart.lstrip('0') or '0') 5600d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista self._exp = exp 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 5668e85ffa4b213be809109180142a107a1ac66f4d5Mark Dickinson self._int = str(diag.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 6567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isnan(self): 6577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is not actually one. 6587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 if a number 6600f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista 1 if NaN 6617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2 if sNaN 6627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 663636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 664636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger exp = self._exp 665636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp == 'n': 666636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return 1 667636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger elif exp == 'N': 668636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return 2 6697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 6707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isinfinity(self): 6727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is infinite 6737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 if finite or not a number 6757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 if +INF 6767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -1 if -INF 6777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 6787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp == 'F': 6797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 6807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 6817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 6827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 6837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 684353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _check_nans(self, other=None, context=None): 6857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether the number is not actually one. 6867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self, other are sNaN, signal 6887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self, other are NaN return nan 6897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 6907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 6917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Done before operations. 6927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 6937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 694636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self_is_nan = self._isnan() 695636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other is None: 696636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other_is_nan = False 697636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger else: 698636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other_is_nan = other._isnan() 699636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 700636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self_is_nan or other_is_nan: 701636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 702636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 703636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 704636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self_is_nan == 2: 705636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 'sNaN', 7060f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista self) 707636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other_is_nan == 2: 708636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 'sNaN', 7090f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista other) 710636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self_is_nan: 711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._fix_nan(context) 712636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 713353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return other._fix_nan(context) 7147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 7157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7162fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def _compare_check_nans(self, other, context): 7172fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson """Version of _check_nans used for the signaling comparisons 7182fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson compare_signal, __le__, __lt__, __ge__, __gt__. 7192fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 7202fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson Signal InvalidOperation if either self or other is a (quiet 7212fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson or signaling) NaN. Signaling NaNs take precedence over quiet 7222fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson NaNs. 7232fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 7242fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson Return 0 if neither operand is a NaN. 7252fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 7262fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson """ 7272fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if context is None: 7282fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson context = getcontext() 7292fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 7302fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self._is_special or other._is_special: 7312fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self.is_snan(): 7322fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return context._raise_error(InvalidOperation, 7332fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 'comparison involving sNaN', 7342fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson self) 7352fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson elif other.is_snan(): 7362fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return context._raise_error(InvalidOperation, 7372fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 'comparison involving sNaN', 7382fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other) 7392fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson elif self.is_qnan(): 7402fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return context._raise_error(InvalidOperation, 7412fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 'comparison involving NaN', 7422fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson self) 7432fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson elif other.is_qnan(): 7442fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return context._raise_error(InvalidOperation, 7452fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 'comparison involving NaN', 7462fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other) 7472fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return 0 7482fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 7497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __nonzero__(self): 7501a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is nonzero; otherwise return False. 7517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7521a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista NaNs and infinities are considered nonzero. 7537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 75472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self._is_special or self._int != '0' 7557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7562fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def _cmp(self, other): 7572fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson """Compare the two non-NaN decimal instances self and other. 7587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7592fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson Returns -1 if self < other, 0 if self == other and 1 7602fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self > other. This routine is for internal use only.""" 761636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 7622fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self._is_special or other._is_special: 763636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return cmp(self._isinfinity(), other._isinfinity()) 7647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # check for zeros; note that cmp(0, -0) should return 0 766353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other: 768353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return 0 769353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 770353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return -((-1)**other._sign) 771353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other: 772353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return (-1)**self._sign 7737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 77459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If different signs, neg one is less 7757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if other._sign < self._sign: 7767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -1 7777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign < other._sign: 7787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 1 7797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 780636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self_adjusted = self.adjusted() 781636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other_adjusted = other.adjusted() 782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_adjusted == other_adjusted: 78372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self_padded = self._int + '0'*(self._exp - other._exp) 78472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista other_padded = other._int + '0'*(other._exp - self._exp) 785353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return cmp(self_padded, other_padded) * (-1)**self._sign 786353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif self_adjusted > other_adjusted: 7877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (-1)**self._sign 788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: # self_adjusted < other_adjusted 7897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return -((-1)**self._sign) 7907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 7912fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # Note: The Decimal standard doesn't cover rich comparisons for 7922fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # Decimals. In particular, the specification is silent on the 7932fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # subject of what should happen for a comparison involving a NaN. 7942fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # We take the following approach: 7952fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # 7962fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # == comparisons involving a NaN always return False 7972fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # != comparisons involving a NaN always return True 7982fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # <, >, <= and >= comparisons involving a (quiet or signaling) 7992fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # NaN signal InvalidOperation, and return False if the 8003a94ee05f77d0200cfb7988d02f3fdf292932a94Mark Dickinson # InvalidOperation is not trapped. 8012fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # 8022fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # This behavior is designed to conform as closely as possible to 8032fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson # that specified by IEEE 754. 8042fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 8050aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger def __eq__(self, other): 8062fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8072fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8082fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8092fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self.is_nan() or other.is_nan(): 8102fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return False 8112fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) == 0 8120aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger 8130aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger def __ne__(self, other): 8142fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8152fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8162fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8172fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if self.is_nan() or other.is_nan(): 8182fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return True 8192fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) != 0 8202fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 8212fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def __lt__(self, other, context=None): 8222fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8232fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8242fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8252fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson ans = self._compare_check_nans(other, context) 8262fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if ans: 8272fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return False 8282fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) < 0 8292fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 8302fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def __le__(self, other, context=None): 8312fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8322fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8332fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8342fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson ans = self._compare_check_nans(other, context) 8352fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if ans: 8362fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return False 8372fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) <= 0 8382fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 8392fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def __gt__(self, other, context=None): 8402fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8412fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8422fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8432fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson ans = self._compare_check_nans(other, context) 8442fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if ans: 8452fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return False 8462fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) > 0 8472fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson 8482fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson def __ge__(self, other, context=None): 8492fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other) 8502fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if other is NotImplemented: 8512fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return other 8522fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson ans = self._compare_check_nans(other, context) 8532fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if ans: 8542fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return False 8552fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return self._cmp(other) >= 0 8560aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger 8577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def compare(self, other, context=None): 8587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Compares one to another. 8597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -1 => a < b 8617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 0 => a = b 8627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1 => a > b 8637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN => one is NaN 8647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Like __cmp__, but returns Decimal instances. 8657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 8677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 86859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Compare(NaN, NaN) = NaN 869636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if (self._is_special or other and other._is_special): 870636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 871636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 872636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 8737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8742fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return Decimal(self._cmp(other)) 8757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 8767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __hash__(self): 8777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """x.__hash__() <==> hash(x)""" 8787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Decimal integers must hash the same as the ints 87952b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # 88052b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # The hash of a nonspecial noninteger Decimal must depend only 88152b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # on the value of that Decimal, and not on its representation. 882abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger # For example: hash(Decimal('100E-1')) == hash(Decimal('10')). 883bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger if self._is_special: 884bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger if self._isnan(): 885bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger raise TypeError('Cannot hash a NaN value.') 886bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger return hash(str(self)) 8878c202440699cef19602acc24822366d0d7c32083Facundo Batista if not self: 8888c202440699cef19602acc24822366d0d7c32083Facundo Batista return 0 8898c202440699cef19602acc24822366d0d7c32083Facundo Batista if self._isinteger(): 8908c202440699cef19602acc24822366d0d7c32083Facundo Batista op = _WorkRep(self.to_integral_value()) 8918c202440699cef19602acc24822366d0d7c32083Facundo Batista # to make computation feasible for Decimals with large 8928c202440699cef19602acc24822366d0d7c32083Facundo Batista # exponent, we use the fact that hash(n) == hash(m) for 8938c202440699cef19602acc24822366d0d7c32083Facundo Batista # any two nonzero integers n and m such that (i) n and m 8948c202440699cef19602acc24822366d0d7c32083Facundo Batista # have the same sign, and (ii) n is congruent to m modulo 8958c202440699cef19602acc24822366d0d7c32083Facundo Batista # 2**64-1. So we can replace hash((-1)**s*c*10**e) with 8968c202440699cef19602acc24822366d0d7c32083Facundo Batista # hash((-1)**s*c*pow(10, e, 2**64-1). 8978c202440699cef19602acc24822366d0d7c32083Facundo Batista return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1)) 89852b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # The value of a nonzero nonspecial Decimal instance is 89952b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # faithfully represented by the triple consisting of its sign, 90052b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # its adjusted exponent, and its coefficient with trailing 90152b25795c02442fc40f8932d05e5d728266339a4Facundo Batista # zeros removed. 90252b25795c02442fc40f8932d05e5d728266339a4Facundo Batista return hash((self._sign, 90352b25795c02442fc40f8932d05e5d728266339a4Facundo Batista self._exp+len(self._int), 90452b25795c02442fc40f8932d05e5d728266339a4Facundo Batista self._int.rstrip('0'))) 9057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def as_tuple(self): 9077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Represents the number as a triple tuple. 9087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger To show the internals exactly as they are. 9107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 911097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp) 9127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __repr__(self): 9147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Represents the number as an instance of Decimal.""" 9157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Invariant: eval(repr(d)) == d 916abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger return "Decimal('%s')" % str(self) 9177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def __str__(self, eng=False, context=None): 9197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return string representation of the number in scientific notation. 9207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Captures all of the information in the underlying representation. 9227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 9237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 92462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista sign = ['', '-'][self._sign] 925e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger if self._is_special: 92662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista if self._exp == 'F': 92762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista return sign + 'Infinity' 92862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista elif self._exp == 'n': 92962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista return sign + 'NaN' + self._int 93062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista else: # self._exp == 'N' 93162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista return sign + 'sNaN' + self._int 93262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista 93362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # number of digits of self._int to left of decimal point 93462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista leftdigits = self._exp + len(self._int) 93562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista 93662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # dotplace is number of digits of self._int to the left of the 93762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # decimal point in the mantissa of the output string (that is, 93862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # after adjusting the exponent) 93962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista if self._exp <= 0 and leftdigits > -6: 94062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # no exponent required 94162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista dotplace = leftdigits 94262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista elif not eng: 94362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # usual scientific notation: 1 digit on left of the point 9447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger dotplace = 1 94562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista elif self._int == '0': 94662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # engineering notation, zero 94762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista dotplace = (leftdigits + 1) % 3 - 1 9487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 94962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista # engineering notation, nonzero 95062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista dotplace = (leftdigits - 1) % 3 + 1 95162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista 95262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista if dotplace <= 0: 95362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista intpart = '0' 95462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista fracpart = '.' + '0'*(-dotplace) + self._int 95562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista elif dotplace >= len(self._int): 95662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista intpart = self._int+'0'*(dotplace-len(self._int)) 95762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista fracpart = '' 95862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista else: 95962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista intpart = self._int[:dotplace] 96062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista fracpart = '.' + self._int[dotplace:] 96162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista if leftdigits == dotplace: 96262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista exp = '' 96362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista else: 96462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista if context is None: 96562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista context = getcontext() 96662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace) 96762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista 96862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista return sign + intpart + fracpart + exp 9697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_eng_string(self, context=None): 9717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Convert to engineering-type string. 9727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Engineering notation has an exponent which is a multiple of 3, so there 9747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger are up to 3 digits left of the decimal place. 9757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Same rules for when in exponential and when as a value as in __str__. 9777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self.__str__(eng=True, context=context) 9797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __neg__(self, context=None): 9817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a copy with the sign switched. 9827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds, if it has reason. 9847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 985636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 986636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 987636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 988636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 9897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 9907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 9917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # -Decimal('0') is Decimal('0'), not Decimal('-0') 9920f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista ans = self.copy_abs() 9937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self.copy_negate() 995636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 996636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 997636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 998e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 9997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __pos__(self, context=None): 10017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns a copy, unless it is a sNaN. 10027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds the number (if more then precision digits) 10047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1005636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1006636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1007636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1008636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 10097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 10117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # + (-0) = 0 10120f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista ans = self.copy_abs() 1013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = Decimal(self) 10157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1016636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 1017636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 1018e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 10197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1020e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista def __abs__(self, round=True, context=None): 10217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the absolute value of self. 10227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1023e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista If the keyword argument 'round' is false, do not round. The 1024e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista expression self.__abs__(round=False) is equivalent to 1025e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista self.copy_abs(). 10267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1027e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista if not round: 1028e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return self.copy_abs() 1029e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista 1030636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1031636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 1032636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1033636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 10347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 10367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self.__neg__(context=context) 10377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 10387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = self.__pos__(context=context) 10397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __add__(self, other, context=None): 10437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns self + other. 10447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger -INF + INF (or the reverse) cause InvalidOperation errors. 10467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1047636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1048267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1049267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 1050636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 10517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 10527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 10537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1054636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1055636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 1056636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1057636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 10587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1059636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity(): 106059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If both INF, same sign => same as both, opposite => error. 1061636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._sign != other._sign and other._isinfinity(): 1062636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, '-INF + INF') 1063636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(self) 1064636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other._isinfinity(): 106559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista return Decimal(other) # Can't both be infinity here 10667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = min(self._exp, other._exp) 10687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negativezero = 0 10697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context.rounding == ROUND_FLOOR and self._sign != other._sign: 107059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If the answer is 0, the sign should be negative, in this case. 10717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negativezero = 1 10727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self and not other: 10747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = min(self._sign, other._sign) 10757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if negativezero: 10767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign = 1 107772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(sign, '0', exp) 1078e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 1079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 10807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 108199b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista exp = max(exp, other._exp - context.prec-1) 1082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = other._rescale(exp, context.rounding) 1083e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 10847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not other: 108699b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista exp = max(exp, self._exp - context.prec-1) 1087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._rescale(exp, context.rounding) 1088e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 10897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 10907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1 = _WorkRep(self) 10927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op2 = _WorkRep(other) 1093e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista op1, op2 = _normalize(op1, op2, context.prec) 10947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 10957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result = _WorkRep() 10967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if op1.sign != op2.sign: 10977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Equal and opposite 109817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op1.int == op2.int: 109972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(negativezero, '0', exp) 1100e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 1101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 110217931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op1.int < op2.int: 11037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1, op2 = op2, op1 110459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # OK, now abs(op1) > abs(op2) 110517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op1.sign == 1: 110617931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger result.sign = 1 11077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger op1.sign, op2.sign = op2.sign, op1.sign 11087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 110917931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger result.sign = 0 111059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # So we know the sign, and op1 > 0. 111117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger elif op1.sign == 1: 11127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.sign = 1 111317931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger op1.sign, op2.sign = (0, 0) 111417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger else: 111517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger result.sign = 0 111659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Now, op1 > abs(op2) > 0 11177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 111817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger if op2.sign == 0: 1119636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger result.int = op1.int + op2.int 11207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 1121636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger result.int = op1.int - op2.int 11227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result.exp = op1.exp 11247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = Decimal(result) 1125e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 11267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __radd__ = __add__ 11297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __sub__(self, other, context=None): 1131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Return self - other""" 1132636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1133267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1134267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 11357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1136636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1137636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context=context) 1138636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1139636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 11407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self - other is computed as self + other.copy_negate() 1142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self.__add__(other.copy_negate(), context=context) 11437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rsub__(self, other, context=None): 1145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Return other - self""" 1146636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1147267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1148267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 11497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return other.__sub__(self, context=context) 11517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __mul__(self, other, context=None): 11537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self * other. 11547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (+-) INF * 0 (or its reverse) raise InvalidOperation. 11567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1157636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1158267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1159267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 1160636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 11617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 11627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 11637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1164d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger resultsign = self._sign ^ other._sign 11657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1166636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1167636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 1168636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 1169636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 1170636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1171636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity(): 1172636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not other: 1173636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, '(+-)INF * 0') 1174636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Infsign[resultsign] 1175636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1176636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other._isinfinity(): 1177636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not self: 1178636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, '0 * (+-)INF') 1179636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Infsign[resultsign] 11807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger resultexp = self._exp + other._exp 11827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Special case for multiplying by zero 11847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self or not other: 118572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(resultsign, '0', resultexp) 1186e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista # Fixing in case the exponent is out of bounds 1187e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 11887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 11907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Special case for multiplying by power of 10 119172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista if self._int == '1': 119272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(resultsign, other._int, resultexp) 1193e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 11947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 119572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista if other._int == '1': 119672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(resultsign, self._int, resultexp) 1197e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 11987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 11997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1200636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger op1 = _WorkRep(self) 1201636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger op2 = _WorkRep(other) 1202636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 120372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp) 1204e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista ans = ans._fix(context) 12057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 12077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __rmul__ = __mul__ 12087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12098aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson def __truediv__(self, other, context=None): 12107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return self / other.""" 1211636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1212267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1213cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return NotImplemented 1214636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 12157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if context is None: 12167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = getcontext() 12177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1218636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger sign = self._sign ^ other._sign 1219636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1220636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 1221636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(other, context) 1222636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 12237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 12247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1225636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity() and other._isinfinity(): 12267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF') 12277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 12287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._isinfinity(): 1229636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Infsign[sign] 1230636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1231636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if other._isinfinity(): 1232636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context._raise_error(Clamped, 'Division by infinity') 123372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(sign, '0', context.Etiny()) 1234636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1235636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # Special cases for zeroes 1236636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if not other: 1237cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not self: 1238cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionUndefined, '0 / 0') 1239636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(DivisionByZero, 'x / 0', sign) 12407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1241cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not self: 1242cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista exp = self._exp - other._exp 1243cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista coeff = 0 1244cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1245cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista # OK, so neither = 0, INF or NaN 1246cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista shift = len(other._int) - len(self._int) + context.prec + 1 1247cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista exp = self._exp - other._exp - shift 1248cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op1 = _WorkRep(self) 1249cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op2 = _WorkRep(other) 1250cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if shift >= 0: 1251cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista coeff, remainder = divmod(op1.int * 10**shift, op2.int) 1252cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1253cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista coeff, remainder = divmod(op1.int, op2.int * 10**-shift) 1254cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if remainder: 1255cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista # result is not exact; adjust to ensure correct rounding 1256cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if coeff % 5 == 0: 1257cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista coeff += 1 1258cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1259cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista # result is exact; get as close to ideal exponent as possible 1260cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ideal_exp = self._exp - other._exp 1261cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista while exp < ideal_exp and coeff % 10 == 0: 1262cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista coeff //= 10 1263cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista exp += 1 12647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 126572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(sign, str(coeff), exp) 1266cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans._fix(context) 12677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1268cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista def _divide(self, other, context): 1269cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista """Return (self // other, self % other), to context.prec precision. 12707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1271cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista Assumes that neither self nor other is a NaN, that self is not 1272cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista infinite and that other is nonzero. 1273cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista """ 1274cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista sign = self._sign ^ other._sign 1275cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if other._isinfinity(): 1276cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ideal_exp = self._exp 1277cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1278cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ideal_exp = min(self._exp, other._exp) 12797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1280cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista expdiff = self.adjusted() - other.adjusted() 1281cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not self or other._isinfinity() or expdiff <= -2: 128272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return (_dec_from_triple(sign, '0', 0), 1283cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista self._rescale(ideal_exp, context.rounding)) 1284cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if expdiff <= context.prec: 1285cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op1 = _WorkRep(self) 1286cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op2 = _WorkRep(other) 1287cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if op1.exp >= op2.exp: 1288cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op1.int *= 10**(op1.exp - op2.exp) 1289cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1290cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista op2.int *= 10**(op2.exp - op1.exp) 1291cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista q, r = divmod(op1.int, op2.int) 1292cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if q < 10**context.prec: 129372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return (_dec_from_triple(sign, str(q), 0), 129472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista _dec_from_triple(self._sign, str(r), ideal_exp)) 12957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1296cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista # Here the quotient is too large to be representable 1297cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = context._raise_error(DivisionImpossible, 1298cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 'quotient too large in //, % or divmod') 1299cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans, ans 13007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13018aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson def __rtruediv__(self, other, context=None): 13028aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson """Swaps self/other and returns __truediv__.""" 1303636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1304267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1305267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 13068aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson return other.__truediv__(self, context=context) 13078aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson 13088aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson __div__ = __truediv__ 13098aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson __rdiv__ = __rtruediv__ 13107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __divmod__(self, other, context=None): 13127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1313cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista Return (self // other, self % other) 13147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1315cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista other = _convert_other(other) 1316cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if other is NotImplemented: 1317cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return other 1318cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1319cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if context is None: 1320cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista context = getcontext() 1321cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1322cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = self._check_nans(other, context) 1323cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if ans: 1324cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return (ans, ans) 1325cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1326cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista sign = self._sign ^ other._sign 1327cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if self._isinfinity(): 1328cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if other._isinfinity(): 1329cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)') 1330cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans, ans 1331cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1332cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return (Infsign[sign], 1333cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista context._raise_error(InvalidOperation, 'INF % x')) 1334cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1335cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not other: 1336cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not self: 1337cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)') 1338cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans, ans 1339cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1340cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return (context._raise_error(DivisionByZero, 'x // 0', sign), 1341cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista context._raise_error(InvalidOperation, 'x % 0')) 1342cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1343cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista quotient, remainder = self._divide(other, context) 1344e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista remainder = remainder._fix(context) 1345cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return quotient, remainder 13467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rdivmod__(self, other, context=None): 13487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __divmod__.""" 1349636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1350267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1351267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 13527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__divmod__(self, context=context) 13537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __mod__(self, other, context=None): 13557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 13567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self % other 13577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1358636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1359267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1360267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 13617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1362cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if context is None: 1363cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista context = getcontext() 13647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1365cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = self._check_nans(other, context) 1366cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if ans: 1367cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans 13687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1369cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if self._isinfinity(): 1370cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(InvalidOperation, 'INF % x') 1371cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista elif not other: 1372cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if self: 1373cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(InvalidOperation, 'x % 0') 1374cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1375cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionUndefined, '0 % 0') 1376cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1377cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista remainder = self._divide(other, context)[1] 1378e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista remainder = remainder._fix(context) 1379cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return remainder 13807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rmod__(self, other, context=None): 13827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __mod__.""" 1383636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1384267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1385267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 13867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__mod__(self, context=context) 13877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 13887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder_near(self, other, context=None): 13897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 13907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Remainder nearest to 0- abs(remainder-near) <= other/2 13917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1392636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 1393636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 13947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 13967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1397353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 1398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 1399353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 14007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self == +/-infinity -> InvalidOperation 1402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 1403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1404353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'remainder_near(infinity, x)') 14057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # other == 0 -> either InvalidOperation or DivisionUndefined 1407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other: 1408353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self: 1409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1410353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'remainder_near(x, 0)') 1411353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1412353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(DivisionUndefined, 1413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'remainder_near(0, 0)') 14147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1415353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # other = +/-infinity -> remainder = self 1416353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinfinity(): 1417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = Decimal(self) 1418353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 14197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1420353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self = 0 -> remainder = self, with ideal exponent 1421353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ideal_exponent = min(self._exp, other._exp) 1422353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 142372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(self._sign, '0', ideal_exponent) 1424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 14257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1426353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # catch most cases of large or small quotient 1427353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista expdiff = self.adjusted() - other.adjusted() 1428353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if expdiff >= context.prec + 1: 1429353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expdiff >= prec+1 => abs(self/other) > 10**prec 1430cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionImpossible) 1431353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if expdiff <= -2: 1432353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expdiff <= -2 => abs(self/other) < 0.1 1433353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._rescale(ideal_exponent, context.rounding) 1434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 14357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # adjust both arguments to have the same exponent, then divide 1437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op1 = _WorkRep(self) 1438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op2 = _WorkRep(other) 1439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if op1.exp >= op2.exp: 1440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op1.int *= 10**(op1.exp - op2.exp) 14417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 1442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op2.int *= 10**(op2.exp - op1.exp) 1443353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q, r = divmod(op1.int, op2.int) 1444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # remainder is r*10**ideal_exponent; other is +/-op2.int * 1445353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 10**ideal_exponent. Apply correction to ensure that 1446353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # abs(remainder) <= abs(other)/2 1447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if 2*r + (q&1) > op2.int: 1448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista r -= op2.int 1449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q += 1 1450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if q >= 10**context.prec: 1452cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionImpossible) 1453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result has same sign as self unless r is negative 1455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign = self._sign 1456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if r < 0: 1457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign = 1-sign 1458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista r = -r 14597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 146072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(sign, str(r), ideal_exponent) 1461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 14627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __floordiv__(self, other, context=None): 14647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """self // other""" 1465cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista other = _convert_other(other) 1466cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if other is NotImplemented: 1467cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return other 1468cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1469cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if context is None: 1470cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista context = getcontext() 1471cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1472cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista ans = self._check_nans(other, context) 1473cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if ans: 1474cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return ans 1475cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1476cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if self._isinfinity(): 1477cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if other._isinfinity(): 1478cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(InvalidOperation, 'INF // INF') 1479cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1480cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return Infsign[self._sign ^ other._sign] 1481cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1482cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if not other: 1483cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista if self: 1484cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionByZero, 'x // 0', 1485cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista self._sign ^ other._sign) 1486cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista else: 1487cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionUndefined, '0 // 0') 1488cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista 1489cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return self._divide(other, context)[0] 14907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __rfloordiv__(self, other, context=None): 14927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Swaps self/other and returns __floordiv__.""" 1493636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 1494267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 1495267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 14967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return other.__floordiv__(self, context=context) 14977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 14987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __float__(self): 14997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Float representation.""" 15007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return float(str(self)) 15017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __int__(self): 150346b0802ccd9a9c47b27a285526fbb2a8bee5b8cbBrett Cannon """Converts self to an int, truncating if necessary.""" 1504636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 1505636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isnan(): 1506636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 1507636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidContext) 1508636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger elif self._isinfinity(): 15098aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson raise OverflowError("Cannot convert infinity to int") 1510353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista s = (-1)**self._sign 15117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 151272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return s*int(self._int)*10**self._exp 1513605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger else: 151472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return s*int(self._int[:self._exp] or '0') 15157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15165a05364049a7b0c3eeee94fb7b77e6b41036b3aeRaymond Hettinger __trunc__ = __int__ 15175a05364049a7b0c3eeee94fb7b77e6b41036b3aeRaymond Hettinger 1518116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger @property 1519116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger def real(self): 1520116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger return self 1521116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger 1522116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger @property 1523116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger def imag(self): 1524116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger return Decimal(0) 1525116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger 1526116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger def conjugate(self): 1527116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger return self 1528116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger 1529116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger def __complex__(self): 1530116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger return complex(float(self)) 1531116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger 15327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __long__(self): 15337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts to a long. 15347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Equivalent to long(int(self)) 15367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 15377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return long(self.__int__()) 15387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1539353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _fix_nan(self, context): 1540353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Decapitate the payload of a NaN to fit the context""" 1541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista payload = self._int 1542353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # maximum length of payload is precision if _clamp=0, 1544353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # precision-1 if _clamp=1. 1545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista max_payload_len = context.prec - context._clamp 1546353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if len(payload) > max_payload_len: 154772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista payload = payload[len(payload)-max_payload_len:].lstrip('0') 154872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, payload, self._exp, True) 15496c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 1550353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1551dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger def _fix(self, context): 15527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Round if it is necessary to keep self within prec precision. 15537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Rounds and fixes the exponent. Does not raise on a sNaN. 15557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 15567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Arguments: 15577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self - Decimal instance 15587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context - context used. 15597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1560636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 1561353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special: 1562353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isnan(): 1563353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # decapitate payload if necessary 1564353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._fix_nan(context) 1565353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1566353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self is +/-Infinity; return unaltered 15676c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 15687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1569353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if self is zero then exponent should be between Etiny and 1570353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Emax if _clamp==0, and between Etiny and Etop if _clamp==1. 1571353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Etiny = context.Etiny() 1572353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Etop = context.Etop() 15737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 1574353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp_max = [context.Emax, Etop][context._clamp] 1575353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista new_exp = min(max(self._exp, Etiny), exp_max) 1576353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if new_exp != self._exp: 1577353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Clamped) 157872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, '0', new_exp) 15797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 15806c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 15817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1582353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp_min is the smallest allowable exponent of the result, 1583353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # equal to max(self.adjusted()-context.prec+1, Etiny) 1584353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp_min = len(self._int) + self._exp - context.prec 1585353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if exp_min > Etop: 1586353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # overflow: exp_min > Etop iff self.adjusted() > Emax 1587353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 1588353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 1589353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(Overflow, 'above Emax', self._sign) 1590353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self_is_subnormal = exp_min < Etiny 1591353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_is_subnormal: 1592353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Subnormal) 1593353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp_min = Etiny 15947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1595353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # round if self has too many digits 1596353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._exp < exp_min: 15977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._raise_error(Rounded) 15982ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista digits = len(self._int) + self._exp - exp_min 15992ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if digits < 0: 16002ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista self = _dec_from_triple(self._sign, '1', exp_min-1) 16012ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista digits = 0 16022ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista this_function = getattr(self, self._pick_rounding_function[context.rounding]) 16032ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista changed = this_function(digits) 16042ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista coeff = self._int[:digits] or '0' 16052ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if changed == 1: 16062ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista coeff = str(int(coeff)+1) 16072ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista ans = _dec_from_triple(self._sign, coeff, exp_min) 16082ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista 16092ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if changed: 1610353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 1611353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_is_subnormal: 1612353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Underflow) 1613353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not ans: 1614353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # raise Clamped on underflow to 0 1615353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Clamped) 1616353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif len(ans._int) == context.prec+1: 1617353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # we get here only if rescaling rounds the 1618353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # cofficient up to exactly 10**context.prec 1619353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans._exp < Etop: 162072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(ans._sign, 162172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans._int[:-1], ans._exp+1) 1622353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1623353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Inexact and Rounded have already been raised 1624353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = context._raise_error(Overflow, 'above Emax', 1625353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self._sign) 16267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 16277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1628353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # fold down if _clamp == 1 and self has too few digits 1629353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context._clamp == 1 and self._exp > Etop: 1630353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Clamped) 163172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self_padded = self._int + '0'*(self._exp - Etop) 163272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, self_padded, Etop) 16337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1634353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # here self was representable to begin with; return unchanged 16356c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 16367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 16377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger _pick_rounding_function = {} 16387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1639353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # for each of the rounding functions below: 1640353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self is a finite, nonzero Decimal 1641353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # prec is an integer satisfying 0 <= prec < len(self._int) 16422ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # 16432ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # each function returns either -1, 0, or 1, as follows: 16442ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # 1 indicates that self should be rounded up (away from zero) 16452ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # 0 indicates that self should be truncated, and that all the 16462ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # digits to be truncated are zeros (so the value is unchanged) 16472ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista # -1 indicates that there are nonzero digits to be truncated 16487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1649353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_down(self, prec): 1650353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Also known as round-towards-0, truncate.""" 16512ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if _all_zeros(self._int, prec): 16522ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return 0 16532ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista else: 16542ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -1 16557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1656353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_up(self, prec): 1657353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rounds away from 0.""" 16582ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -self._round_down(prec) 16597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1660353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_half_up(self, prec): 1661353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rounds 5 up (away from 0)""" 166272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista if self._int[prec] in '56789': 16632ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return 1 16642ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista elif _all_zeros(self._int, prec): 16652ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return 0 1666353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 16672ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -1 16687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1669353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_half_down(self, prec): 16707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Round 5 down""" 16712ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if _exact_half(self._int, prec): 16722ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -1 16732ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista else: 16742ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return self._round_half_up(prec) 16757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1676353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_half_even(self, prec): 1677353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Round 5 to even, rest to nearest.""" 16782ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if _exact_half(self._int, prec) and \ 16792ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista (prec == 0 or self._int[prec-1] in '02468'): 16802ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -1 1681353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 16822ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return self._round_half_up(prec) 16837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1684353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_ceiling(self, prec): 16857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds up (not away from 0 if negative.)""" 16867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign: 1687353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._round_down(prec) 16887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 16892ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -self._round_down(prec) 16907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1691353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_floor(self, prec): 16927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds down (not towards 0 if negative)""" 16937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self._sign: 1694353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._round_down(prec) 16957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 16962ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -self._round_down(prec) 16977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1698353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _round_05up(self, prec): 1699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Round down unless digit prec-1 is 0 or 5.""" 17002ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if prec and self._int[prec-1] not in '05': 1701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._round_down(prec) 17022ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista else: 17032ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return -self._round_down(prec) 1704353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1705353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def fma(self, other, third, context=None): 1706353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Fused multiply-add. 17077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1708353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Returns self*other+third with no rounding of the intermediate 1709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista product self*other. 1710353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self and other are multiplied together, with no rounding of 1712353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista the result. The third operand is then added to the result, 1713353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista and a single final rounding is performed. 17147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 1715353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1716353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 17177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 171858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista # compute product; raise InvalidOperation if either operand is 171958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista # a signaling NaN or if the product is zero times infinity. 172058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if self._is_special or other._is_special: 172158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if context is None: 172258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista context = getcontext() 172358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if self._exp == 'N': 17240f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista return context._raise_error(InvalidOperation, 'sNaN', self) 172558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if other._exp == 'N': 17260f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista return context._raise_error(InvalidOperation, 'sNaN', other) 172758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if self._exp == 'n': 172858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista product = self 172958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista elif other._exp == 'n': 173058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista product = other 173158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista elif self._exp == 'F': 173258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if not other: 173358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista return context._raise_error(InvalidOperation, 173458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista 'INF * 0 in fma') 173558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista product = Infsign[self._sign ^ other._sign] 173658f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista elif other._exp == 'F': 173758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista if not self: 173858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista return context._raise_error(InvalidOperation, 173958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista '0 * INF in fma') 174058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista product = Infsign[self._sign ^ other._sign] 174158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista else: 174258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista product = _dec_from_triple(self._sign ^ other._sign, 174358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista str(int(self._int) * int(other._int)), 174458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista self._exp + other._exp) 17457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 174658f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista third = _convert_other(third, raiseit=True) 174758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista return product.__add__(third, context) 17487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1749353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _power_modulo(self, other, modulo, context=None): 1750353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Three argument version of __pow__""" 17517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1752353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if can't convert other and modulo to Decimal, raise 1753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # TypeError; there's no point returning NotImplemented (no 1754353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # equivalent of __rpow__ for three argument pow) 1755353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 1756353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista modulo = _convert_other(modulo, raiseit=True) 17577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1758353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 1759353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 17607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # deal with NaNs: if there are any sNaNs then first one wins, 1762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (i.e. behaviour for NaNs is identical to that of fma) 1763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self_is_nan = self._isnan() 1764353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other_is_nan = other._isnan() 1765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista modulo_is_nan = modulo._isnan() 1766353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_is_nan or other_is_nan or modulo_is_nan: 1767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_is_nan == 2: 1768353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 'sNaN', 17690f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista self) 1770353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_is_nan == 2: 1771353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 'sNaN', 17720f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista other) 1773353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if modulo_is_nan == 2: 1774353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 'sNaN', 17750f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista modulo) 1776353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_is_nan: 17776c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return self._fix_nan(context) 1778353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_is_nan: 17796c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return other._fix_nan(context) 17806c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return modulo._fix_nan(context) 1781353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # check inputs: we apply same restrictions as Python's pow() 1783353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (self._isinteger() and 1784353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other._isinteger() and 1785353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista modulo._isinteger()): 1786353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1787353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'pow() 3rd argument not allowed ' 1788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'unless all arguments are integers') 1789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other < 0: 1790353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1791353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'pow() 2nd argument cannot be ' 1792353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'negative when 3rd argument specified') 1793353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not modulo: 1794353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'pow() 3rd argument cannot be 0') 1796353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # additional restriction for decimal: the modulus must be less 1798353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # than 10**prec in absolute value 1799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if modulo.adjusted() >= context.prec: 1800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1801353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'insufficient precision: pow() 3rd ' 1802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'argument must not have more than ' 1803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'precision digits') 1804353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # define 0**0 == NaN, for consistency with two-argument pow 1806353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (even though it hurts!) 1807353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other and not self: 1808353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 1809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'at least one of pow() 1st argument ' 1810353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'and 2nd argument must be nonzero ;' 1811353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '0**0 is not defined') 1812353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute sign of result 1814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._iseven(): 1815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign = 0 1816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign = self._sign 1818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # convert modulo to a Python integer, and self and other to 1820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Decimal integers (i.e. force their exponents to be >= 0) 1821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista modulo = abs(int(modulo)) 1822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista base = _WorkRep(self.to_integral_value()) 1823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exponent = _WorkRep(other.to_integral_value()) 1824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute result using integer pow() 1826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo 1827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista for i in xrange(exponent.exp): 1828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista base = pow(base, 10, modulo) 1829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista base = pow(base, exponent.int, modulo) 1830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 183172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(sign, str(base), 0) 1832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _power_exact(self, other, p): 1834353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Attempt to compute self**other exactly. 1835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Given Decimals self and other and an integer p, attempt to 1837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista compute an exact result for the power self**other, with p 1838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista digits of precision. Return None if self**other is not 1839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exactly representable in p digits. 1840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1841353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Assumes that elimination of special cases has already been 1842353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista performed: self and other must both be nonspecial; self must 1843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista be positive and not numerically equal to 1; other must be 1844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista nonzero. For efficiency, other._exp should not be too large, 1845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista so that 10**abs(other._exp) is a feasible calculation.""" 1846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # In the comments below, we write x for the value of self and 1848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # y for the value of other. Write x = xc*10**xe and y = 1849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # yc*10**ye. 1850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # The main purpose of this method is to identify the *failure* 1852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # of x**y to be exactly representable with as little effort as 1853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # possible. So we look for cheap and easy tests that 1854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # eliminate the possibility of x**y being exact. Only if all 1855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # these tests are passed do we go on to actually compute x**y. 1856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Here's the main idea. First normalize both x and y. We 1858353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # express y as a rational m/n, with m and n relatively prime 1859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # and n>0. Then for x**y to be exactly representable (at 1860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # *any* precision), xc must be the nth power of a positive 1861353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # integer and xe must be divisible by n. If m is negative 1862353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # then additionally xc must be a power of either 2 or 5, hence 1863353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # a power of 2**n or 5**n. 1864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # There's a limit to how small |y| can be: if y=m/n as above 1866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # then: 1867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (1) if xc != 1 then for the result to be representable we 1869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So 1870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <= 1871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 2**(1/|y|), hence xc**|y| < 2 and the result is not 1872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # representable. 1873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if 1875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # |y| < 1/|xe| then the result is not representable. 1876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Note that since x is not equal to 1, at least one of (1) and 1878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) < 1879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye. 1880353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # There's also a limit to how large y can be, at least if it's 1882353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # positive: the normalized result will have coefficient xc**y, 1883353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # so if it's representable then xc**y < 10**p, and y < 1884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # p/log10(xc). Hence if y*log10(xc) >= p then the result is 1885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # not exactly representable. 1886353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye, 1888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # so |y| < 1/xe and the result is not representable. 1889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y| 1890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # < 1/nbits(xc). 1891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista x = _WorkRep(self) 1893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc, xe = x.int, x.exp 1894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while xc % 10 == 0: 1895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc //= 10 1896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe += 1 1897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _WorkRep(other) 1899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista yc, ye = y.int, y.exp 1900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while yc % 10 == 0: 1901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista yc //= 10 1902353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ye += 1 1903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # case where xc == 1: result is 10**(xe*y), with xe*y 1905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # required to be an integer 1906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc == 1: 1907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ye >= 0: 1908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exponent = xe*yc*10**ye 1909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exponent, remainder = divmod(xe*yc, 10**-ye) 1911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 1912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if y.sign == 1: 1914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exponent = -exponent 1915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if other is a nonnegative integer, use ideal exponent 1916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinteger() and other._sign == 0: 1917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ideal_exponent = self._exp*int(other) 1918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista zeros = min(exponent-ideal_exponent, p-1) 1919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista zeros = 0 192172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros) 1922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # case where y is negative: xc must be either a power 1924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # of 2 or a power of 5. 1925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if y.sign == 1: 1926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista last_digit = xc % 10 1927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if last_digit in (2,4,6,8): 1928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # quick test for power of 2 1929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc & -xc != xc: 1930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # now xc is a power of 2; e is its exponent 1932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e = _nbits(xc)-1 1933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # find e*y and xe*y; both must be integers 1934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ye >= 0: 1935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y_as_int = yc*10**ye 1936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e = e*y_as_int 1937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe = xe*y_as_int 1938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ten_pow = 10**-ye 1940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e, remainder = divmod(e*yc, ten_pow) 1941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 1942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe, remainder = divmod(xe*yc, ten_pow) 1944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 1945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if e*65 >= p*93: # 93/65 > log(10)/log(5) 1948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc = 5**e 1950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif last_digit == 5: 1952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # e >= log_5(xc) if xc is a power of 5; we have 1953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # equality all the way up to xc=5**2658 1954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e = _nbits(xc)*28//65 1955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc, remainder = divmod(5**e, xc) 1956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 1957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while xc % 5 == 0: 1959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc //= 5 1960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e -= 1 1961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ye >= 0: 1962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y_as_integer = yc*10**ye 1963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e = e*y_as_integer 1964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe = xe*y_as_integer 1965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ten_pow = 10**-ye 1967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e, remainder = divmod(e*yc, ten_pow) 1968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 1969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe, remainder = divmod(xe*yc, ten_pow) 1971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if remainder: 1972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if e*3 >= p*10: # 10/3 > log(10)/log(2) 1974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc = 2**e 1976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 19787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc >= 10**p: 1980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe = -e-xe 198272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, str(xc), xe) 19837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 1984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # now y is positive; find m and n such that y = m/n 1985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ye >= 0: 1986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista m, n = yc*10**ye, 1 1987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 1988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xe != 0 and len(str(abs(yc*xe))) <= -ye: 1989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc_bits = _nbits(xc) 1991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye: 1992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 1993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista m, n = yc, 10**(-ye) 1994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while m % 2 == n % 2 == 0: 1995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista m //= 2 1996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n //= 2 1997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while m % 5 == n % 5 == 0: 1998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista m //= 5 1999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n //= 5 2000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute nth root of xc*10**xe 2002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if n > 1: 2003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if 1 < xc < 2**n then xc isn't an nth power 2004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc != 1 and xc_bits <= n: 2005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe, rem = divmod(xe, n) 2008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if rem != 0: 2009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute nth root of xc using Newton's method 2012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista a = 1L << -(-_nbits(xc)//n) # initial estimate 2013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 2014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q, r = divmod(xc, a**(n-1)) 2015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if a <= q: 2016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista break 2017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista a = (a*(n-1) + q)//n 2019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (a == q and r == 0): 2020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc = a 2022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # now xc*10**xe is the nth root of the original xc*10**xe 2024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute mth power of xc*10**xe 2025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m > 2027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 10**p and the result is not representable. 2028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc > 1 and m > p*100//_log10_lb(xc): 2029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc = xc**m 2031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xe *= m 2032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if xc > 10**p: 2033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return None 2034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # by this point the result *is* exactly representable 2036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # adjust the exponent to get as close as possible to the ideal 2037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exponent, if necessary 2038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista str_xc = str(xc) 2039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinteger() and other._sign == 0: 2040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ideal_exponent = self._exp*int(other) 2041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista zeros = min(xe-ideal_exponent, p-len(str_xc)) 2042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista zeros = 0 204472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros) 2045cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 2046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def __pow__(self, other, modulo=None, context=None): 2047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Return self ** other [ % modulo]. 20487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista With two arguments, compute self**other. 20507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista With three arguments, compute (self**other) % modulo. For the 2052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista three argument form, the following restrictions on the 2053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista arguments hold: 20547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - all three arguments must be integral 2056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - other must be nonnegative 2057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - either self or other (or both) must be nonzero 2058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - modulo must be nonzero and must have at most p digits, 2059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista where p is the context precision. 20607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista If any of these restrictions is violated the InvalidOperation 2062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista flag is raised. 2063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result of pow(self, other, modulo) is identical to the 2065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista result that would be obtained by computing (self**other) % 2066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista modulo with unbounded precision, but is computed more 2067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista efficiently. It is always exact. 2068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if modulo is not None: 2071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._power_modulo(other, modulo, context) 20727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2073636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger other = _convert_other(other) 2074267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger if other is NotImplemented: 2075267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return other 20767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 20797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # either argument is a NaN => result is NaN 2081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 2082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 2083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 20847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity) 2086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other: 2087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 2088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, '0 ** 0') 2089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 20917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result has sign 1 iff self._sign is 1 and other is an odd integer 2093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista result_sign = 0 2094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign == 1: 2095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinteger(): 2096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other._iseven(): 2097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista result_sign = 1 2098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # -ve**noninteger = NaN 2100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (-0)**noninteger = 0**noninteger 2101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self: 2102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'x ** y with x negative and y not an integer') 2104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # negate self, without doing any unwanted rounding 210572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self = self.copy_negate() 2106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity 2108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 2109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._sign == 0: 211072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(result_sign, '0', 0) 2111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Infsign[result_sign] 2113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0 2115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 2116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._sign == 0: 2117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Infsign[result_sign] 2118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 211972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(result_sign, '0', 0) 2120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1**other = 1, but the choice of exponent and the flags 2122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # depend on the exponent of self, and on whether other is a 2123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # positive integer, a negative integer, or neither 2124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self == Dec_p1: 2125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinteger(): 2126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp = max(self._exp*max(int(other), 0), 2127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1-context.prec) but evaluating int(other) directly 2128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # is dangerous until we know other is small (other 2129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # could be 1e999999999) 2130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._sign == 1: 2131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista multiplier = 0 2132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif other > context.prec: 2133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista multiplier = context.prec 2134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista multiplier = int(other) 2136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp = self._exp * multiplier 2138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if exp < 1-context.prec: 2139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp = 1-context.prec 2140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 2141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 2143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 2144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp = 1-context.prec 2145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 214672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(result_sign, '1'+'0'*-exp, exp) 2147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute adjusted exponent of self 2149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self_adj = self.adjusted() 2150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self ** infinity is infinity if self > 1, 0 if self < 1 2152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self ** -infinity is infinity if self < 1, 0 if self > 1 2153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._isinfinity(): 2154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if (other._sign == 0) == (self_adj < 0): 215572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(result_sign, '0', 0) 2156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Infsign[result_sign] 2158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # from here on, the result always goes through the call 2160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # to _fix at the end of this function. 2161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = None 2162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # crude test to catch cases of extreme overflow/underflow. If 2164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(self)*other >= 10**bound and bound >= len(str(Emax)) 2165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence 2166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self**other >= 10**(Emax+1), so overflow occurs. The test 2167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # for underflow is similar. 2168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista bound = self._log10_exp_bound() + other.adjusted() 2169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if (self_adj >= 0) == (other._sign == 0): 2170353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self > 1 and other +ve, or self < 1 and other -ve 2171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # possibility of overflow 2172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if bound >= len(str(context.Emax)): 217372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(result_sign, '1', context.Emax+1) 2174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self > 1 and other -ve, or self < 1 and other +ve 2176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # possibility of underflow to 0 2177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Etiny = context.Etiny() 2178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if bound >= len(str(-Etiny)): 217972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(result_sign, '1', Etiny-1) 2180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # try for an exact result with precision +1 2182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans is None: 2183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._power_exact(other, context.prec + 1) 2184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans is not None and result_sign == 1: 218572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(1, ans._int, ans._exp) 2186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # usual case: inexact result, x**y computed directly as exp(y*log(x)) 2188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans is None: 2189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p = context.prec 2190353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista x = _WorkRep(self) 2191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista xc, xe = x.int, x.exp 2192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _WorkRep(other) 2193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista yc, ye = y.int, y.exp 2194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if y.sign == 1: 2195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista yc = -yc 2196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute correctly rounded result: start with precision +3, 2198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # then increase precision until result is unambiguously roundable 2199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista extra = 3 2200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 2201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff, exp = _dpower(xc, xe, yc, ye, p+extra) 2202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if coeff % (5*10**(len(str(coeff))-p-1)): 2203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista break 2204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista extra += 3 2205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 220672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(result_sign, str(coeff), exp) 2207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the specification says that for non-integer other we need to 2209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # raise Inexact, even when the result is actually exact. In 2210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the same way, we need to raise Underflow here if the result 2211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # is subnormal. (The call to _fix will take care of raising 2212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Rounded and Subnormal, as usual.) 2213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not other._isinteger(): 2214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 2215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # pad with zeros up to length context.prec+1 if necessary 2216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if len(ans._int) <= context.prec: 2217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista expdiff = context.prec+1 - len(ans._int) 221872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff, 221972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans._exp-expdiff) 2220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans.adjusted() < context.Emin: 2221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Underflow) 2222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # unlike exp, ln and log10, the power function respects the 2224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # rounding mode; no need to use ROUND_HALF_EVEN here 2225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = ans._fix(context) 2226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def __rpow__(self, other, context=None): 2229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Swaps self/other and returns __pow__.""" 2230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other) 2231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other is NotImplemented: 2232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return other 2233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return other.__pow__(self, context=context) 2234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def normalize(self, context=None): 2236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Normalize- strip trailing 0s, change anything equal to 0 to 0e0""" 2237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 2240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special: 2242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 2243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 2244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista dup = self._fix(context) 2247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if dup._isinfinity(): 2248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return dup 2249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not dup: 225172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(dup._sign, '0', 0) 2252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp_max = [context.Emax, context.Etop()][context._clamp] 2253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista end = len(dup._int) 22547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = dup._exp 225572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista while dup._int[end-1] == '0' and exp < exp_max: 22567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp += 1 22577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger end -= 1 225872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(dup._sign, dup._int[:end], exp) 22597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2260bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista def quantize(self, exp, rounding=None, context=None, watchexp=True): 22617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Quantize self so its exponent is the same as that of exp. 22627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 22637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Similar to self._rescale(exp._exp) but with error checking. 22647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2265bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista exp = _convert_other(exp, raiseit=True) 2266bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista 2267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 2269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if rounding is None: 2270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context.rounding 2271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2272636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or exp._is_special: 2273636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(exp, context) 2274636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 2275636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 22767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2277636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp._isinfinity() or self._isinfinity(): 2278636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if exp._isinfinity() and self._isinfinity(): 22796c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) # if both are inf, it is OK 2280636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return context._raise_error(InvalidOperation, 2281636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 'quantize with one INF') 2282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2283bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista # if we're not watching exponents, do a simple rescale 2284bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista if not watchexp: 2285bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista ans = self._rescale(exp._exp, rounding) 2286bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista # raise Inexact and Rounded where appropriate 2287bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista if ans._exp > self._exp: 2288bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista context._raise_error(Rounded) 2289bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista if ans != self: 2290bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista context._raise_error(Inexact) 2291bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista return ans 2292bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista 2293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp._exp should be between Etiny and Emax 2294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (context.Etiny() <= exp._exp <= context.Emax): 2295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'target exponent out of bounds in quantize') 2297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 229972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(self._sign, '0', exp._exp) 2300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 2301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self_adjusted = self.adjusted() 2303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_adjusted > context.Emax: 2304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'exponent of quantize result too large for current context') 2306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_adjusted - exp._exp + 1 > context.prec: 2307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'quantize result has too many digits for current context') 2309353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2310353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._rescale(exp._exp, rounding) 2311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans.adjusted() > context.Emax: 2312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'exponent of quantize result too large for current context') 2314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if len(ans._int) > context.prec: 2315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'quantize result has too many digits for current context') 2317353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # raise appropriate flags 2319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans._exp > self._exp: 2320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 2321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans != self: 2322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 2323353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans and ans.adjusted() < context.Emin: 2324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Subnormal) 2325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # call to fix takes care of any necessary folddown 2327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = ans._fix(context) 2328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 23297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def same_quantum(self, other): 23311a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self and other have the same exponent; otherwise 23321a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return False. 23337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23341a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista If either operand is a special value, the following rules are used: 23351a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista * return True if both operands are infinities 23361a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista * return True if both operands are NaNs 23371a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista * otherwise, return False. 23387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 23391a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista other = _convert_other(other, raiseit=True) 2340636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 23411a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return (self.is_nan() and other.is_nan() or 23421a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista self.is_infinite() and other.is_infinite()) 23437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._exp == other._exp 23447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _rescale(self, exp, rounding): 2346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rescale self so that the exponent is exp, either by padding with zeros 2347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista or by truncating digits, using the given rounding mode. 2348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Specials are returned without change. This operation is 2350353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista quiet: it raises no flags, and uses no information from the 2351353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context. 23527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exp = exp to scale to (an integer) 2354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = rounding mode 23557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2356636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 23576c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 23587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 235972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, '0', exp) 23607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2361353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._exp >= exp: 2362353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # pad answer with zeros if necessary 236372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, 236472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._int + '0'*(self._exp - exp), exp) 23657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2366353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # too many digits; round and lose data. If self.adjusted() < 2367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp-1, replace self by 10**(exp-1) before rounding 2368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista digits = len(self._int) + self._exp - exp 23697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if digits < 0: 237072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self = _dec_from_triple(self._sign, '1', exp-1) 2371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista digits = 0 2372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista this_function = getattr(self, self._pick_rounding_function[rounding]) 23732ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista changed = this_function(digits) 23742ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista coeff = self._int[:digits] or '0' 23752ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista if changed == 1: 23762ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista coeff = str(int(coeff)+1) 23772ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista return _dec_from_triple(self._sign, coeff, exp) 23787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 23791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson def _round(self, places, rounding): 23801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """Round a nonzero, nonspecial Decimal to a fixed number of 23811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson significant figures, using the given rounding mode. 23821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 23831ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson Infinities, NaNs and zeros are returned unaltered. 23841ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 23851ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson This operation is quiet: it raises no flags, and uses no 23861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson information from the context. 23871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 23881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """ 23891ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if places <= 0: 23901ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson raise ValueError("argument should be at least 1 in _round") 23911ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if self._is_special or not self: 23921ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson return Decimal(self) 23931ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson ans = self._rescale(self.adjusted()+1-places, rounding) 23941ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # it can happen that the rescale alters the adjusted exponent; 23951ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # for example when rounding 99.97 to 3 significant figures. 23961ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # When this happens we end up with an extra 0 at the end of 23971ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # the number; a second rescale fixes this. 23981ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if ans.adjusted() != self.adjusted(): 23991ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson ans = ans._rescale(ans.adjusted()+1-places, rounding) 24001ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson return ans 24011ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 2402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def to_integral_exact(self, rounding=None, context=None): 2403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rounds to a nearby integer. 24047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista If no rounding mode is specified, take the rounding mode from 2406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista the context. This method raises the Rounded and Inexact flags 2407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista when appropriate. 24087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista See also: to_integral_value, which does exactly the same as 2410353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista this method except that it doesn't raise Inexact or Rounded. 2411353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2412636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 2413636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 2414636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 2415636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 24166c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 24177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 24186c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 2419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 242072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, '0', 0) 2421636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if context is None: 2422636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger context = getcontext() 2423353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if rounding is None: 2424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context.rounding 2425353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 2426353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._rescale(0, rounding) 2427353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans != self: 2428353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 24297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return ans 24307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2431353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def to_integral_value(self, rounding=None, context=None): 2432353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rounds to the nearest integer, without raising inexact, rounded.""" 2433353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 2435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if rounding is None: 2436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context.rounding 2437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special: 2438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 2439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 2440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 24416c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 2442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._exp >= 0: 24436c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 2444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2445353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._rescale(0, rounding) 24467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the method name changed, but we provide also the old one, for compatibility 2448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista to_integral = to_integral_value 2449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def sqrt(self, context=None): 2451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Return the square root of self.""" 24523b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson if context is None: 24533b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson context = getcontext() 24543b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson 2455636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special: 2456636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger ans = self._check_nans(context=context) 2457636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if ans: 2458636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return ans 24597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2460636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._isinfinity() and self._sign == 0: 2461636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(self) 24627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if not self: 2464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exponent = self._exp // 2. sqrt(-0) = -0 246572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(self._sign, '0', self._exp // 2) 2466353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans._fix(context) 24677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 24687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._sign == 1: 24697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0') 24707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # At this point self represents a positive number. Let p be 2472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the desired precision and express self in the form c*100**e 2473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # with c a positive real number and e an integer, c and e 2474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # being chosen so that 100**(p-1) <= c < 100**p. Then the 2475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1) 2476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # <= sqrt(c) < 10**p, so the closest representable Decimal at 2477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # precision p is n*10**e where n = round_half_even(sqrt(c)), 2478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the closest integer to sqrt(c) with the even integer chosen 2479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # in the case of a tie. 2480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 2481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # To ensure correct rounding in all cases, we use the 2482353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # following trick: we compute the square root to an extra 2483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # place (precision p+1 instead of precision p), rounding down. 2484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Then, if the result is inexact and its last digit is 0 or 5, 2485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # we increase the last digit to 1 or 6 respectively; if it's 2486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exact we leave the last digit alone. Now the final round to 2487353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # p places (or fewer in the case of underflow) will round 2488353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # correctly and raise the appropriate flags. 2489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2490353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # use an extra digit of precision 2491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista prec = context.prec+1 2492353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2493353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # write argument in the form c*100**e where e = self._exp//2 2494353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # is the 'ideal' exponent, to be used if the square root is 2495353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exactly representable. l is the number of 'digits' of c in 2496353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # base 100, so that 100**(l-1) <= c < 100**l. 2497353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 2498353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e = op.exp >> 1 2499353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if op.exp & 1: 2500353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = op.int * 10 2501353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista l = (len(self._int) >> 1) + 1 25027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 2503353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = op.int 2504353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista l = len(self._int)+1 >> 1 2505353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2506353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # rescale so that c has exactly prec base 100 'digits' 2507353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista shift = prec-l 2508353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if shift >= 0: 2509353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c *= 100**shift 2510353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exact = True 25117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 2512353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, remainder = divmod(c, 100**-shift) 2513353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exact = not remainder 2514353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e -= shift 2515353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2516353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # find n = floor(sqrt(c)) using Newton's method 2517353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n = 10**prec 2518353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 2519353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q = c//n 2520353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if n <= q: 25217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger break 2522353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2523353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n = n + q >> 1 2524353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exact = exact and n*n == c 2525353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2526353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if exact: 2527353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result is exact; rescale to use ideal exponent e 2528353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if shift >= 0: 2529353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # assert n % 10**shift == 0 2530353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n //= 10**shift 2531353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2532353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n *= 10**-shift 2533353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista e += shift 25347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 2535353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result is not exact; fix last digit as described above 2536353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if n % 5 == 0: 2537353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista n += 1 25387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 253972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, str(n), e) 25407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # round, and fit to current context 2542353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context._shallow_copy() 2543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context._set_rounding(ROUND_HALF_EVEN) 2544dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger ans = ans._fix(context) 2545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context.rounding = rounding 25467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2547353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 25487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def max(self, other, context=None): 25507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the larger value. 25517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2552353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Like max(self, other) except if one is not a number, returns 25537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN (and signals if one is sNaN). Also rounds. 25547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2555353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 2556636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 25576c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista if context is None: 25586c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista context = getcontext() 25596c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista 2560636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 256159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If one operand is a quiet NaN and the other is number, then the 2562636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # number is always returned 2563636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger sn = self._isnan() 2564636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger on = other._isnan() 2565636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if sn or on: 2566636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if on == 1 and sn != 2: 25676c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return self._fix_nan(context) 2568636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if sn == 1 and on != 2: 25696c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return other._fix_nan(context) 2570636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self._check_nans(other, context) 25717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25722fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson c = self._cmp(other) 2573d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger if c == 0: 257459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If both operands are finite and equal in numerical value 2575d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # then an ordering is applied: 2576d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # 257759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If the signs differ then max returns the operand with the 2578d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # positive sign and min returns the operand with the negative sign 2579d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger # 258059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If the signs are the same then the exponent is used to select 2581353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the result. This is exactly the ordering used in compare_total. 2582353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = self.compare_total(other) 2583353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2584353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == -1: 25857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = other 2586353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2587353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self 2588636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2589e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 25907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 25917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def min(self, other, context=None): 25927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the smaller value. 25937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 259459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista Like min(self, other) except if one is not a number, returns 25957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger NaN (and signals if one is sNaN). Also rounds. 25967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 2597353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 2598636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 25996c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista if context is None: 26006c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista context = getcontext() 26016c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista 2602636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if self._is_special or other._is_special: 260359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If one operand is a quiet NaN and the other is number, then the 2604636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # number is always returned 2605636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger sn = self._isnan() 2606636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger on = other._isnan() 2607636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if sn or on: 2608636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if on == 1 and sn != 2: 26096c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return self._fix_nan(context) 2610636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if sn == 1 and on != 2: 26116c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return other._fix_nan(context) 2612636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return self._check_nans(other, context) 26137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26142fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson c = self._cmp(other) 2615d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger if c == 0: 2616353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = self.compare_total(other) 2617353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2618353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == -1: 2619353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self 2620353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 26217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ans = other 2622636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 2623e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 26247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _isinteger(self): 26267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns whether self is an integer""" 2627353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special: 2628353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return False 26297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if self._exp >= 0: 26307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return True 26317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rest = self._int[self._exp:] 263272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return rest == '0'*len(rest) 26337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _iseven(self): 2635353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns True if self is even. Assumes self is an integer.""" 2636353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self or self._exp > 0: 2637353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return True 263872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self._int[-1+self._exp] in '02468' 26397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 26407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def adjusted(self): 26417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the adjusted exponent of self""" 26427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger try: 26437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self._exp + len(self._int) - 1 264459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # If NaN or Infinity, self._exp is string 26457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger except TypeError: 26467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return 0 26477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 2648353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def canonical(self, context=None): 2649353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the same Decimal object. 2650353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2651353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista As we do not have different encodings for the same number, the 2652353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista received object already is in its canonical form. 2653353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2654353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self 2655353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2656353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_signal(self, other, context=None): 2657353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares self to the other operand numerically. 2658353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2659353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista It's pretty much like compare(), but all NaNs signal, with signaling 2660353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista NaNs taking precedence over quiet NaNs. 2661353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 26622fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson other = _convert_other(other, raiseit = True) 26632fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson ans = self._compare_check_nans(other, context) 26642fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson if ans: 26652fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson return ans 2666353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self.compare(other, context=context) 2667353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2668353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_total(self, other): 2669353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares self to other using the abstract representations. 2670353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2671353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista This is not like the standard compare, which use their numerical 2672353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista value. Note that a total ordering is defined for all possible abstract 2673353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista representations. 2674353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2675353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if one is negative and the other is positive, it's easy 2676353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign and not other._sign: 2677353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_n1 2678353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self._sign and other._sign: 2679353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2680353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign = self._sign 2681353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2682353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # let's handle both NaN types 2683353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista self_nan = self._isnan() 2684353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other_nan = other._isnan() 2685353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan or other_nan: 2686353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan == other_nan: 2687353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._int < other._int: 2688353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sign: 2689353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2690353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2691353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_n1 2692353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._int > other._int: 2693353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sign: 2694353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_n1 2695353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2696353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2697353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_0 2698353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sign: 2700353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan == 1: 2701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_n1 2702353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_nan == 1: 2703353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2704353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan == 2: 2705353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_n1 2706353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_nan == 2: 2707353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2708353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan == 1: 2710353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_nan == 1: 2712353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_n1 2713353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self_nan == 2: 2714353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2715353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other_nan == 2: 2716353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_n1 2717353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2718353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self < other: 2719353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_n1 2720353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self > other: 2721353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2722353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2723353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._exp < other._exp: 2724353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sign: 2725353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2726353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2727353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_n1 2728353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._exp > other._exp: 2729353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sign: 2730353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_n1 2731353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2732353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2733353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_0 2734353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2735353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2736353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_total_mag(self, other): 2737353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares self to other using abstract repr., ignoring sign. 2738353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2739353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Like compare_total, but with operand's sign ignored and assumed to be 0. 2740353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2741353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista s = self.copy_abs() 2742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista o = other.copy_abs() 2743353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return s.compare_total(o) 2744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2745353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_abs(self): 2746353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a copy with the sign set to 0. """ 274772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, self._int, self._exp, self._is_special) 2748353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2749353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_negate(self): 2750353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a copy with the sign inverted.""" 2751353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign: 275272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, self._int, self._exp, self._is_special) 2753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 275472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(1, self._int, self._exp, self._is_special) 2755353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2756353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_sign(self, other): 2757353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns self with the sign of other.""" 275872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(other._sign, self._int, 275972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._exp, self._is_special) 2760353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def exp(self, context=None): 2762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns e ** self.""" 2763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2764353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 2766353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp(NaN) = NaN 2768353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 2769353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 2770353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2771353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2772353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp(-Infinity) = 0 2773353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == -1: 2774353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_0 2775353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2776353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp(0) = 1 2777353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 2778353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_p1 2779353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2780353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exp(Infinity) = Infinity 2781353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == 1: 2782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Decimal(self) 2783353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2784353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the result is now guaranteed to be inexact (the true 2785353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # mathematical result is transcendental). There's no need to 2786353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # raise Rounded and Inexact here---they'll always be raised as 2787353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # a result of the call to _fix. 2788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p = context.prec 2789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista adj = self.adjusted() 2790353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2791353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # we only need to do any computation for quite a small range 2792353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # of adjusted exponents---for example, -29 <= adj <= 10 for 2793353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the default context. For smaller exponent the result is 2794353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # indistinguishable from 1 at the given precision, while for 2795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # larger exponent the result either overflows or underflows. 2796353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign == 0 and adj > len(str((context.Emax+1)*3)): 2797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # overflow 279872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, '1', context.Emax+1) 2799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)): 2800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # underflow to 0 280172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, '1', context.Etiny()-1) 2802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif self._sign == 0 and adj < -p: 2803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # p+1 digits; final round will raise correct flags 280472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p) 2805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif self._sign == 1 and adj < -p-1: 2806353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # p+1 digits; final round will raise correct flags 280772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, '9'*(p+1), -p-1) 2808353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # general case 2809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 2810353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 2811353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, e = op.int, op.exp 2812353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if op.sign == 1: 2813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = -c 2814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute correctly rounded result: increase precision by 2816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 3 digits at a time until we get an unambiguously 2817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # roundable result 2818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista extra = 3 2819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 2820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff, exp = _dexp(c, e, p+extra) 2821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if coeff % (5*10**(len(str(coeff))-p-1)): 2822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista break 2823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista extra += 3 2824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 282572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(0, str(coeff), exp) 2826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # at this stage, ans should round correctly with *any* 2828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # rounding mode, not just with ROUND_HALF_EVEN 2829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context._shallow_copy() 2830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context._set_rounding(ROUND_HALF_EVEN) 2831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = ans._fix(context) 2832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context.rounding = rounding 2833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2834353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_canonical(self): 28371a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is canonical; otherwise return False. 28381a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista 28391a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista Currently, the encoding of a Decimal instance is always 28401a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista canonical, so this method returns True for any Decimal. 28411a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """ 28421a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return True 2843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_finite(self): 28451a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is finite; otherwise return False. 2846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 28471a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista A Decimal instance is considered finite if it is neither 28481a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista infinite nor a NaN. 2849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 28501a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return not self._is_special 2851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_infinite(self): 28531a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is infinite; otherwise return False.""" 28541a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self._exp == 'F' 2855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_nan(self): 28571a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is a qNaN or sNaN; otherwise return False.""" 28581a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self._exp in ('n', 'N') 2859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_normal(self, context=None): 28611a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is a normal number; otherwise return False.""" 28621a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista if self._is_special or not self: 28631a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return False 2864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 28661a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return context.Emin <= self.adjusted() <= context.Emax 2867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_qnan(self): 28691a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is a quiet NaN; otherwise return False.""" 28701a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self._exp == 'n' 2871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_signed(self): 28731a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is negative; otherwise return False.""" 28741a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self._sign == 1 2875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_snan(self): 28771a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is a signaling NaN; otherwise return False.""" 28781a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self._exp == 'N' 2879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2880353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_subnormal(self, context=None): 28811a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is subnormal; otherwise return False.""" 28821a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista if self._is_special or not self: 28831a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return False 2884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 28861a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return self.adjusted() < context.Emin 2887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_zero(self): 28891a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if self is a zero; otherwise return False.""" 289072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return not self._is_special and self._int == '0' 2891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _ln_exp_bound(self): 2893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compute a lower bound for the adjusted exponent of self.ln(). 2894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista In other words, compute r such that self.ln() >= 10**r. Assumes 2895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista that self is finite and positive and that self != 1. 2896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1 2899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista adj = self._exp + len(self._int) - 1 2900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj >= 1: 2901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10) 2902353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(str(adj*23//10)) - 1 2903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj <= -2: 2904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # argument <= 0.1 2905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(str((-1-adj)*23//10)) - 1 2906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 2907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, e = op.int, op.exp 2908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj == 0: 2909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1 < self < 10 2910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista num = str(c-10**-e) 2911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista den = str(c) 2912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(num) - len(den) - (num < den) 2913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # adj == -1, 0.1 <= self < 1 2914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return e + len(str(10**-e - c)) - 1 2915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def ln(self, context=None): 2918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the natural (base e) logarithm of self.""" 2919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 2921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 2922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # ln(NaN) = NaN 2924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 2925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 2926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # ln(0.0) == -Infinity 2929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 2930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return negInf 2931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # ln(Infinity) = Infinity 2933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == 1: 2934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Inf 2935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # ln(1.0) == 0.0 2937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self == Dec_p1: 2938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Dec_0 2939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # ln(negative) raises InvalidOperation 2941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign == 1: 2942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 2943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'ln of a negative value') 2944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result is irrational, so necessarily inexact 2946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 2947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, e = op.int, op.exp 2948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p = context.prec 2949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # correctly rounded result: repeatedly increase precision by 3 2951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # until we get an unambiguously roundable result 2952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista places = p - self._ln_exp_bound() + 2 # at least p+3 places 2953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 2954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff = _dlog(c, e, places) 2955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # assert len(str(abs(coeff)))-p >= 1 2956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if coeff % (5*10**(len(str(abs(coeff)))-p-1)): 2957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista break 2958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista places += 3 295972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places) 2960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context._shallow_copy() 2962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context._set_rounding(ROUND_HALF_EVEN) 2963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = ans._fix(context) 2964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context.rounding = rounding 2965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 2966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _log10_exp_bound(self): 2968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compute a lower bound for the adjusted exponent of self.log10(). 2969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista In other words, find r such that self.log10() >= 10**r. 2970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Assumes that self is finite and positive and that self != 1. 2971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 2972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # For x >= 10 or x < 0.1 we only need a bound on the integer 2974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # part of log10(self), and this comes directly from the 2975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # exponent of x. For 0.1 <= x <= 10 we use the inequalities 2976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| > 2977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0 2978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista adj = self._exp + len(self._int) - 1 2980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj >= 1: 2981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self >= 10 2982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(str(adj))-1 2983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj <= -2: 2984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # self < 0.1 2985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(str(-1-adj))-1 2986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 2987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, e = op.int, op.exp 2988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if adj == 0: 2989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 1 < self < 10 2990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista num = str(c-10**-e) 2991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista den = str(231*c) 2992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(num) - len(den) - (num < den) + 2 2993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # adj == -1, 0.1 <= self < 1 2994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista num = str(10**-e-c) 2995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return len(num) + e - (num < "231") - 1 2996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 2997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def log10(self, context=None): 2998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the base 10 logarithm of self.""" 2999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(NaN) = NaN 3004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 3005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(0.0) == -Infinity 3009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 3010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return negInf 3011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(Infinity) = Infinity 3013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == 1: 3014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Inf 3015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(negative or -Infinity) raises InvalidOperation 3017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign == 1: 3018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation, 3019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'log10 of a negative value') 3020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log10(10**n) = n 302272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1): 3023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # answer may need rounding 3024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = Decimal(self._exp + len(self._int) - 1) 3025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result is irrational, so necessarily inexact 3027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista op = _WorkRep(self) 3028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c, e = op.int, op.exp 3029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p = context.prec 3030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # correctly rounded result: repeatedly increase precision 3032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # until result is unambiguously roundable 3033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista places = p-self._log10_exp_bound()+2 3034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while True: 3035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff = _dlog10(c, e, places) 3036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # assert len(str(abs(coeff)))-p >= 1 3037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if coeff % (5*10**(len(str(abs(coeff)))-p-1)): 3038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista break 3039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista places += 3 304072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places) 3041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context._shallow_copy() 3043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rounding = context._set_rounding(ROUND_HALF_EVEN) 3044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = ans._fix(context) 3045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context.rounding = rounding 3046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logb(self, context=None): 3049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ Returns the exponent of the magnitude of self's MSD. 3050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result is the integer which is the exponent of the magnitude 3052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista of the most significant digit of self (as though it were truncated 3053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista to a single digit while maintaining the value of that digit and 3054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista without limiting the resulting exponent). 3055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # logb(NaN) = NaN 3057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 3058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # logb(+/-Inf) = +Inf 3065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 3066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Inf 3067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # logb(0) = -Inf, DivisionByZero 3069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self: 3070cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista return context._raise_error(DivisionByZero, 'logb(0)', 1) 3071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # otherwise, simply return the adjusted exponent of self, as a 3073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Decimal. Note that no attempt is made to fit the result 3074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # into the current context. 3075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Decimal(self.adjusted()) 3076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _islogical(self): 3078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Return True if self is a logical operand. 3079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3080c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling For being logical, it must be a finite number with a sign of 0, 3081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista an exponent of 0, and a coefficient whose digits must all be 3082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista either 0 or 1. 3083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign != 0 or self._exp != 0: 3085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return False 3086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista for dig in self._int: 308772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista if dig not in '01': 3088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return False 3089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return True 3090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def _fill_logical(self, context, opa, opb): 3092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista dif = context.prec - len(opa) 3093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if dif > 0: 309472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista opa = '0'*dif + opa 3095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif dif < 0: 3096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista opa = opa[-context.prec:] 3097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista dif = context.prec - len(opb) 3098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if dif > 0: 309972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista opb = '0'*dif + opb 3100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif dif < 0: 3101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista opb = opb[-context.prec:] 3102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return opa, opb 3103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_and(self, other, context=None): 3105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies an 'and' operation between self and other's digits.""" 3106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self._islogical() or not other._islogical(): 3109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # fill to context.prec 3112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (opa, opb) = self._fill_logical(context, self._int, other._int) 3113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # make the operation, and clean starting zeroes 311572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)]) 311672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, result.lstrip('0') or '0', 0) 3117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_invert(self, context=None): 3119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Invert all its digits.""" 3120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 312272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0), 312372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista context) 3124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_or(self, other, context=None): 3126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies an 'or' operation between self and other's digits.""" 3127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self._islogical() or not other._islogical(): 3130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # fill to context.prec 3133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (opa, opb) = self._fill_logical(context, self._int, other._int) 3134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # make the operation, and clean starting zeroes 313672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista result = "".join(str(int(a)|int(b)) for a,b in zip(opa,opb)) 313772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, result.lstrip('0') or '0', 0) 3138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_xor(self, other, context=None): 3140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies an 'xor' operation between self and other's digits.""" 3141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not self._islogical() or not other._islogical(): 3144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # fill to context.prec 3147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (opa, opb) = self._fill_logical(context, self._int, other._int) 3148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # make the operation, and clean starting zeroes 315072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista result = "".join(str(int(a)^int(b)) for a,b in zip(opa,opb)) 315172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, result.lstrip('0') or '0', 0) 3152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def max_mag(self, other, context=None): 3154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares the values numerically with their sign ignored.""" 3155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 3156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 31576c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista if context is None: 31586c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista context = getcontext() 31596c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista 3160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special or other._is_special: 3161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # If one operand is a quiet NaN and the other is number, then the 3162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # number is always returned 3163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sn = self._isnan() 3164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista on = other._isnan() 3165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sn or on: 3166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if on == 1 and sn != 2: 31676c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return self._fix_nan(context) 3168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sn == 1 and on != 2: 31696c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return other._fix_nan(context) 3170353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._check_nans(other, context) 3171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 31722fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson c = self.copy_abs()._cmp(other.copy_abs()) 3173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == 0: 3174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = self.compare_total(other) 3175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == -1: 3177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = other 3178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self 3180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3181e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 3182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def min_mag(self, other, context=None): 3184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares the values numerically with their sign ignored.""" 3185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 3186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 31876c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista if context is None: 31886c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista context = getcontext() 31896c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista 3190353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._is_special or other._is_special: 3191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # If one operand is a quiet NaN and the other is number, then the 3192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # number is always returned 3193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sn = self._isnan() 3194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista on = other._isnan() 3195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sn or on: 3196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if on == 1 and sn != 2: 31976c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return self._fix_nan(context) 3198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if sn == 1 and on != 2: 31996c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return other._fix_nan(context) 3200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._check_nans(other, context) 3201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 32022fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson c = self.copy_abs()._cmp(other.copy_abs()) 3203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == 0: 3204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = self.compare_total(other) 3205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c == -1: 3207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self 3208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = other 3210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3211e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista return ans._fix(context) 3212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_minus(self, context=None): 3214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the largest representable number smaller than itself.""" 3215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 3219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == -1: 3223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return negInf 3224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == 1: 322572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(0, '9'*context.prec, context.Etop()) 3226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context.copy() 3228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._set_rounding(ROUND_FLOOR) 3229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._ignore_all_flags() 3230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista new_self = self._fix(context) 3231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if new_self != self: 3232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return new_self 323372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1), 323472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista context) 3235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_plus(self, context=None): 3237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the smallest representable number larger than itself.""" 3238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(context=context) 3242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == 1: 3246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Inf 3247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity() == -1: 324872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(1, '9'*context.prec, context.Etop()) 3249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = context.copy() 3251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._set_rounding(ROUND_CEILING) 3252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._ignore_all_flags() 3253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista new_self = self._fix(context) 3254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if new_self != self: 3255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return new_self 325672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1), 325772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista context) 3258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_toward(self, other, context=None): 3260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the number closest to self, in the direction towards other. 3261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result is the closest representable number to self 3263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (excluding self) that is in the direction towards other, 3264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista unless both have the same value. If the two operands are 3265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista numerically equal, then the result is a copy of self with the 3266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista sign set to be the same as the sign of other. 3267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista other = _convert_other(other, raiseit=True) 3269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 3274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 32772fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson comparison = self._cmp(other) 3278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if comparison == 0: 327972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self.copy_sign(other) 3280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3281353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if comparison == -1: 3282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self.next_plus(context) 3283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: # comparison == 1 3284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self.next_minus(context) 3285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # decide which flags to raise using value of ans 3287353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans._isinfinity(): 3288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Overflow, 3289353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'Infinite result from next_toward', 3290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans._sign) 3291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 3292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 3293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista elif ans.adjusted() < context.Emin: 3294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Underflow) 3295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Subnormal) 3296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Rounded) 3297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Inexact) 3298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # if precision == 1 then we don't raise Clamped for a 3299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # result 0E-Etiny. 3300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not ans: 3301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context._raise_error(Clamped) 3302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def number_class(self, context=None): 3306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns an indication of the class of self. 3307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The class is one of the following strings: 33090f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista sNaN 33100f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista NaN 3311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Infinity 3312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Normal 3313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Subnormal 3314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Zero 3315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Zero 3316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Subnormal 3317353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Normal 3318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Infinity 3319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self.is_snan(): 3321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "sNaN" 3322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self.is_qnan(): 3323353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "NaN" 3324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista inf = self._isinfinity() 3325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if inf == 1: 3326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "+Infinity" 3327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if inf == -1: 3328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "-Infinity" 3329353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self.is_zero(): 3330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign: 3331353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "-Zero" 3332353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3333353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "+Zero" 3334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3335353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3336353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self.is_subnormal(context=context): 3337353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign: 3338353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "-Subnormal" 3339353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3340353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "+Subnormal" 3341353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # just a normal, regular, boring number, :) 3342353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._sign: 3343353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "-Normal" 3344353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 3345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return "+Normal" 3346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def radix(self): 3348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Just returns 10, as this is Decimal, :)""" 3349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Decimal(10) 3350353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3351353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def rotate(self, other, context=None): 3352353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a rotated copy of self, value-of-other times.""" 3353353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3355353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3356353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 3357353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3358353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3359353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3360353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._exp != 0: 3361353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3362353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (-context.prec <= int(other) <= context.prec): 3363353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3364353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3365353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 33666c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 3367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # get values, pad if necessary 3369353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista torot = int(other) 3370353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotdig = self._int 3371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista topad = context.prec - len(rotdig) 3372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if topad: 337372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista rotdig = '0'*topad + rotdig 3374353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3375353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # let's rotate! 3376353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotated = rotdig[torot:] + rotdig[:torot] 337772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, 337872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista rotated.lstrip('0') or '0', self._exp) 3379353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3380353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def scaleb (self, other, context=None): 3381353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns self operand after adding the second value to its exp.""" 3382353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3383353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3384353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3385353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 3386353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3387353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3388353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3389353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._exp != 0: 3390353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3391353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista liminf = -2 * (context.Emax + context.prec) 3392353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista limsup = 2 * (context.Emax + context.prec) 3393353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (liminf <= int(other) <= limsup): 3394353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3396353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 33976c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 3398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 339972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista d = _dec_from_triple(self._sign, self._int, self._exp + int(other)) 3400353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista d = d._fix(context) 3401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return d 3402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def shift(self, other, context=None): 3404353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a shifted copy of self, value-of-other times.""" 3405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if context is None: 3406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context = getcontext() 3407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3408353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista ans = self._check_nans(other, context) 3409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ans: 3410353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return ans 3411353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3412353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if other._exp != 0: 3413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3414353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not (-context.prec <= int(other) <= context.prec): 3415353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return context._raise_error(InvalidOperation) 3416353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if self._isinfinity(): 34186c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 3419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3420353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # get values, pad if necessary 3421353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista torot = int(other) 3422353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if not torot: 34236c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(self) 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 shift! 3430353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if torot < 0: 3431353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotated = rotdig[:torot] 3432353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 343372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista rotated = rotdig + '0'*torot 3434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotated = rotated[-context.prec:] 3435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 343672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return _dec_from_triple(self._sign, 343772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista rotated.lstrip('0') or '0', self._exp) 3438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 343959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Support for pickling, copy, and deepcopy 34407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __reduce__(self): 34417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return (self.__class__, (str(self),)) 34427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 34437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __copy__(self): 34447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if type(self) == Decimal: 3445cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis return self # I'm immutable; therefore I am my own clone 34467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__class__(str(self)) 34477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 34487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __deepcopy__(self, memo): 34497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if type(self) == Decimal: 3450cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis return self # My components are also immutable 34517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return self.__class__(str(self)) 34527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 34531ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # PEP 3101 support. See also _parse_format_specifier and _format_align 34541ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson def __format__(self, specifier, context=None): 3455f4da77765f8581e31620e9f49c68028e57b0ae85Mark Dickinson """Format a Decimal instance according to the given specifier. 34561ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 34571ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson The specifier should be a standard format specifier, with the 34581ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson form described in PEP 3101. Formatting types 'e', 'E', 'f', 34591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 'F', 'g', 'G', and '%' are supported. If the formatting type 34601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson is omitted it defaults to 'g' or 'G', depending on the value 34611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson of context.capitals. 34621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 34631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson At this time the 'n' format specifier type (which is supposed 34641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson to use the current locale) is not supported. 34651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """ 34661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 34671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # Note: PEP 3101 says that if the type is not present then 34681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # there should be at least one digit after the decimal point. 34691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # We take the liberty of ignoring this requirement for 34701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # Decimal---it's presumably there to make sure that 34711ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # format(float, '') behaves similarly to str(float). 34721ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if context is None: 34731ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson context = getcontext() 34741ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 34751ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson spec = _parse_format_specifier(specifier) 34761ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 34771ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # special values don't care about the type or precision... 34781ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if self._is_special: 34791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson return _format_align(str(self), spec) 34801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 34811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # a type of None defaults to 'g' or 'G', depending on context 34821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # if type is '%', adjust exponent of self accordingly 34831ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if spec['type'] is None: 34841ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson spec['type'] = ['g', 'G'][context.capitals] 34851ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif spec['type'] == '%': 34861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson self = _dec_from_triple(self._sign, self._int, self._exp+2) 34871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 34881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # round if necessary, taking rounding mode from the context 34891ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson rounding = context.rounding 34901ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson precision = spec['precision'] 34911ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if precision is not None: 34921ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if spec['type'] in 'eE': 34931ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson self = self._round(precision+1, rounding) 34941ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif spec['type'] in 'gG': 34951ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if len(self._int) > precision: 34961ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson self = self._round(precision, rounding) 34971ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif spec['type'] in 'fF%': 34981ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson self = self._rescale(-precision, rounding) 34991ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # special case: zeros with a positive exponent can't be 35001ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # represented in fixed point; rescale them to 0e0. 35011ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif not self and self._exp > 0 and spec['type'] in 'fF%': 35021ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson self = self._rescale(0, rounding) 35031ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 35041ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # figure out placement of the decimal point 35051ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson leftdigits = self._exp + len(self._int) 35061ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if spec['type'] in 'fF%': 35071ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson dotplace = leftdigits 35081ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif spec['type'] in 'eE': 35091ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if not self and precision is not None: 35101ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson dotplace = 1 - precision 35111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson else: 35121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson dotplace = 1 35131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif spec['type'] in 'gG': 35141ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if self._exp <= 0 and leftdigits > -6: 35151ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson dotplace = leftdigits 35161ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson else: 35171ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson dotplace = 1 35181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 35191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # figure out main part of numeric string... 35201ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if dotplace <= 0: 35211ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson num = '0.' + '0'*(-dotplace) + self._int 35221ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif dotplace >= len(self._int): 35231ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # make sure we're not padding a '0' with extra zeros on the right 35241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson assert dotplace==len(self._int) or self._int != '0' 35251ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson num = self._int + '0'*(dotplace-len(self._int)) 35261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson else: 35271ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson num = self._int[:dotplace] + '.' + self._int[dotplace:] 35281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 35291ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # ...then the trailing exponent, or trailing '%' 35301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if leftdigits != dotplace or spec['type'] in 'eE': 35311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']] 35321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson num = num + "{0}{1:+}".format(echar, leftdigits-dotplace) 35331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif spec['type'] == '%': 35341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson num = num + '%' 35351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 35361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # add sign 35371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if self._sign == 1: 35381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson num = '-' + num 35391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson return _format_align(num, spec) 35401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 35411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 354272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batistadef _dec_from_triple(sign, coefficient, exponent, special=False): 354372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista """Create a decimal instance directly, without any validation, 354472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista normalization (e.g. removal of leading zeros) or argument 354572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista conversion. 354672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista 354772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista This function is for *internal use only*. 354872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista """ 354972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista 355072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self = object.__new__(Decimal) 355172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._sign = sign 355272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._int = coefficient 355372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._exp = exponent 355472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self._is_special = special 355572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista 355672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista return self 355772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista 355859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Context class ####################################################### 3559cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis 35607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3561cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis# get rounding method function: 356259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batistarounding_functions = [name for name in Decimal.__dict__.keys() 356359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista if name.startswith('_round_')] 35647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerfor name in rounding_functions: 356559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value. 35667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger globalname = name[1:].upper() 35677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = globals()[globalname] 35687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Decimal._pick_rounding_function[val] = name 35697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 35709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettingerdel name, val, globalname, rounding_functions 35717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3572ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlanclass _ContextManager(object): 35738b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan """Context manager class to support localcontext(). 35741a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum 3575ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan Sets a copy of the supplied context in __enter__() and restores 35768b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan the previous decimal context in __exit__() 35778b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan """ 35781a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum def __init__(self, new_context): 3579ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan self.new_context = new_context.copy() 35801a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum def __enter__(self): 35811a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum self.saved_context = getcontext() 35821a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum setcontext(self.new_context) 35831a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum return self.new_context 35841a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum def __exit__(self, t, v, tb): 35851a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum setcontext(self.saved_context) 35861a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum 35877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Context(object): 35887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Contains the context for a Decimal instance. 35897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 35907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Contains: 35917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec - precision (for use in rounding, division, square roots..) 359259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista rounding - rounding type (how you round) 3593bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps - If traps[exception] = 1, then the exception is 35947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger raised when it is caused. Otherwise, a value is 35957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger substituted in. 35961840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson flags - When an exception is caused, flags[exception] is set. 35977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (Whether or not the trap_enabler is set) 35987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Should be reset by user of Decimal instance. 35990ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emin - Minimum exponent 36000ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emax - Maximum exponent 36017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger capitals - If 1, 1*10^1 is printed as 1E+1. 36027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If 0, printed as 1e1 3603e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger _clamp - If 1, change exponents if too high (Default 0) 36047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 36059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger 36067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __init__(self, prec=None, rounding=None, 3607abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger traps=None, flags=None, 36080ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger Emin=None, Emax=None, 3609e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger capitals=None, _clamp=0, 3610abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger _ignored_flags=None): 3611abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger if flags is None: 3612abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger flags = [] 3613abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger if _ignored_flags is None: 3614abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger _ignored_flags = [] 3615bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if not isinstance(flags, dict): 361671f3b85497f25bad3b00555173c51378f64edbb5Mark Dickinson flags = dict([(s, int(s in flags)) for s in _signals]) 3617b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger del s 3618bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if traps is not None and not isinstance(traps, dict): 361971f3b85497f25bad3b00555173c51378f64edbb5Mark Dickinson traps = dict([(s, int(s in traps)) for s in _signals]) 3620b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger del s 36217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for name, val in locals().items(): 36227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if val is None: 3623eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettinger setattr(self, name, _copy.copy(getattr(DefaultContext, name))) 36247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 36257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger setattr(self, name, val) 36267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger del self.self 36277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3628b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger def __repr__(self): 3629bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger """Show the current context.""" 3630b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger s = [] 363159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista s.append('Context(prec=%(prec)d, rounding=%(rounding)s, ' 363259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' 363359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista % vars(self)) 363459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista names = [f.__name__ for f, v in self.flags.items() if v] 363559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista s.append('flags=[' + ', '.join(names) + ']') 363659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista names = [t.__name__ for t, v in self.traps.items() if v] 363759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista s.append('traps=[' + ', '.join(names) + ']') 3638b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger return ', '.join(s) + ')' 3639b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger 3640d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger def clear_flags(self): 3641d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger """Reset all flags to zero""" 3642d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger for flag in self.flags: 3643b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger self.flags[flag] = 0 3644d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger 36459fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger def _shallow_copy(self): 36469fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger """Returns a shallow copy from self.""" 3647e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista nc = Context(self.prec, self.rounding, self.traps, 3648e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista self.flags, self.Emin, self.Emax, 3649e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista self.capitals, self._clamp, self._ignored_flags) 36507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return nc 36519fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger 36529fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger def copy(self): 36539fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger """Returns a deep copy from self.""" 365459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista nc = Context(self.prec, self.rounding, self.traps.copy(), 3655e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista self.flags.copy(), self.Emin, self.Emax, 3656e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista self.capitals, self._clamp, self._ignored_flags) 36579fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger return nc 36589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger __copy__ = copy 36597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 36605aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger def _raise_error(self, condition, explanation = None, *args): 36617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Handles an error 36627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 36637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the flag is in _ignored_flags, returns the default response. 36641840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson Otherwise, it sets the flag, then, if the corresponding 36657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger trap_enabler is set, it reaises the exception. Otherwise, it returns 36661840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson the default value after setting the flag. 36677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 36685aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger error = _condition_map.get(condition, condition) 36697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if error in self._ignored_flags: 367059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Don't touch the flag 36717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return error().handle(self, *args) 36727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 36731840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson self.flags[error] = 1 3674bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger if not self.traps[error]: 367559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # The errors define how to handle themselves. 36765aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger return condition().handle(self, *args) 36777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 36787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Errors should only be risked on copies of the context 367959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # self._ignored_flags = [] 36808aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson raise error(explanation) 36817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 36827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _ignore_all_flags(self): 36837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Ignore all flags, if they are raised""" 3684fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger return self._ignore_flags(*_signals) 36857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 36867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _ignore_flags(self, *flags): 36877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Ignore the flags, if they are raised""" 36887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # Do not mutate-- This way, copies of a context leave the original 36897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # alone. 36907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._ignored_flags = (self._ignored_flags + list(flags)) 36917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return list(flags) 36927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 36937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _regard_flags(self, *flags): 36947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Stop ignoring the flags, if they are raised""" 36957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if flags and isinstance(flags[0], (tuple,list)): 36967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger flags = flags[0] 36977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger for flag in flags: 36987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self._ignored_flags.remove(flag) 36997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 370053663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan # We inherit object.__hash__, so we must deny this explicitly 370153663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan __hash__ = None 37025aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger 37037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def Etiny(self): 37047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns Etiny (= Emin - prec + 1)""" 37057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(self.Emin - self.prec + 1) 37067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def Etop(self): 3708e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger """Returns maximum exponent (= Emax - prec + 1)""" 37097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return int(self.Emax - self.prec + 1) 37107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _set_rounding(self, type): 37127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Sets the rounding type. 37137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Sets the rounding type, and returns the current (previous) 37157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding type. Often used like: 37167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context = context.copy() 37187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # so you don't change the calling context 37197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # if an error occurs in the middle. 37207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = context._set_rounding(ROUND_UP) 37217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger val = self.__sub__(other, context=context) 37227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger context._set_rounding(rounding) 37237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This will make it round up for that operation. 37257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 37267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger rounding = self.rounding 37277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.rounding= type 37287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return rounding 37297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3730fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger def create_decimal(self, num='0'): 373159bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson """Creates a new Decimal instance but using self as context. 373259bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson 373359bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson This method implements the to-number operation of the 373459bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson IBM Decimal specification.""" 373559bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson 373659bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson if isinstance(num, basestring) and num != num.strip(): 373759bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson return self._raise_error(ConversionSyntax, 373859bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson "no trailing or leading whitespace is " 373959bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson "permitted.") 374059bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson 37417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger d = Decimal(num, context=self) 3742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if d._isnan() and len(d._int) > self.prec - self._clamp: 3743353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return self._raise_error(ConversionSyntax, 3744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista "diagnostic info too long in NaN") 3745dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return d._fix(self) 37467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 374759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista # Methods 37487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def abs(self, a): 37497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the absolute value of the operand. 37507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the operand is negative, the result is the same as using the minus 375259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista operation on the operand. Otherwise, the result is the same as using 37537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the plus operation on the operand. 37547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('2.1')) 3756abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.1') 37579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('-100')) 3758abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 37599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('101.5')) 3760abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('101.5') 37619ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.abs(Decimal('-101.5')) 3762abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('101.5') 37637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 37647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__abs__(context=self) 37657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def add(self, a, b): 37677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Return the sum of the two operands. 37687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.add(Decimal('12'), Decimal('7.00')) 3770abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('19.00') 37719ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4')) 3772abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.02E+4') 37737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 37747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__add__(b, context=self) 37757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def _apply(self, a): 3777dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger return str(a._fix(self)) 37787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3779353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def canonical(self, a): 3780353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the same Decimal object. 3781353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista As we do not have different encodings for the same number, the 3783353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista received object already is in its canonical form. 3784353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3785353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.canonical(Decimal('2.50')) 3786abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.50') 3787353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.canonical(context=self) 3789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 37907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def compare(self, a, b): 37917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Compares values numerically. 37927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the signs of the operands differ, a value representing each operand 37947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ('-1' if the operand is less than zero, '0' if the operand is zero or 37957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger negative zero, or '1' if the operand is greater than zero) is used in 37967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger place of that operand for the comparison instead of the actual 37977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operand. 37987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 37997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The comparison is then effected by subtracting the second operand from 38007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the first and then returning a value according to the result of the 38017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger subtraction: '-1' if the result is less than zero, '0' if the result is 38027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger zero or negative zero, or '1' if the result is greater than zero. 38037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 38049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3')) 3805abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 38069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1')) 3807abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 38089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10')) 3809abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 38109ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1')) 3811abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 38129ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3')) 3813abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 38149ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1')) 3815abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 38167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 38177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.compare(b, context=self) 38187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_signal(self, a, b): 3820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares the values of the two operands numerically. 3821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista It's pretty much like compare(), but all NaNs signal, with signaling 3823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista NaNs taking precedence over quiet NaNs. 3824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext 3826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.compare_signal(Decimal('2.1'), Decimal('3')) 3827abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 3828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.compare_signal(Decimal('2.1'), Decimal('2.1')) 3829abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 3830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.flags[InvalidOperation] = 0 3831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> print c.flags[InvalidOperation] 3832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 0 3833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.compare_signal(Decimal('NaN'), Decimal('2.1')) 3834abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 3835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> print c.flags[InvalidOperation] 3836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1 3837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.flags[InvalidOperation] = 0 3838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> print c.flags[InvalidOperation] 3839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 0 3840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1')) 3841abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 3842353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> print c.flags[InvalidOperation] 3843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 1 3844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.compare_signal(b, context=self) 3846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_total(self, a, b): 3848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares two operands using their abstract representation. 3849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista This is not like the standard compare, which use their numerical 3851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista value. Note that a total ordering is defined for all possible abstract 3852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista representations. 3853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9')) 3855abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 3856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('-127'), Decimal('12')) 3857abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 3858353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3')) 3859abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 3860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30')) 3861abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 3862353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('12.300')) 3863abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 3864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN')) 3865abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 3866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.compare_total(b) 3868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def compare_total_mag(self, a, b): 3870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares two operands using their abstract representation ignoring sign. 3871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Like compare_total, but with operand's sign ignored and assumed to be 0. 3873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.compare_total_mag(b) 3875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_abs(self, a): 3877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a copy of the operand with the sign set to 0. 3878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_abs(Decimal('2.1')) 3880abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.1') 3881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_abs(Decimal('-100')) 3882abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 3883353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.copy_abs() 3885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3886353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_decimal(self, a): 3887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a copy of the decimal objet. 3888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_decimal(Decimal('2.1')) 3890abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.1') 3891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_decimal(Decimal('-1.00')) 3892abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.00') 3893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 38946c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista return Decimal(a) 3895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_negate(self, a): 3897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a copy of the operand with the sign inverted. 3898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_negate(Decimal('101.5')) 3900abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-101.5') 3901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_negate(Decimal('-101.5')) 3902abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('101.5') 3903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.copy_negate() 3905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def copy_sign(self, a, b): 3907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Copies the second operand's sign to the first one. 3908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista In detail, it returns a copy of the first operand with the sign 3910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista equal to the sign of the second operand. 3911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33')) 3913abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.50') 3914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33')) 3915abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.50') 3916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33')) 3917abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.50') 3918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33')) 3919abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.50') 3920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.copy_sign(b) 3922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 39237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divide(self, a, b): 39247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Decimal division in a specified context. 39257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 39269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1'), Decimal('3')) 3927abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.333333333') 39289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2'), Decimal('3')) 3929abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.666666667') 39309ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('5'), Decimal('2')) 3931abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.5') 39329ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1'), Decimal('10')) 3933abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.1') 39349ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('12'), Decimal('12')) 3935abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 39369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2')) 3937abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('4.00') 39389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0')) 3939abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.20') 39409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1000'), Decimal('100')) 3941abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('10') 39429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('1000'), Decimal('1')) 3943abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1000') 39449ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2')) 3945abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.20E+6') 39467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 39477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__div__(b, context=self) 39487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 39497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divide_int(self, a, b): 39507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Divides two numbers and returns the integer part of the result. 39517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 39529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3')) 3953abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 39549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3')) 3955abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3') 39569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3')) 3957abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3') 39587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 39597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__floordiv__(b, context=self) 39607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 39617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def divmod(self, a, b): 39627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__divmod__(b, context=self) 39637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 3964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def exp(self, a): 3965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns e ** a. 3966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 3968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 3969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 3970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('-Infinity')) 3971abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 3972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('-1')) 3973abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.367879441') 3974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('0')) 3975abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 3976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('1')) 3977abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.71828183') 3978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('0.693147181')) 3979abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.00000000') 3980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.exp(Decimal('+Infinity')) 3981abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('Infinity') 3982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.exp(context=self) 3984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def fma(self, a, b, c): 3986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a multiplied by b, plus c. 3987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The first two operands are multiplied together, using multiply, 3989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista the third operand is then added to the result of that 3990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista multiplication, using add, all with only one final rounding. 3991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 3992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7')) 3993abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('22') 3994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7')) 3995abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-8') 3996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578')) 3997abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.38435736E+12') 3998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 3999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.fma(b, c, context=self) 4000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_canonical(self, a): 40021a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is canonical; otherwise return False. 40031a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista 40041a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista Currently, the encoding of a Decimal instance is always 40051a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista canonical, so this method returns True for any Decimal. 4006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_canonical(Decimal('2.50')) 40081a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 40101a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista return a.is_canonical() 4011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_finite(self, a): 40131a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is finite; otherwise return False. 4014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 40151a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista A Decimal instance is considered finite if it is neither 40161a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista infinite nor a NaN. 4017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_finite(Decimal('2.50')) 40191a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_finite(Decimal('-0.3')) 40211a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_finite(Decimal('0')) 40231a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_finite(Decimal('Inf')) 40251a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_finite(Decimal('NaN')) 40271a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_finite() 4030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_infinite(self, a): 40321a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is infinite; otherwise return False. 4033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_infinite(Decimal('2.50')) 40351a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_infinite(Decimal('-Inf')) 40371a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_infinite(Decimal('NaN')) 40391a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_infinite() 4042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_nan(self, a): 40441a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is a qNaN or sNaN; 40451a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista otherwise return False. 4046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_nan(Decimal('2.50')) 40481a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_nan(Decimal('NaN')) 40501a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_nan(Decimal('-sNaN')) 40521a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_nan() 4055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_normal(self, a): 40571a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is a normal number; 40581a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista otherwise return False. 4059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_normal(Decimal('2.50')) 40641a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_normal(Decimal('0.1E-999')) 40661a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_normal(Decimal('0.00')) 40681a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_normal(Decimal('-Inf')) 40701a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_normal(Decimal('NaN')) 40721a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_normal(context=self) 4075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_qnan(self, a): 40771a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is a quiet NaN; otherwise return False. 4078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_qnan(Decimal('2.50')) 40801a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_qnan(Decimal('NaN')) 40821a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_qnan(Decimal('sNaN')) 40841a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_qnan() 4087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_signed(self, a): 40891a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is negative; otherwise return False. 4090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_signed(Decimal('2.50')) 40921a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_signed(Decimal('-12')) 40941a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_signed(Decimal('-0')) 40961a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_signed() 4099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_snan(self, a): 41011a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is a signaling NaN; 41021a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista otherwise return False. 4103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_snan(Decimal('2.50')) 41051a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_snan(Decimal('NaN')) 41071a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_snan(Decimal('sNaN')) 41091a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_snan() 4112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_subnormal(self, a): 41141a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is subnormal; otherwise return False. 4115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_subnormal(Decimal('2.50')) 41201a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_subnormal(Decimal('0.1E-999')) 41221a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_subnormal(Decimal('0.00')) 41241a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_subnormal(Decimal('-Inf')) 41261a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.is_subnormal(Decimal('NaN')) 41281a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_subnormal(context=self) 4131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def is_zero(self, a): 41331a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista """Return True if the operand is a zero; otherwise return False. 4134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_zero(Decimal('0')) 41361a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_zero(Decimal('2.50')) 41381a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista False 4139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.is_zero(Decimal('-0E+2')) 41401a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista True 4141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.is_zero() 4143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def ln(self, a): 4145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the natural (base e) logarithm of the operand. 4146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.ln(Decimal('0')) 4151abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 4152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.ln(Decimal('1.000')) 4153abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.ln(Decimal('2.71828183')) 4155abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.00000000') 4156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.ln(Decimal('10')) 4157abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.30258509') 4158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.ln(Decimal('+Infinity')) 4159abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('Infinity') 4160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.ln(context=self) 4162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def log10(self, a): 4164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the base 10 logarithm of the operand. 4165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('0')) 4170abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 4171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('0.001')) 4172abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-3') 4173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('1.000')) 4174abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('2')) 4176abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.301029996') 4177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('10')) 4178abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('70')) 4180abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.84509804') 4181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.log10(Decimal('+Infinity')) 4182abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('Infinity') 4183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.log10(context=self) 4185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logb(self, a): 4187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ Returns the exponent of the magnitude of the operand's MSD. 4188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result is the integer which is the exponent of the magnitude 4190353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista of the most significant digit of the operand (as though the 4191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista operand were truncated to a single digit while maintaining the 4192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista value of that digit and without limiting the resulting exponent). 4193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logb(Decimal('250')) 4195abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2') 4196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logb(Decimal('2.50')) 4197abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logb(Decimal('0.03')) 4199abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-2') 4200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logb(Decimal('0')) 4201abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 4202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.logb(context=self) 4204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_and(self, a, b): 4206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies the logical operation 'and' between each operand's digits. 4207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The operands must be both logical numbers. 4209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0')) 4211abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1')) 4213abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0')) 4215abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1')) 4217abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010')) 4219abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1000') 4220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10')) 4221abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('10') 4222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.logical_and(b, context=self) 4224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_invert(self, a): 4226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Invert all the digits in the operand. 4227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The operand must be a logical number. 4229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_invert(Decimal('0')) 4231abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('111111111') 4232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_invert(Decimal('1')) 4233abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('111111110') 4234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_invert(Decimal('111111111')) 4235abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_invert(Decimal('101010101')) 4237abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('10101010') 4238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.logical_invert(context=self) 4240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_or(self, a, b): 4242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies the logical operation 'or' between each operand's digits. 4243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The operands must be both logical numbers. 4245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0')) 4247abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1')) 4249abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0')) 4251abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1')) 4253abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010')) 4255abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1110') 4256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10')) 4257abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1110') 4258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.logical_or(b, context=self) 4260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def logical_xor(self, a, b): 4262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Applies the logical operation 'xor' between each operand's digits. 4263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The operands must be both logical numbers. 4265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0')) 4267abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1')) 4269abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0')) 4271abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1')) 4273abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010')) 4275abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('110') 4276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10')) 4277abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1101') 4278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.logical_xor(b, context=self) 4280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 42817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def max(self, a,b): 42827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """max compares two values numerically and returns the maximum. 42837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 42847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If either operand is a NaN then the general rules apply. 4285c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling Otherwise, the operands are compared as though by the compare 428659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista operation. If they are numerically equal then the left-hand operand 428759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista is chosen as the result. Otherwise the maximum (closer to positive 42887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger infinity) of the two operands is chosen as the result. 42897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 42909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('3'), Decimal('2')) 4291abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3') 42929ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('-10'), Decimal('3')) 4293abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3') 42949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.max(Decimal('1.0'), Decimal('1')) 4295abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4296d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger >>> ExtendedContext.max(Decimal('7'), Decimal('NaN')) 4297abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7') 42987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 42997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.max(b, context=self) 43007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def max_mag(self, a, b): 4302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares the values numerically with their sign ignored.""" 4303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.max_mag(b, context=self) 4304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 43057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def min(self, a,b): 43067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """min compares two values numerically and returns the minimum. 43077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 43087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If either operand is a NaN then the general rules apply. 4309c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling Otherwise, the operands are compared as though by the compare 431059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista operation. If they are numerically equal then the left-hand operand 431159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista is chosen as the result. Otherwise the minimum (closer to negative 43127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger infinity) of the two operands is chosen as the result. 43137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 43149ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('3'), Decimal('2')) 4315abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2') 43169ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('-10'), Decimal('3')) 4317abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-10') 43189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.min(Decimal('1.0'), Decimal('1')) 4319abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0') 4320d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger >>> ExtendedContext.min(Decimal('7'), Decimal('NaN')) 4321abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7') 43227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 43237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.min(b, context=self) 43247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def min_mag(self, a, b): 4326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compares the values numerically with their sign ignored.""" 4327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.min_mag(b, context=self) 4328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 43297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def minus(self, a): 43307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Minus corresponds to unary prefix minus in Python. 43317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 43327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is evaluated using the same rules as subtract; the 43337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation minus(a) is calculated as subtract('0', a) where the '0' 43347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger has the same exponent as the operand. 43357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 43369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.minus(Decimal('1.3')) 4337abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.3') 43389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.minus(Decimal('-1.3')) 4339abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.3') 43407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 43417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__neg__(context=self) 43427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 43437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def multiply(self, a, b): 43447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """multiply multiplies two operands. 43457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4346cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis If either operand is a special value then the general rules apply. 4347cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis Otherwise, the operands are multiplied together ('long multiplication'), 4348cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis resulting in a number which may be as long as the sum of the lengths 4349cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis of the two operands. 43507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 43519ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3')) 4352abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3.60') 43539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('7'), Decimal('3')) 4354abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('21') 43559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8')) 4356abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.72') 43579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0')) 4358abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0.0') 43599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321')) 4360abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('4.28135971E+11') 43617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 43627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__mul__(b, context=self) 43637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4364353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_minus(self, a): 4365353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the largest representable number smaller than a. 4366353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4369353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4370353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.next_minus(Decimal('1')) 4371abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.999999999') 4372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_minus(Decimal('1E-1007')) 4373abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0E-1007') 4374353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.next_minus(Decimal('-1.00000003')) 4375abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.00000004') 4376353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_minus(Decimal('Infinity')) 4377abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('9.99999999E+999') 4378353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4379353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.next_minus(context=self) 4380353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4381353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_plus(self, a): 4382353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the smallest representable number larger than a. 4383353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4384353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4385353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4386353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4387353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.next_plus(Decimal('1')) 4388abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.00000001') 4389353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_plus(Decimal('-1E-1007')) 4390abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0E-1007') 4391353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.next_plus(Decimal('-1.00000003')) 4392abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.00000002') 4393353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_plus(Decimal('-Infinity')) 4394abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-9.99999999E+999') 4395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4396353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.next_plus(context=self) 4397353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def next_toward(self, a, b): 4399353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the number closest to a, in direction towards b. 4400353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result is the closest representable number from the first 4402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista operand (but not the first operand) that is in the direction 4403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista towards the second operand, unless the operands have the same 4404353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista value. 4405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4408353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('1'), Decimal('2')) 4410abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.00000001') 4411353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('-1E-1007'), Decimal('1')) 4412abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0E-1007') 4413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('-1.00000003'), Decimal('0')) 4414abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.00000002') 4415353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('1'), Decimal('0')) 4416abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.999999999') 4417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('1E-1007'), Decimal('-100')) 4418abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0E-1007') 4419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10')) 4420abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.00000004') 4421353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000')) 4422abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0.00') 4423353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.next_toward(b, context=self) 4425353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 44267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def normalize(self, a): 4427e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger """normalize reduces an operand to its simplest form. 44287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 44297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Essentially a plus operation with all trailing zeros removed from the 44307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger result. 44317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 44329ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('2.1')) 4433abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.1') 44349ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('-2.0')) 4435abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-2') 44369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('1.200')) 4437abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.2') 44389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('-120')) 4439abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.2E+2') 44409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('120.00')) 4441abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.2E+2') 44429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.normalize(Decimal('0.00')) 4443abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 44447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 44457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.normalize(context=self) 44467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def number_class(self, a): 4448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns an indication of the class of the operand. 4449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The class is one of the following strings: 4451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -sNaN 4452353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -NaN 4453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Infinity 4454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Normal 4455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Subnormal 4456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista -Zero 4457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Zero 4458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Subnormal 4459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Normal 4460353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista +Infinity 4461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4462353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = Context(ExtendedContext) 4463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('Infinity')) 4466353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '+Infinity' 4467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('1E-10')) 4468353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '+Normal' 4469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('2.50')) 4470353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '+Normal' 4471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('0.1E-999')) 4472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '+Subnormal' 4473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('0')) 4474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '+Zero' 4475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-0')) 4476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '-Zero' 4477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-0.1E-999')) 4478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '-Subnormal' 4479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-1E-10')) 4480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '-Normal' 4481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-2.50')) 4482353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '-Normal' 4483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-Infinity')) 4484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '-Infinity' 4485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('NaN')) 4486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'NaN' 4487353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('-NaN')) 4488353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'NaN' 4489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.number_class(Decimal('sNaN')) 4490353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'sNaN' 4491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4492353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.number_class(context=self) 4493353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 44947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def plus(self, a): 44957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Plus corresponds to unary prefix plus in Python. 44967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 44977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is evaluated using the same rules as add; the 44987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger operation plus(a) is calculated as add('0', a) where the '0' 44997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger has the same exponent as the operand. 45007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.plus(Decimal('1.3')) 4502abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.3') 45039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.plus(Decimal('-1.3')) 4504abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1.3') 45057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 45067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__pos__(context=self) 45077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def power(self, a, b, modulo=None): 45097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Raises a to the power of b, to modulo if given. 45107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4511353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista With two arguments, compute a**b. If a is negative then b 4512353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista must be integral. The result will be inexact unless b is 4513353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista integral and the result is finite and can be expressed exactly 4514353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista in 'precision' digits. 4515353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4516353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista With three arguments, compute (a**b) % modulo. For the 4517353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista three argument form, the following restrictions on the 4518353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista arguments hold: 4519353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4520353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - all three arguments must be integral 4521353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - b must be nonnegative 4522353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - at least one of a or b must be nonzero 4523353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista - modulo must be nonzero and have at most 'precision' digits 4524353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4525353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The result of pow(a, b, modulo) is identical to the result 4526353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista that would be obtained by computing (a**b) % modulo with 4527353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista unbounded precision, but is computed more efficiently. It is 4528353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista always exact. 4529353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4530353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c = ExtendedContext.copy() 4531353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emin = -999 4532353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.Emax = 999 4533353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('2'), Decimal('3')) 4534abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('8') 4535353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-2'), Decimal('3')) 4536abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-8') 4537353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('2'), Decimal('-3')) 4538abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.125') 4539353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('1.7'), Decimal('8')) 4540abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('69.7575744') 4541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('10'), Decimal('0.301029996')) 4542abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.00000000') 4543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('Infinity'), Decimal('-1')) 4544abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('Infinity'), Decimal('0')) 4546abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4547353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('Infinity'), Decimal('1')) 4548abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('Infinity') 4549353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-Infinity'), Decimal('-1')) 4550abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0') 4551353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-Infinity'), Decimal('0')) 4552abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4553353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-Infinity'), Decimal('1')) 4554abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 4555353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-Infinity'), Decimal('2')) 4556abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('Infinity') 4557353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('0'), Decimal('0')) 4558abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 4559353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4560353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('3'), Decimal('7'), Decimal('16')) 4561abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('11') 4562353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16')) 4563abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-11') 4564353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16')) 4565abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 4566353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16')) 4567abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('11') 4568353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789')) 4569abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('11729830') 4570353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729')) 4571abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0') 4572353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537')) 4573abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 45747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 45757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__pow__(b, modulo, context=self) 45767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def quantize(self, a, b): 457859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista """Returns a value equal to 'a' (rounded), having the exponent of 'b'. 45797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The coefficient of the result is derived from that of the left-hand 458159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista operand. It may be rounded using the current rounding setting (if the 45827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger exponent is being increased), multiplied by a positive power of ten (if 45837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger the exponent is being decreased), or is unchanged (if the exponent is 45847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger already equal to that of the right-hand operand). 45857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Unlike other operations, if the length of the coefficient after the 45877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger quantize operation would be greater than precision then an Invalid 458859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista operation condition is raised. This guarantees that, unless there is 458959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista an error condition, the exponent of the result of a quantize is always 45907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger equal to that of the right-hand operand. 45917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Also unlike other operations, quantize will never raise Underflow, even 45937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if the result is subnormal and inexact. 45947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 45959ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001')) 4596abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.170') 45979ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01')) 4598abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.17') 45999ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1')) 4600abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.2') 46019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0')) 4602abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2') 46039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1')) 4604abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0E+1') 46059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity')) 4606abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 46079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity')) 4608abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 46099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1')) 4610abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0') 46119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5')) 4612abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0E+5') 46139ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2')) 4614abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 46159ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2')) 4616abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('NaN') 46179ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1')) 4618abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('217.0') 46199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0')) 4620abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('217') 46219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1')) 4622abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.2E+2') 46239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2')) 4624abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2E+2') 46257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 46267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.quantize(b, context=self) 46277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4628353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def radix(self): 4629353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Just returns 10, as this is Decimal, :) 4630353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4631353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.radix() 4632abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('10') 4633353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4634353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return Decimal(10) 4635353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 46367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder(self, a, b): 46377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns the remainder from integer division. 46387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result is the residue of the dividend after the operation of 464059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista calculating integer division as described for divide-integer, rounded 46410d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz to precision digits if necessary. The sign of the result, if 464259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista non-zero, is the same as that of the original dividend. 46437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This operation will fail under the same conditions as integer division 46457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (that is, if integer division on the same two operands would fail, the 46467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger remainder cannot be calculated). 46477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3')) 4649abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.1') 46509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10'), Decimal('3')) 4651abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 46529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3')) 4653abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 46549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1')) 4655abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.2') 46569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3')) 4657abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.1') 46589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3')) 4659abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0') 46607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 46617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__mod__(b, context=self) 46627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def remainder_near(self, a, b): 46647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns to be "a - b * n", where n is the integer nearest the exact 46657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger value of "x / b" (if two integers are equally near then the even one 466659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista is chosen). If the result is equal to 0 then its sign will be the 46677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger sign of a. 46687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger This operation will fail under the same conditions as integer division 46707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger (that is, if integer division on the same two operands would fail, the 46717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger remainder cannot be calculated). 46727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 46739ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3')) 4674abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0.9') 46759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6')) 4676abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-2') 46779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3')) 4678abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 46799ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3')) 4680abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-1') 46819ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1')) 4682abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.2') 46839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3')) 4684abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.1') 46859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3')) 4686abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0.3') 46877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 46887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.remainder_near(b, context=self) 46897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4690353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def rotate(self, a, b): 4691353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a rotated copy of a, b times. 4692353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4693353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The coefficient of the result is a rotated copy of the digits in 4694353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista the coefficient of the first operand. The number of places of 4695353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rotation is taken from the absolute value of the second operand, 4696353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista with the rotation being to the left if the second operand is 4697353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista positive or to the right otherwise. 4698353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.rotate(Decimal('34'), Decimal('8')) 4700abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('400000003') 4701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.rotate(Decimal('12'), Decimal('9')) 4702abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('12') 4703353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2')) 4704abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('891234567') 4705353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0')) 4706abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('123456789') 4707353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2')) 4708abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('345678912') 4709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4710353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.rotate(b, context=self) 4711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 47127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def same_quantum(self, a, b): 47137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Returns True if the two operands have the same exponent. 47147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The result is never affected by either the sign or the coefficient of 47167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger either operand. 47177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001')) 47197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger False 47209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01')) 47217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger True 47229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1')) 47237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger False 47249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf')) 47257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger True 47267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 47277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.same_quantum(b) 47287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4729353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def scaleb (self, a, b): 4730353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns the first operand after adding the second value its exp. 4731353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4732353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2')) 4733abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.0750') 4734353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0')) 4735abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7.50') 4736353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3')) 4737abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7.50E+3') 4738353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4739353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.scaleb (b, context=self) 4740353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4741353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def shift(self, a, b): 4742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Returns a shifted copy of a, b times. 4743353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista The coefficient of the result is a shifted copy of the digits 4745353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista in the coefficient of the first operand. The number of places 4746353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista to shift is taken from the absolute value of the second operand, 4747353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista with the shift being to the left if the second operand is 4748353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista positive or to the right otherwise. Digits shifted into the 4749353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coefficient are zeros. 4750353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4751353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.shift(Decimal('34'), Decimal('8')) 4752abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('400000000') 4753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.shift(Decimal('12'), Decimal('9')) 4754abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 4755353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2')) 4756abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1234567') 4757353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0')) 4758abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('123456789') 4759353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2')) 4760abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('345678900') 4761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.shift(b, context=self) 4763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 47647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def sqrt(self, a): 476559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista """Square root of a non-negative number to context precision. 47667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger If the result must be inexact, it is rounded using the round-half-even 47687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger algorithm. 47697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('0')) 4771abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0') 47729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('-0')) 4773abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0') 47749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('0.39')) 4775abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.624499800') 47769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('100')) 4777abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('10') 47789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1')) 4779abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1') 47809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1.0')) 4781abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0') 47829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('1.00')) 4783abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0') 47849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('7')) 4785abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2.64575131') 47869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.sqrt(Decimal('10')) 4787abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('3.16227766') 47889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.prec 47896ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger 9 47907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 47917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.sqrt(context=self) 47927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def subtract(self, a, b): 4794f33d01d304c349a7f555779c7c99930f1203adb7Georg Brandl """Return the difference between the two operands. 47957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 47969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07')) 4797abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.23') 47989ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30')) 4799abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('0.00') 48009ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07')) 4801abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-0.77') 48027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 48037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__sub__(b, context=self) 48047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_eng_string(self, a): 48067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts a number to a string, using scientific notation. 48077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is not affected by the context. 48097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 48107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.to_eng_string(context=self) 48117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def to_sci_string(self, a): 48137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Converts a number to a string, using scientific notation. 48147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger The operation is not affected by the context. 48167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 48177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return a.__str__(context=self) 48187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def to_integral_exact(self, a): 4820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Rounds to an integer. 4821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista When the operand has a negative exponent, the result is the same 4823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista as using the quantize() operation using the given operand as the 4824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista left-hand-operand, 1E+0 as the right-hand-operand, and the precision 4825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista of the operand as the precision setting; Inexact and Rounded flags 4826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista are allowed in this operation. The rounding mode is taken from the 4827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista context. 4828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('2.1')) 4830abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2') 4831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('100')) 4832abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 4833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('100.0')) 4834abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 4835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('101.5')) 4836abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('102') 4837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('-101.5')) 4838abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-102') 4839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('10E+5')) 4840abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0E+6') 4841353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77')) 4842abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7.89E+77') 4843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_exact(Decimal('-Inf')) 4844abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 4845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.to_integral_exact(context=self) 4847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista def to_integral_value(self, a): 48497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Rounds to an integer. 48507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger When the operand has a negative exponent, the result is the same 48527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger as using the quantize() operation using the given operand as the 48537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger left-hand-operand, 1E+0 as the right-hand-operand, and the precision 48547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger of the operand as the precision setting, except that no flags will 485559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista be set. The rounding mode is taken from the context. 48567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('2.1')) 4858abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('2') 4859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('100')) 4860abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 4861353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('100.0')) 4862abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('100') 4863353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('101.5')) 4864abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('102') 4865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('-101.5')) 4866abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-102') 4867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('10E+5')) 4868abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('1.0E+6') 4869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('7.89E+77')) 4870abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('7.89E+77') 4871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista >>> ExtendedContext.to_integral_value(Decimal('-Inf')) 4872abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger Decimal('-Infinity') 48737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 4874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a.to_integral_value(context=self) 4875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the method name changed, but we provide also the old one, for compatibility 4877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista to_integral = to_integral_value 48787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass _WorkRep(object): 48807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __slots__ = ('sign','int','exp') 488117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger # sign: 0 or 1 4882636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger # int: int or long 48837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger # exp: None, int, or string 48847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 48857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __init__(self, value=None): 48867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger if value is None: 48877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.sign = None 4888636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger self.int = 0 48897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = None 489017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger elif isinstance(value, Decimal): 489117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger self.sign = value._sign 489272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista self.int = int(value._int) 48937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = value._exp 489417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger else: 489517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger # assert isinstance(value, tuple) 48967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.sign = value[0] 48977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.int = value[1] 48987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger self.exp = value[2] 48997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger def __repr__(self): 49017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return "(%r, %r, %r)" % (self.sign, self.int, self.exp) 49027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger __str__ = __repr__ 49047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4907e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batistadef _normalize(op1, op2, prec = 0): 49087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """Normalizes op1, op2 to have the same exp and length of coefficient. 49097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 49107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger Done during addition. 49117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger """ 4912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if op1.exp < op2.exp: 49137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = op2 49147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = op1 49157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger else: 49167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger tmp = op1 49177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger other = op2 49187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1). 4920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Then adding 10**exp to tmp has the same effect (after rounding) 4921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # as adding any positive quantity smaller than 10**exp; similarly 4922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # for subtraction. So if other is smaller than 10**exp we replace 4923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # it with 10**exp. This avoids tmp.exp - other.exp getting too large. 4924e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista tmp_len = len(str(tmp.int)) 4925e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista other_len = len(str(other.int)) 4926e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista exp = tmp.exp + min(-1, tmp_len - prec - 2) 4927e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista if other_len + other.exp - 1 < exp: 4928e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista other.int = 1 4929e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista other.exp = exp 4930636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 4931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista tmp.int *= 10 ** (tmp.exp - other.exp) 4932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista tmp.exp = other.exp 49337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger return op1, op2 49347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 4935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista##### Integer arithmetic functions used by ln, log10, exp and __pow__ ##### 4936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# This function from Tim Peters was taken from here: 4938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# http://mail.python.org/pipermail/python-list/1999-July/007758.html 4939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# The correction being in the function definition is for speed, and 4940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# the whole function is not resolved with math.log because of avoiding 4941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# the use of floats. 4942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _nbits(n, correction = { 4943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '0': 4, '1': 3, '2': 2, '3': 2, 4944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '4': 1, '5': 1, '6': 1, '7': 1, 4945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '8': 0, '9': 0, 'a': 0, 'b': 0, 4946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 'c': 0, 'd': 0, 'e': 0, 'f': 0}): 4947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Number of bits in binary representation of the positive integer n, 4948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista or 0 if n == 0. 4949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if n < 0: 4951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista raise ValueError("The argument to _nbits should be nonnegative.") 4952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista hex_n = "%x" % n 4953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return 4*len(hex_n) - correction[hex_n[0]] 4954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _sqrt_nearest(n, a): 4956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Closest integer to the square root of the positive integer n. a is 4957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista an initial approximation to the square root. Any positive integer 4958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista will do for a, but the closer a is to the square root of n the 4959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista faster convergence will be. 4960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if n <= 0 or a <= 0: 4963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista raise ValueError("Both arguments to _sqrt_nearest should be positive.") 4964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista b=0 4966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while a != b: 4967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista b, a = a, a--n//a>>1 4968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return a 4969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _rshift_nearest(x, shift): 4971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Given an integer x and a nonnegative integer shift, return closest 4972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista integer to x / 2**shift; use round-to-even in case of a tie. 4973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista b, q = 1L << shift, x >> shift 4976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return q + (2*(x & (b-1)) + (q&1) > b) 4977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _div_nearest(a, b): 4979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Closest integer to a/b, a and b positive integers; rounds to even 4980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista in the case of a tie. 4981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 4983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q, r = divmod(a, b) 4984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return q + (2*r + (q&1) > b) 4985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _ilog(x, M, L = 8): 4987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Integer approximation to M*log(x/M), with absolute error boundable 4988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista in terms only of x/M. 4989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Given positive integers x and M, return an integer approximation to 4991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference 4992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista between the approximation and the exact result is at most 22. For 4993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In 4994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista both cases these are upper bounds on the error; it will usually be 4995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista much smaller.""" 4996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 4997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # The basic algorithm is the following: let log1p be the function 4998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use 4999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # the reduction 5000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log1p(y) = 2*log1p(y/(1+sqrt(1+y))) 5002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # repeatedly until the argument to log1p is small (< 2**-L in 5004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # absolute value). For small y we can use the Taylor series 5005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expansion 5006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T 5008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # truncating at T such that y**T is small enough. The whole 5010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # computation is carried out in a form of fixed-point arithmetic, 5011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # with a real number z being represented by an integer 5012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # approximation to z*M. To avoid loss of precision, the y below 5013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # is actually an integer approximation to 2**R*y*M, where R is the 5014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # number of reductions performed so far. 5015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = x-M 5017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # argument reduction; R = number of reductions performed 5018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista R = 0 5019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista while (R <= L and long(abs(y)) << L-R >= M or 5020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista R > L and abs(y) >> R-L >= M): 5021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _div_nearest(long(M*y) << 1, 5022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M)) 5023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista R += 1 5024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Taylor series with T terms 5026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista T = -int(-10*len(str(M))//(3*L)) 5027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista yshift = _rshift_nearest(y, R) 5028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista w = _div_nearest(M, T) 5029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista for k in xrange(T-1, 0, -1): 5030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista w = _div_nearest(M, k) - _div_nearest(yshift*w, M) 5031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return _div_nearest(w*y, M) 5033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dlog10(c, e, p): 5035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Given integers c, e and p with c > 0, p >= 0, compute an integer 5036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista approximation to 10**p * log10(c*10**e), with an absolute error of 5037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista at most 1. Assumes that c*10**e is not exactly 1.""" 5038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # increase precision by 2; compensate for this by dividing 5040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # final result by 100 5041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p += 2 5042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # write c*10**e as d*10**f with either: 5044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # f >= 0 and 1 <= d <= 10, or 5045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # f <= 0 and 0.1 <= d <= 1. 5046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Thus for c*10**e close to 1, f = 0 5047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista l = len(str(c)) 5048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista f = e+l - (e+l >= 1) 5049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if p > 0: 5051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista M = 10**p 5052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista k = e+p-f 5053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if k >= 0: 5054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c *= 10**k 5055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = _div_nearest(c, 10**-k) 5057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_d = _ilog(c, M) # error < 5 + 22 = 27 5059be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista log_10 = _log10_digits(p) # error < 1 5060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_d = _div_nearest(log_d*M, log_10) 5061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_tenpower = f*M # exact 5062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_d = 0 # error < 2.31 5064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_tenpower = div_nearest(f, 10**-p) # error < 0.5 5065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return _div_nearest(log_tenpower+log_d, 100) 5067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dlog(c, e, p): 5069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Given integers c, e and p with c > 0, compute an integer 5070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista approximation to 10**p * log(c*10**e), with an absolute error of 5071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista at most 1. Assumes that c*10**e is not exactly 1.""" 5072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Increase precision by 2. The precision increase is compensated 5074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # for at the end with a division by 100. 5075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p += 2 5076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10, 5078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e) 5079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # as 10**p * log(d) + 10**p*f * log(10). 5080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista l = len(str(c)) 5081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista f = e+l - (e+l >= 1) 5082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute approximation to 10**p*log(d), with error < 27 5084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if p > 0: 5085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista k = e+p-f 5086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if k >= 0: 5087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c *= 10**k 5088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista c = _div_nearest(c, 10**-k) # error of <= 0.5 in c 5090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # _ilog magnifies existing error in c by a factor of at most 10 5092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_d = _ilog(c, 10**p) # error < 5 + 22 = 27 5093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # p <= 0: just approximate the whole thing by 0; error < 2.31 5095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista log_d = 0 5096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5097be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # compute approximation to f*10**p*log(10), with error < 11. 5098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if f: 5099be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista extra = len(str(abs(f)))-1 5100be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista if p + extra >= 0: 5101be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # error in f * _log10_digits(p+extra) < |f| * 1 = |f| 5102be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11 5103be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra) 5104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista f_log_ten = 0 5106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista f_log_ten = 0 5108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5109be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1 5110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return _div_nearest(f_log_ten + log_d, 100) 5111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5112be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batistaclass _Log10Memoize(object): 5113be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista """Class to compute, store, and allow retrieval of, digits of the 5114be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista constant log(10) = 2.302585.... This constant is needed by 5115be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__.""" 5116be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista def __init__(self): 5117be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista self.digits = "23025850929940456840179914546843642076011014886" 5118be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista 5119be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista def getdigits(self, p): 5120be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista """Given an integer p >= 0, return floor(10**p)*log(10). 5121be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista 5122be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista For example, self.getdigits(3) returns 2302. 5123be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista """ 5124be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # digits are stored as a string, for quick conversion to 5125be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # integer in the case that we've already computed enough 5126be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # digits; the stored digits should always be correct 5127be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # (truncated, not rounded to nearest). 5128be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista if p < 0: 5129be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista raise ValueError("p should be nonnegative") 5130be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista 5131be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista if p >= len(self.digits): 5132be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # compute p+3, p+6, p+9, ... digits; continue until at 5133be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # least one of the extra digits is nonzero 5134be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista extra = 3 5135be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista while True: 5136be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # compute p+extra digits, correct to within 1ulp 5137be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista M = 10**(p+extra+2) 5138be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista digits = str(_div_nearest(_ilog(10*M, M), 100)) 5139be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista if digits[-extra:] != '0'*extra: 5140be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista break 5141be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista extra += 3 5142be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # keep all reliable digits so far; remove trailing zeros 5143be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # and next nonzero digit 5144be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista self.digits = digits.rstrip('0')[:-1] 5145be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista return int(self.digits[:p+1]) 5146be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista 5147be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista_log10_digits = _Log10Memoize().getdigits 5148be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista 5149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _iexp(x, M, L=8): 5150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Given integers x and M, M > 0, such that x/M is small in absolute 5151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista value, compute an integer approximation to M*exp(x/M). For 0 <= 5152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista x/M <= 2.4, the absolute error in the result is bounded by 60 (and 5153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista is usually much smaller).""" 5154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Algorithm: to compute exp(z) for a real number z, first divide z 5156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then 5157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor 5158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # series 5159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expm1(x) = x + x**2/2! + x**3/3! + ... 5161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Now use the identity 5163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expm1(2x) = expm1(x)*(expm1(x)+2) 5165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # 5166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # R times to compute the sequence expm1(z/2**R), 5167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # expm1(z/2**(R-1)), ... , exp(z/2), exp(z). 5168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Find R such that x/2**R/M <= 2**-L 5170353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista R = _nbits((long(x)<<L)//M) 5171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Taylor series. (2**L)**T > M 5173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista T = -int(-10*len(str(M))//(3*L)) 5174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _div_nearest(x, T) 5175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Mshift = long(M)<<R 5176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista for i in xrange(T-1, 0, -1): 5177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _div_nearest(x*(Mshift + y), Mshift * i) 5178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Expansion 5180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista for k in xrange(R-1, -1, -1): 5181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista Mshift = long(M)<<(k+2) 5182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = _div_nearest(y*(y+Mshift), Mshift) 5183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return M+y 5185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dexp(c, e, p): 5187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compute an approximation to exp(c*10**e), with p decimal places of 5188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista precision. 5189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5190be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista Returns integers d, f such that: 5191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 10**(p-1) <= d <= 10**p, and 5193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (d-1)*10**f < exp(c*10**e) < (d+1)*10**f 5194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista In other words, d*10**f is an approximation to exp(c*10**e) with p 5196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista digits of precision, and with an error in d of at most 1. This is 5197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista almost, but not quite, the same as the error being < 1ulp: when d 5198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista = 10**(p-1) the error could be up to 10 ulp.""" 5199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision 5201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista p += 2 5202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5203be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # compute log(10) with extra precision = adjusted exponent of c*10**e 5204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista extra = max(0, e + len(str(c)) - 1) 5205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista q = p + extra 5206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5207be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q), 5208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # rounding down 5209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista shift = e+q 5210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if shift >= 0: 5211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista cshift = c*10**shift 5212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista cshift = c//10**-shift 5214be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista quot, rem = divmod(cshift, _log10_digits(q)) 5215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # reduce remainder back to original precision 5217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista rem = _div_nearest(rem, 10**extra) 5218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # error in result of _iexp < 120; error after division < 0.62 5220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3 5221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dpower(xc, xe, yc, ye, p): 5223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and 5224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that: 5225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 10**(p-1) <= c <= 10**p, and 5227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista (c-1)*10**e < x**y < (c+1)*10**e 5228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista in other words, c*10**e is an approximation to x**y with p digits 5230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista of precision, and with an error in c of at most 1. (This is 5231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista almost, but not quite, the same as the error being < 1ulp: when c 5232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista == 10**(p-1) we can only guarantee error < 10ulp.) 5233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista We assume that: x is positive and not equal to 1, and y is nonzero. 5235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """ 5236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # Find b such that 10**(b-1) <= |y| <= 10**b 5238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista b = len(str(abs(yc))) + ye 5239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point 5241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista lxc = _dlog(xc, xe, p+b+1) 5242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1) 5244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista shift = ye-b 5245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if shift >= 0: 5246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista pc = lxc*yc*10**shift 5247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista pc = _div_nearest(lxc*yc, 10**-shift) 5249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if pc == 0: 5251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # we prefer a result that isn't exactly 1; this makes it 5252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista # easier to compute a correctly rounded result in __pow__ 5253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1: 5254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff, exp = 10**(p-1)+1, 1-p 5255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff, exp = 10**p-1, -p 5257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista else: 5258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff, exp = _dexp(pc, -(p+1), p+1) 5259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista coeff = _div_nearest(coeff, 10) 5260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista exp += 1 5261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return coeff, exp 5263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 5264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _log10_lb(c, correction = { 5265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '1': 100, '2': 70, '3': 53, '4': 40, '5': 31, 5266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista '6': 23, '7': 16, '8': 10, '9': 5}): 5267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista """Compute a lower bound for 100*log10(c) for a positive integer c.""" 5268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if c <= 0: 5269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista raise ValueError("The argument to _log10_lb should be nonnegative.") 5270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista str_c = str(c) 5271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista return 100*len(str_c) - correction[str_c[0]] 5272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista 527359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Helper Functions #################################################### 52747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 5275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _convert_other(other, raiseit=False): 5276636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger """Convert other to Decimal. 5277636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 5278636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger Verifies that it's ok to use in an implicit construction. 5279636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger """ 5280636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(other, Decimal): 5281636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return other 5282636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger if isinstance(other, (int, long)): 5283636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger return Decimal(other) 5284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista if raiseit: 5285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista raise TypeError("Unable to convert %s to Decimal" % other) 5286267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger return NotImplemented 5287636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger 528859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Setup Specific Contexts ############################################ 52897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 52907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# The default context prototype used by Context() 5291fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger# Is mutable, so that new contexts can have different default values 52927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 52937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDefaultContext = Context( 52946ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger prec=28, rounding=ROUND_HALF_EVEN, 5295bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[DivisionByZero, Overflow, InvalidOperation], 5296bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 529799148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger Emax=999999999, 529899148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger Emin=-999999999, 5299e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger capitals=1 53007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 53017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Pre-made alternate contexts offered by the specification 53037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Don't change these; the user should be able to select these 53047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# contexts and be able to reproduce results from other implementations 53057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# of the spec. 53067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerBasicContext = Context( 53087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger prec=9, rounding=ROUND_HALF_UP, 5309bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow], 5310bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 53117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 53127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53139ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerExtendedContext = Context( 53146ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger prec=9, rounding=ROUND_HALF_EVEN, 5315bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger traps=[], 5316bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger flags=[], 53177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger) 53187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 532059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### crud for parsing strings ############################################# 53216a123cb7827859748a0096570dfbb5ceba0e59dcMark Dickinson# 532272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Regular expression used for parsing numeric strings. Additional 532372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# comments: 532472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 532572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 1. Uncomment the two '\s*' lines to allow leading and/or trailing 532672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# whitespace. But note that the specification disallows whitespace in 532772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# a numeric string. 532872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 532972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 2. For finite numbers (not infinities and NaNs) the body of the 533072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# number between the optional sign and the optional exponent must have 533172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# at least one decimal digit, possibly after the decimal point. The 533272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# lookahead expression '(?=\d|\.\d)' checks this. 533372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 533472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# As the flag UNICODE is not enabled here, we're explicitly avoiding any 533572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# other meaning for \d than the numbers [0-9]. 53367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 533772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batistaimport re 533870c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson_parser = re.compile(r""" # A numeric string consists of: 53397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# \s* 534070c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson (?P<sign>[-+])? # an optional sign, followed by either... 53417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ( 534270c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson (?=[0-9]|\.[0-9]) # ...a number (with at least one digit) 534370c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson (?P<int>[0-9]*) # having a (possibly empty) integer part 534470c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson (\.(?P<frac>[0-9]*))? # followed by an optional fractional part 534570c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson (E(?P<exp>[-+]?[0-9]+))? # followed by an optional exponent, or... 53467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger | 534770c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson Inf(inity)? # ...an infinity, or... 534872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista | 534970c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson (?P<signal>s)? # ...an (optionally signaling) 535070c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson NaN # NaN 535170c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson (?P<diag>[0-9]*) # with (possibly empty) diagnostic info. 53527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger ) 53537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# \s* 535459bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson \Z 535572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista""", re.VERBOSE | re.IGNORECASE).match 53567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53572ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista_all_zeros = re.compile('0*$').match 53582ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista_exact_half = re.compile('50*$').match 53591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 53601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson##### PEP3101 support functions ############################################## 53611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# The functions parse_format_specifier and format_align have little to do 53621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# with the Decimal class, and could potentially be reused for other pure 53631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# Python numeric classes that want to implement __format__ 53641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# 53651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# A format specifier for Decimal looks like: 53661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# 53671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# [[fill]align][sign][0][minimumwidth][.precision][type] 53681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# 53691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 53701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson_parse_format_specifier_regex = re.compile(r"""\A 53711ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?: 53721ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson (?P<fill>.)? 53731ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson (?P<align>[<>=^]) 53741ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson)? 53751ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<sign>[-+ ])? 53761ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<zeropad>0)? 53771ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<minimumwidth>(?!0)\d+)? 53781ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?:\.(?P<precision>0|(?!0)\d+))? 53791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<type>[eEfFgG%])? 53801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson\Z 53811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson""", re.VERBOSE) 53821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 53837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdel re 53847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 53851ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinsondef _parse_format_specifier(format_spec): 53861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """Parse and validate a format specifier. 53871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 53881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson Turns a standard numeric format specifier into a dict, with the 53891ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson following entries: 53901ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 53911ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson fill: fill character to pad field to minimum width 53921ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson align: alignment type, either '<', '>', '=' or '^' 53931ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson sign: either '+', '-' or ' ' 53941ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson minimumwidth: nonnegative integer giving minimum width 53951ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson precision: nonnegative integer giving precision, or None 53961ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson type: one of the characters 'eEfFgG%', or None 53971ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson unicode: either True or False (always True for Python 3.x) 53981ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 53991ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """ 54001ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson m = _parse_format_specifier_regex.match(format_spec) 54011ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if m is None: 54021ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson raise ValueError("Invalid format specifier: " + format_spec) 54031ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54041ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # get the dictionary 54051ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict = m.groupdict() 54061ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54071ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # defaults for fill and alignment 54081ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson fill = format_dict['fill'] 54091ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson align = format_dict['align'] 54101ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if format_dict.pop('zeropad') is not None: 54111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # in the face of conflict, refuse the temptation to guess 54121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if fill is not None and fill != '0': 54131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson raise ValueError("Fill character conflicts with '0'" 54141ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson " in format specifier: " + format_spec) 54151ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if align is not None and align != '=': 54161ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson raise ValueError("Alignment conflicts with '0' in " 54171ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson "format specifier: " + format_spec) 54181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson fill = '0' 54191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson align = '=' 54201ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['fill'] = fill or ' ' 54211ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['align'] = align or '<' 54221ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54231ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if format_dict['sign'] is None: 54241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['sign'] = '-' 54251ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # turn minimumwidth and precision entries into integers. 54271ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # minimumwidth defaults to 0; precision remains None if not given 54281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0') 54291ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if format_dict['precision'] is not None: 54301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['precision'] = int(format_dict['precision']) 54311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # if format type is 'g' or 'G' then a precision of 0 makes little 54331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # sense; convert it to 1. Same if format type is unspecified. 54341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if format_dict['precision'] == 0: 54351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if format_dict['type'] in 'gG' or format_dict['type'] is None: 54361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['precision'] = 1 54371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # record whether return type should be str or unicode 54391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson format_dict['unicode'] = isinstance(format_spec, unicode) 54401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson return format_dict 54421ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinsondef _format_align(body, spec_dict): 54441ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """Given an unpadded, non-aligned numeric string, add padding and 54451ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson aligment to conform with the given format specifier dictionary (as 54461ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson output from parse_format_specifier). 54471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54481ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson It's assumed that if body is negative then it starts with '-'. 54491ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson Any leading sign ('-' or '+') is stripped from the body before 54501ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson applying the alignment and padding rules, and replaced in the 54511ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson appropriate position. 54521ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54531ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson """ 54541ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # figure out the sign; we only examine the first character, so if 54551ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # body has leading whitespace the results may be surprising. 54561ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if len(body) > 0 and body[0] in '-+': 54571ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson sign = body[0] 54581ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson body = body[1:] 54591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson else: 54601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson sign = '' 54611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if sign != '-': 54631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if spec_dict['sign'] in ' +': 54641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson sign = spec_dict['sign'] 54651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson else: 54661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson sign = '' 54671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # how much extra space do we have to play with? 54691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson minimumwidth = spec_dict['minimumwidth'] 54701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson fill = spec_dict['fill'] 54711ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson padding = fill*(max(minimumwidth - (len(sign+body)), 0)) 54721ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54731ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson align = spec_dict['align'] 54741ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if align == '<': 54751ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson result = padding + sign + body 54761ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif align == '>': 54771ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson result = sign + body + padding 54781ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson elif align == '=': 54791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson result = sign + padding + body 54801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson else: #align == '^' 54811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson half = len(padding)//2 54821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson result = padding[:half] + sign + body + padding[half:] 54831ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54841ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson # make sure that result is unicode if necessary 54851ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson if spec_dict['unicode']: 54861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson result = unicode(result) 54871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson 54881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson return result 54890d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz 549072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista##### Useful Constants (internal use only) ################################ 54917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 549272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Reusable defaults 549372bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaInf = Decimal('Inf') 549472bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistanegInf = Decimal('-Inf') 549572bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaNaN = Decimal('NaN') 549672bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaDec_0 = Decimal(0) 549772bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaDec_p1 = Decimal(1) 549872bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaDec_n1 = Decimal(-1) 54997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 550072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Infsign[sign] is infinity w/ that sign 550172bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaInfsign = (Inf, negInf) 55027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 55037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 55047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger 55057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerif __name__ == '__main__': 55067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger import doctest, sys 55077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger doctest.testmod(sys.modules[__name__]) 5508