decimal.py revision 1fb9f528bd69efa135bacda917ec7bb166068d5d
17c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Copyright (c) 2004 Python Software Foundation.
27c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# All rights reserved.
37c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Written by Eric Price <eprice at tjhsst.edu>
57c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Facundo Batista <facundo at taniquetil.com.ar>
67c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Raymond Hettinger <python at rcn.com>
71f34eb17b501687c1251678bcffab9accd432591Fred Drake#    and Aahz <aahz at pobox.com>
87c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Tim Peters
97c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1027dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# This module is currently Py2.3 compatible and should be kept that way
1127dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# unless a major compelling advantage arises.  IOW, 2.3 compatibility is
1227dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# strongly preferred, but not guaranteed.
1327dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger
1427dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# Also, this module should be kept in sync with the latest updates of
1527dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# the IBM specification as it evolves.  Those updates will be treated
1627dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# as bug fixes (deviation from the spec is a compatibility, usability
1727dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# bug) and will be backported.  At this point the spec is stabilizing
1827dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# and the updates are becoming fewer, smaller, and less significant.
197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"""
217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThis is a Py2.3 implementation of decimal floating point arithmetic based on
227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerthe General Decimal Arithmetic Specification:
237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    www2.hursley.ibm.com/decimal/decarith.html
257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
260ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerand IEEE standard 854-1987:
277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal floating point has finite precision with arbitrarily large bounds.
317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThe purpose of the module is to support arithmetic using familiar
337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"schoolhouse" rules and to avoid the some of tricky representation
347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerissues associated with binary floating point.  The package is especially
357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingeruseful for financial applications or for contexts where users have
367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerexpectations that are at odds with binary floating point (for instance,
377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerin binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerof the expected Decimal("0.00") returned by decimal floating point).
397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerHere are some examples of using the decimal module:
417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> from decimal import *
43bd7f76dd04780304c397323ae994092ce759d5a2Raymond Hettinger>>> setcontext(ExtendedContext)
447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(0)
457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("0")
467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("1")
477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("1")
487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("-.0123")
497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("-0.0123")
507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(123456)
517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("123456")
527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("123.45e12345678901234567890")
537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("1.2345E+12345678901234567892")
547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("1.33") + Decimal("1.27")
557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("2.60")
567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41")
577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("-2.20")
587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> dig = Decimal(1)
597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3)
607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333
617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> getcontext().prec = 18
627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3)
637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333333333333
647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig.sqrt()
657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3).sqrt()
677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1.73205080756887729
687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3) ** 123
697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger4.85192780976896427E+58
707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> inf = Decimal(1) / Decimal(0)
717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print inf
727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity
737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> neginf = Decimal(-1) / Decimal(0)
747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf
757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity
767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf + inf
777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN
787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf * inf
797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity
807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0
817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity
82bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> getcontext().traps[DivisionByZero] = 1
837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0
847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last):
857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDivisionByZero: x / 0
897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c = Context()
90bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0
915aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0
937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c.divide(Decimal(0), Decimal(0))
947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("NaN")
95bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 1
965aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
985aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0
995aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0
1017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0))
1027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last):
1037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1065aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond HettingerInvalidOperation: 0 / 0
1075aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
1095aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0
110bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0
1117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0))
1127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN
1135aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
1157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>>
1167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"""
1177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger__all__ = [
1197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Two major classes
1207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'Decimal', 'Context',
1217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Contexts
1239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    'DefaultContext', 'BasicContext', 'ExtendedContext',
1247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Exceptions
126d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger    'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
127d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger    'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
1287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Constants for use in setting up contexts
1307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
1317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN',
1327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Functions for manipulating contexts
1340ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    'setcontext', 'getcontext'
1357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger]
1367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
137eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettingerimport copy as _copy
1387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Rounding
1400ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_DOWN = 'ROUND_DOWN'
1410ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_UP = 'ROUND_HALF_UP'
1420ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
1430ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_CEILING = 'ROUND_CEILING'
1440ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_FLOOR = 'ROUND_FLOOR'
1450ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_UP = 'ROUND_UP'
1460ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
1477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger#Rounding decision (not part of the public API)
1490ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerNEVER_ROUND = 'NEVER_ROUND'    # Round in division (non-divmod), sqrt ONLY
1500ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerALWAYS_ROUND = 'ALWAYS_ROUND'  # Every operation rounds at end.
1517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Errors
1537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DecimalException(ArithmeticError):
1555aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    """Base exception class.
1567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Used exceptions derive from this.
1587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    If an exception derives from another exception besides this (such as
1597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
1607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    called if the others are present.  This isn't actually used for
1617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    anything, though.
1627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    handle  -- Called when context._raise_error is called and the
1647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               trap_enabler is set.  First argument is self, second is the
1657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               context.  More arguments can be given, those being after
1667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               the explanation in _raise_error (For example,
1677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               context._raise_error(NewError, '(-x)!', self._sign) would
1687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               call NewError().handle(context, self._sign).)
1697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    To define a new exception, it should be sufficient to have it derive
1717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    from DecimalException.
1727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
1747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        pass
1757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Clamped(DecimalException):
1787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent of a 0 changed to fit bounds.
1797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals clamped if the exponent of a result has been
1817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    altered in order to fit the constraints of a specific concrete
1827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    representation. This may occur when the exponent of a zero result would
1837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    be outside the bounds of a representation, or  when a large normal
1847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    number would have an encoded exponent that cannot be represented. In
1857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    this latter case, the exponent is reduced to fit and the corresponding
1867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    number of zero digits are appended to the coefficient ("fold-down").
1877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidOperation(DecimalException):
1917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """An invalid operation was performed.
1927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Various bad things cause this:
1947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Something creates a signaling NaN
1967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -INF + INF
1977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger     0 * (+-)INF
1987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger     (+-)INF / (+-)INF
1997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x % 0
2007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (+-)INF % x
2017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x._rescale( non-integer )
2027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    sqrt(-x) , x > 0
2037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    0 ** 0
2047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (non-integer)
2057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (+-)INF
2067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    An operand is invalid
2077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if args:
2107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if args[0] == 1: #sNaN, must drop 's' but keep diagnostics
2117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (args[1]._sign, args[1]._int, 'n') )
2127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass ConversionSyntax(InvalidOperation):
2157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Trying to convert badly formed string.
2167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an string is being
2187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    converted to a number and it does not conform to the numeric string
2197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    syntax. The result is [0,qNaN].
2207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (0, (0,), 'n') #Passed to something which uses a tuple.
2247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionByZero(DecimalException, ZeroDivisionError):
2267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Division by 0.
2277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals division-by-zero if division of a finite number
2297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero was attempted (during a divide-integer or divide operation, or a
2307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    power operation with negative right-hand operand), and the dividend was
2317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not zero.
2327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result of the operation is [sign,inf], where sign is the exclusive
2347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or of the signs of the operands for divide, or is 1 for an odd power of
2357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -0, for power.
2367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, sign, double = None, *args):
2397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if double is not None:
2407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (Infsign[sign],)*2
2417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Infsign[sign]
2427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionImpossible(InvalidOperation):
2447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Cannot perform the division adequately.
2457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if the integer result of a
2477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    divide-integer or remainder operation had too many digits (would be
2487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    longer than precision). The result is [0,qNaN].
2497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (NaN, NaN)
2537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionUndefined(InvalidOperation, ZeroDivisionError):
2557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Undefined result of division.
2567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if division by zero was
2587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    attempted (during a divide-integer, divide, or remainder operation), and
2597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the dividend is also zero. The result is [0,qNaN].
2607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, tup=None, *args):
2637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tup is not None:
2647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (NaN, NaN) #for 0 %0, 0 // 0
2657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Inexact(DecimalException):
2687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Had to round, losing information.
2697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals inexact whenever the result of an operation is
2717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not exact (that is, it needed to be rounded and any discarded digits
2727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    were non-zero), or if an overflow or underflow condition occurs. The
2737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
2747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The inexact signal may be tested (or trapped) to determine if a given
2767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) was inexact.
2777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2785aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    pass
2797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidContext(InvalidOperation):
2817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Invalid context.  Unknown rounding, for example.
2827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an invalid context was
2847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    detected during an operation. This can occur if contexts are not checked
2857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    on creation and either the precision exceeds the capability of the
2867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    underlying concrete representation or an unknown or unsupported rounding
2877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    was specified. These aspects of the context need only be checked when
2887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the values are required to be used. The result is [0,qNaN].
2897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Rounded(DecimalException):
2957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Number got rounded (not  necessarily changed during rounding).
2967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals rounded whenever the result of an operation is
2987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    rounded (that is, some zero or non-zero digits were discarded from the
2997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    coefficient), or if an overflow or underflow condition occurs. The
3007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
3017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The rounded signal may be tested (or trapped) to determine if a given
3037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) caused a loss of precision.
3047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3055aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    pass
3067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Subnormal(DecimalException):
3087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent < Emin before rounding.
3097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals subnormal whenever the result of a conversion or
3117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation is subnormal (that is, its adjusted exponent is less than
3127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Emin, before any rounding). The result in all cases is unchanged.
3137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The subnormal signal may be tested (or trapped) to determine if a given
3157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or operation (or sequence of operations) yielded a subnormal result.
3167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    pass
3187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Overflow(Inexact, Rounded):
3207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical overflow.
3217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals overflow if the adjusted exponent of a result
3237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (from a conversion or from an operation that is not an attempt to divide
3247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero), after rounding, would be greater than the largest value that
3257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    can be handled by the implementation (the value Emax).
3267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result depends on the rounding mode:
3287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    For round-half-up and round-half-even (and for round-half-down and
3307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-up, if implemented), the result of the operation is [sign,inf],
3317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    where sign is the sign of the intermediate result. For round-down, the
3327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result is the largest finite number that can be represented in the
3337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    current precision, with the sign of the intermediate result. For
3347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-ceiling, the result is the same as for round-down if the sign of
3357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
3367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the result is the same as for round-down if the sign of the intermediate
3377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
3387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    will also be raised.
3397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger   """
3407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, sign, *args):
3427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
3437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                     ROUND_HALF_DOWN, ROUND_UP):
3447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Infsign[sign]
3457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 0:
3467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_CEILING:
3477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
3487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal((sign, (9,)*context.prec,
3497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                            context.Emax-context.prec+1))
3507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 1:
3517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_FLOOR:
3527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
3537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (sign, (9,)*context.prec,
3547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                             context.Emax-context.prec+1))
3557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Underflow(Inexact, Rounded, Subnormal):
3587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical underflow with result rounded to 0.
3597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals underflow if a result is inexact and the
3617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    adjusted exponent of the result would be smaller (more negative) than
3627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the smallest value that can be handled by the implementation (the value
3637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Emin). That is, the result is both inexact and subnormal.
3647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result after an underflow will be a subnormal number rounded, if
3667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    necessary, so that its exponent is not less than Etiny. This may result
3677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    in 0 with the sign of the intermediate result and an exponent of Etiny.
3687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    In all cases, Inexact, Rounded, and Subnormal will also be raised.
3707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3725aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# List of public traps and flags
373fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
3745aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger           Underflow, InvalidOperation, Subnormal]
3757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3765aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# Map conditions (per the spec) to signals
3775aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger_condition_map = {ConversionSyntax:InvalidOperation,
3785aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionImpossible:InvalidOperation,
3795aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionUndefined:InvalidOperation,
3805aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  InvalidContext:InvalidOperation}
3817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Context Functions #######################################
3837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
384ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# The getcontext() and setcontext() function manage access to a thread-local
385ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# current context.  Py2.4 offers direct support for thread locals.  If that
386ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# is not available, use threading.currentThread() which is slower but will
3877e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger# work for older Pythons.  If threads are not part of the build, create a
3887e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger# mock threading object with threading.local() returning the module namespace.
3897e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger
3907e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingertry:
3917e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    import threading
3927e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingerexcept ImportError:
3937e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    # Python was compiled without threads; create a mock object instead
3947e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    import sys
3957e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    class MockThreading:
3967e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger        def local(self, sys=sys):
3977e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger            return sys.modules[__name__]
3987e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    threading = MockThreading()
3997e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    del sys, MockThreading
400ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
401ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingertry:
402ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    threading.local
403ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
404ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerexcept AttributeError:
405ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
406ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    #To fix reloading, force it to create a new context
407ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    #Old contexts have different exceptions in their dicts, making problems.
408ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    if hasattr(threading.currentThread(), '__decimal_context__'):
409ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        del threading.currentThread().__decimal_context__
410ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
411ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context):
412ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
413ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4149fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
41561992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
4167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        threading.currentThread().__decimal_context__ = context
417ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
418ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext():
419ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
420ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
421ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
422ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
423ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
424ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
425ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
426ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return threading.currentThread().__decimal_context__
427ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
428ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
429ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            threading.currentThread().__decimal_context__ = context
430ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
431ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
432ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerelse:
433ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
434ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    local = threading.local()
4359fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    if hasattr(local, '__decimal_context__'):
4369fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        del local.__decimal_context__
437ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
438ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext(_local=local):
439ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
440ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
441ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
442ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
443ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
444ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
445ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
446ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return _local.__decimal_context__
447ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
448ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
449ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            _local.__decimal_context__ = context
450ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
451ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
452ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context, _local=local):
453ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
454ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4559fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
45661992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
457ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        _local.__decimal_context__ = context
458ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
459ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    del threading, local        # Don't contaminate the namespace
4607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Decimal class ###########################################
4637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Decimal(object):
4657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Floating point class for decimal arithmetic."""
4667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
467636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    __slots__ = ('_exp','_int','_sign', '_is_special')
468636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # Generally, the value of the Decimal instance is given by
469636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    #  (-1)**_sign * _int * 10**_exp
470636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # Special values are signified by _is_special == True
4717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
472dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    # We're immutable, so use __new__ not __init__
473636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    def __new__(cls, value="0", context=None):
4747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Create a decimal point instance.
4757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal('3.14')              # string input
4777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.14")
4787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal((0, (3, 1, 4), -2))  # tuple input (sign, digit_tuple, exponent)
4797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.14")
4807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(314)                 # int or long
4817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("314")
4827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(Decimal(314))        # another decimal instance
4837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("314")
4847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
4857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
486636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self = object.__new__(cls)
487636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self._is_special = False
488636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
489636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # From an internal working value
490636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if isinstance(value, _WorkRep):
49117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            self._sign = value.sign
492636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._int = tuple(map(int, str(value.int)))
493636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._exp = int(value.exp)
494636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
495636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
496636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # From another decimal
497636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if isinstance(value, Decimal):
498636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._exp  = value._exp
499636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._sign = value._sign
500636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._int  = value._int
501636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._is_special  = value._is_special
502636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
503636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
504636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # From an integer
5057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, (int,long)):
506636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if value >= 0:
507636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._sign = 0
508636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            else:
509636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._sign = 1
510636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._exp = 0
511636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._int = tuple(map(int, str(abs(value))))
512636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
513636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
514636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # tuple/list conversion (possibly from as_tuple())
515636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if isinstance(value, (list,tuple)):
516636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if len(value) != 3:
517636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                raise ValueError, 'Invalid arguments'
518dbecd93b7203cd187c1978de1207c29d3a9a686cRaymond Hettinger            if value[0] not in (0,1):
519636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                raise ValueError, 'Invalid sign'
520636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            for digit in value[1]:
521636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if not isinstance(digit, (int,long)) or digit < 0:
522636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    raise ValueError, "The second value in the tuple must be composed of non negative integer elements."
523636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
524636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._sign = value[0]
525636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._int  = tuple(value[1])
526636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if value[2] in ('F','n','N'):
527636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._exp = value[2]
528636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._is_special = True
529636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            else:
530636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._exp  = int(value[2])
531636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
532636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
533636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if isinstance(value, float):
534636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            raise TypeError("Cannot convert float to Decimal.  " +
535636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                            "First convert the float to a string")
5367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
537636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # Other argument types may require the context during interpretation
538636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
539636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
540636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
541636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # From a string
5427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # REs insist on real strings, so we can too.
5437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, basestring):
5440ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger            if _isinfinity(value):
5457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._exp = 'F'
5467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._int = (0,)
547636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._is_special = True
548636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if _isinfinity(value) == 1:
5497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._sign = 0
5507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
5517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._sign = 1
552636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self
5530ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger            if _isnan(value):
5540ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                sig, sign, diag = _isnan(value)
555636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._is_special = True
5567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if len(diag) > context.prec: #Diagnostic info too long
5577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._sign, self._int, self._exp = \
5587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                context._raise_error(ConversionSyntax)
559636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return self
5607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if sig == 1:
5617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._exp = 'n' #qNaN
5627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else: #sig == 2
5637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._exp = 'N' #sNaN
5647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._sign = sign
5657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._int = tuple(map(int, diag)) #Diagnostic info
566636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self
567d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger            try:
568d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger                self._sign, self._int, self._exp = _string2exact(value)
569d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger            except ValueError:
570636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._is_special = True
571d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger                self._sign, self._int, self._exp = context._raise_error(ConversionSyntax)
572636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
5737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
574636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        raise TypeError("Cannot convert %r to Decimal" % value)
5757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isnan(self):
5777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
5787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if a number
5807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if NaN
5817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        2 if sNaN
5827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
583636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
584636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            exp = self._exp
585636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if exp == 'n':
586636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return 1
587636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            elif exp == 'N':
588636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return 2
5897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
5907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinfinity(self):
5927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is infinite
5937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if finite or not a number
5957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if +INF
5967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 if -INF
5977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 'F':
5997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign:
6007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return -1
6017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
6027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
6037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _check_nans(self, other = None, context=None):
6057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
6067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are sNaN, signal
6087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are NaN return nan
6097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
6107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Done before operations.
6127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
6137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
614636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self_is_nan = self._isnan()
615636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if other is None:
616636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            other_is_nan = False
617636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        else:
618636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            other_is_nan = other._isnan()
619636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
620636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self_is_nan or other_is_nan:
621636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if context is None:
622636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context = getcontext()
623636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
624636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self_is_nan == 2:
625636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation, 'sNaN',
626636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                                        1, self)
627636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other_is_nan == 2:
628636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation, 'sNaN',
629636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                                        1, other)
630636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self_is_nan:
631636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self
632636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
6337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return other
6347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
6357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __nonzero__(self):
6377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Is the number non-zero?
6387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if self == 0
6407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if self != 0
6417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
642636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
6437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
644636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        return sum(self._int) != 0
6457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __cmp__(self, other, context=None):
647636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
648267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
649267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
6507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
651636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
652636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
653636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
654636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return 1 # Comparison involving NaN's always reports self > other
655636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
656636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # INF = INF
657636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return cmp(self._isinfinity(), other._isinfinity())
6587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
6607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0 #If both 0, sign comparison isn't certain.
6617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #If different signs, neg one is less
6637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._sign < self._sign:
6647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -1
6657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign < other._sign:
6667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
6677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
668636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self_adjusted = self.adjusted()
669636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other_adjusted = other.adjusted()
670636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self_adjusted == other_adjusted and \
6717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger           self._int + (0,)*(self._exp - other._exp) == \
6727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger           other._int + (0,)*(other._exp - self._exp):
6737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0 #equal, except in precision. ([0]*(-x) = [])
674636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        elif self_adjusted > other_adjusted and self._int[0] != 0:
6757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (-1)**self._sign
676636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        elif self_adjusted < other_adjusted and other._int[0] != 0:
6777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -((-1)**self._sign)
6787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
679636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # Need to round, so make sure we have a valid context
680636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
681636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
682636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
6839fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
6847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_UP) #round away from 0
6857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_all_flags()
6877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        res = self.__sub__(other, context=context)
6887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._regard_flags(*flags)
6907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.rounding = rounding
6927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not res:
6947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
6957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif res._sign:
6967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -1
6977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 1
6987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6990aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __eq__(self, other):
7000aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        if not isinstance(other, (Decimal, int, long)):
701267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return NotImplemented
7020aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        return self.__cmp__(other) == 0
7030aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
7040aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __ne__(self, other):
7050aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        if not isinstance(other, (Decimal, int, long)):
706267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return NotImplemented
7070aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        return self.__cmp__(other) != 0
7080aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
7097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, other, context=None):
7107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares one to another.
7117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 => a < b
7137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0  => a = b
7147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1  => a > b
7157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN => one is NaN
7167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Like __cmp__, but returns Decimal instances.
7177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
718636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
719267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
720267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
7217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #compare(NaN, NaN) = NaN
723636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if (self._is_special or other and other._is_special):
724636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
725636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
726636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
7277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal(self.__cmp__(other, context))
7297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __hash__(self):
7317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """x.__hash__() <==> hash(x)"""
7327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Decimal integers must hash the same as the ints
7337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Non-integer decimals are normalized and hashed as strings
7341fb9f528bd69efa135bacda917ec7bb166068d5dGeorg Brandl        # Normalization assures that hash(100E-1) == hash(10)
735bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger        if self._is_special:
736bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger            if self._isnan():
737bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger                raise TypeError('Cannot hash a NaN value.')
738bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger            return hash(str(self))
7397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        i = int(self)
7407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self == Decimal(i):
7417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return hash(i)
7427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        assert self.__nonzero__()   # '-0' handled by integer case
7437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return hash(str(self.normalize()))
7447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def as_tuple(self):
7467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as a triple tuple.
7477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        To show the internals exactly as they are.
7497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
7507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (self._sign, self._int, self._exp)
7517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
7537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as an instance of Decimal."""
7547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Invariant:  eval(repr(d)) == d
7557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 'Decimal("%s")' % str(self)
7567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __str__(self, eng = 0, context=None):
7587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return string representation of the number in scientific notation.
7597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Captures all of the information in the underlying representation.
7617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
7627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
763e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger        if self._is_special:
764e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger            if self._isnan():
765e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger                minus = '-'*self._sign
766e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger                if self._int == (0,):
767e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger                    info = ''
768e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger                else:
769e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger                    info = ''.join(map(str, self._int))
770e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger                if self._isnan() == 2:
771e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger                    return minus + 'sNaN' + info
772e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger                return minus + 'NaN' + info
773e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger            if self._isinfinity():
774e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger                minus = '-'*self._sign
775e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger                return minus + 'Infinity'
7767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
7787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
7797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = map(str, self._int)
7817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = len(self._int)
7827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        leftdigits = self._exp + numdigits
7837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if eng and not self: #self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY
7847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._exp < 0 and self._exp >= -6: #short, no need for e/E
7857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s = '-'*self._sign + '0.' + '0'*(abs(self._exp))
7867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return s
7877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #exp is closest mult. of 3 >= self._exp
7887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = ((self._exp - 1)// 3 + 1) * 3
7897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp != self._exp:
7907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s = '0.'+'0'*(exp - self._exp)
7917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
7927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s = '0'
7937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp != 0:
7947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if context.capitals:
7957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    s += 'E'
7967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
7977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    s += 'e'
7987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if exp > 0:
7997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    s += '+' #0.0e+3, not 0.0e3
8007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s += str(exp)
8017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            s = '-'*self._sign + s
8027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return s
8037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if eng:
8047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            dotplace = (leftdigits-1)%3+1
8057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            adjexp = leftdigits -1 - (leftdigits-1)%3
8067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
8077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            adjexp = leftdigits-1
8087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            dotplace = 1
8097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 0:
8107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            pass
8117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._exp < 0 and adjexp >= 0:
8127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.insert(leftdigits, '.')
8137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._exp < 0 and adjexp >= -6:
8147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp[0:0] = ['0'] * int(-leftdigits)
8157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.insert(0, '0.')
8167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
8177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if numdigits > dotplace:
8187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp.insert(dotplace, '.')
8197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            elif numdigits < dotplace:
8207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp.extend(['0']*(dotplace-numdigits))
8217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if adjexp:
8227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if not context.capitals:
8237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    tmp.append('e')
8247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
8257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    tmp.append('E')
8267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    if adjexp > 0:
8277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                        tmp.append('+')
8287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp.append(str(adjexp))
8297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if eng:
8307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            while tmp[0:1] == ['0']:
8317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp[0:1] = []
8327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(tmp) == 0 or tmp[0] == '.' or tmp[0].lower() == 'e':
8337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp[0:0] = ['0']
8347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
8357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.insert(0, '-')
8367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ''.join(tmp)
8387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, context=None):
8407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Convert to engineering-type string.
8417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Engineering notation has an exponent which is a multiple of 3, so there
8437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        are up to 3 digits left of the decimal place.
8447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Same rules for when in exponential and when as a value as in __str__.
8467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__str__(eng=1, context=context)
8487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __neg__(self, context=None):
8507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy with the sign switched.
8517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds, if it has reason.
8537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
854636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
855636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
856636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
857636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
8587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
8607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # -Decimal('0') is Decimal('0'), not Decimal('-0')
8617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 0
8627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._sign:
8637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 0
8647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
8657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 1
866636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
867636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
868636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
8697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context._rounding_decision == ALWAYS_ROUND:
870dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger            return Decimal((sign, self._int, self._exp))._fix(context)
8717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal( (sign, self._int, self._exp))
8727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __pos__(self, context=None):
8747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy, unless it is a sNaN.
8757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds the number (if more then precision digits)
8777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
878636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
879636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
880636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
881636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
8827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = self._sign
8847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
8857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # + (-0) = 0
8867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 0
8877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
888636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
889636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
890636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
8917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context._rounding_decision == ALWAYS_ROUND:
892dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger            ans = self._fix(context)
8937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
8947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal(self)
8957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans._sign = sign
8967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
8977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __abs__(self, round=1, context=None):
8997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of self.
9007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the second argument is 0, do not round.
9027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
903636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
904636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
905636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
906636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
9077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not round:
909636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if context is None:
910636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context = getcontext()
9119fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context._shallow_copy()
9127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._set_rounding_decision(NEVER_ROUND)
9137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
9157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__neg__(context=context)
9167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
9177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__pos__(context=context)
9187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
9207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __add__(self, other, context=None):
9227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns self + other.
9237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -INF + INF (or the reverse) cause InvalidOperation errors.
9257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
926636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
927267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
928267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
929636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
9307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
9317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
9327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
933636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
934636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
935636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
936636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
9377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
938636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity():
939636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                #If both INF, same sign => same as both, opposite => error.
940636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if self._sign != other._sign and other._isinfinity():
941636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '-INF + INF')
942636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal(self)
943636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
944636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal(other)  #Can't both be infinity here
9457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
9477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = min(self._exp, other._exp)
9497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negativezero = 0
9507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding == ROUND_FLOOR and self._sign != other._sign:
9517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #If the answer is 0, the sign should be negative, in this case.
9527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            negativezero = 1
9537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
9557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = min(self._sign, other._sign)
9567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if negativezero:
9577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                sign = 1
9587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (sign, (0,), exp))
9597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
96099b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista            exp = max(exp, other._exp - context.prec-1)
9617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other._rescale(exp, watchexp=0, context=context)
9627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
963dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger                ans = ans._fix(context)
9647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
9657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not other:
96699b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista            exp = max(exp, self._exp - context.prec-1)
9677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self._rescale(exp, watchexp=0, context=context)
9687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
969dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger                ans = ans._fix(context)
9707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
9717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = _WorkRep(self)
9737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = _WorkRep(other)
9747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1, op2 = _normalize(op1, op2, shouldround, context.prec)
9757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result = _WorkRep()
9777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if op1.sign != op2.sign:
9787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # Equal and opposite
97917931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.int == op2.int:
9807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if exp < context.Etiny():
9817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    exp = context.Etiny()
9827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Clamped)
9837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal((negativezero, (0,), exp))
98417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.int < op2.int:
9857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1, op2 = op2, op1
9867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #OK, now abs(op1) > abs(op2)
98717931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.sign == 1:
98817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger                result.sign = 1
9897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1.sign, op2.sign = op2.sign, op1.sign
9907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
99117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger                result.sign = 0
9927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #So we know the sign, and op1 > 0.
99317931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        elif op1.sign == 1:
9947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.sign = 1
99517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            op1.sign, op2.sign = (0, 0)
99617931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        else:
99717931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            result.sign = 0
9987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Now, op1 > abs(op2) > 0
9997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
100017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        if op2.sign == 0:
1001636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            result.int = op1.int + op2.int
10027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
1003636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            result.int = op1.int - op2.int
10047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.exp = op1.exp
10067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(result)
10077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
1008dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger            ans = ans._fix(context)
10097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
10107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __radd__ = __add__
10127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __sub__(self, other, context=None):
10147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self + (-other)"""
1015636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1016267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1017267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
10187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1019636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1020636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context=context)
1021636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1022636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # -Decimal(0) = Decimal(0), which we don't want since
10257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # (-0 - 0 = -0 + (-0) = -0, but -0 + 0 = 0.)
10267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # so we change the sign directly to a copy
10277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(other)
10287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._sign = 1-tmp._sign
10297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__add__(tmp, context=context)
10317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rsub__(self, other, context=None):
10337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return other + (-self)"""
1034636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1035267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1036267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
10377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(self)
10397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._sign = 1 - tmp._sign
10407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__add__(tmp, context=context)
10417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _increment(self, round=1, context=None):
10437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Special case of add, adding 1eExponent
10447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Since it is common, (rounding, for example) this adds
10467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (sign)*one E self._exp to the number more efficiently than add.
10477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        For example:
10497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal('5.624e10')._increment() == Decimal('5.625e10')
10507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1051636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1052636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1053636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1054636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
1055636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1056636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return Decimal(self) # Must be infinite, and incrementing makes no difference
10577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        L = list(self._int)
10597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        L[-1] += 1
10607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        spot = len(L)-1
10617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while L[spot] == 10:
10627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            L[spot] = 0
10637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if spot == 0:
10647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                L[0:0] = [1]
10657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
10667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            L[spot-1] += 1
10677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            spot -= 1
10687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal((self._sign, L, self._exp))
10697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1070636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1071636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
10727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if round and context._rounding_decision == ALWAYS_ROUND:
1073dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger            ans = ans._fix(context)
10747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
10757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mul__(self, other, context=None):
10777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self * other.
10787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (+-) INF * 0 (or its reverse) raise InvalidOperation.
10807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1081636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1082267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1083267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
1084636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
10857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
10867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
10877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1088d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger        resultsign = self._sign ^ other._sign
10897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1090636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1091636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1092636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1093636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
1094636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1095636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity():
1096636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if not other:
1097636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '(+-)INF * 0')
1098636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Infsign[resultsign]
1099636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1100636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
1101636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if not self:
1102636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '0 * (+-)INF')
1103636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Infsign[resultsign]
11047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resultexp = self._exp + other._exp
11067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
11077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by zero
11097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self or not other:
11107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((resultsign, (0,), resultexp))
11117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
11127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #Fixing in case the exponent is out of bounds
1113dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger                ans = ans._fix(context)
11147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by power of 10
11177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._int == (1,):
11187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((resultsign, other._int, resultexp))
11197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
1120dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger                ans = ans._fix(context)
11217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._int == (1,):
11237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((resultsign, self._int, resultexp))
11247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
1125dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger                ans = ans._fix(context)
11267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1128636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        op1 = _WorkRep(self)
1129636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        op2 = _WorkRep(other)
1130636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1131636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        ans = Decimal( (resultsign, map(int, str(op1.int * op2.int)), resultexp))
11327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
1133dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger            ans = ans._fix(context)
11347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
11367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __rmul__ = __mul__
11377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __div__(self, other, context=None):
11397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self / other."""
11407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, context=context)
11417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __truediv__ = __div__
11427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _divide(self, other, divmod = 0, context=None):
11447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return a / b, to context.prec precision.
11457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        divmod:
11477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 => true division
11487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 => (a //b, a%b)
11497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        2 => a //b
11507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        3 => a%b
11517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Actually, if divmod is 2 or 3 a tuple is returned, but errors for
11537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        computing the other value are not raised.
11547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1155636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1156267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1157267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            if divmod in (0, 1):
1158267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger                return NotImplemented
1159267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return (NotImplemented, NotImplemented)
1160636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
11617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
11627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
11637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1164636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        sign = self._sign ^ other._sign
1165636a6b100fe6083388bc5315758326078abe65b4Raymond 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                if divmod:
1170636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return (ans, ans)
11717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return ans
11727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1173636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity() and other._isinfinity():
1174636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if divmod:
1175636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return (context._raise_error(InvalidOperation,
1176636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                                            '(+-)INF // (+-)INF'),
1177636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                            context._raise_error(InvalidOperation,
1178636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                                            '(+-)INF % (+-)INF'))
11797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
11807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._isinfinity():
11827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if divmod == 1:
11837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return (Infsign[sign],
11847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                            context._raise_error(InvalidOperation, 'INF % x'))
11857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                elif divmod == 2:
11867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return (Infsign[sign], NaN)
11877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                elif divmod == 3:
11887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return (Infsign[sign],
11897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                            context._raise_error(InvalidOperation, 'INF % x'))
1190636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Infsign[sign]
1191636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1192636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
1193636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if divmod:
1194636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return (Decimal((sign, (0,), 0)), Decimal(self))
1195636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context._raise_error(Clamped, 'Division by infinity')
1196636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal((sign, (0,), context.Etiny()))
1197636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1198636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # Special cases for zeroes
1199636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if not self and not other:
1200636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if divmod:
1201636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(DivisionUndefined, '0 / 0', 1)
1202636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return context._raise_error(DivisionUndefined, '0 / 0')
1203636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1204636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if not self:
1205636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if divmod:
12067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = Decimal(self)
12077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside._exp = min(self._exp, other._exp)
12087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal((sign, (0,), 0)),  otherside)
1209636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            exp = self._exp - other._exp
1210636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if exp < context.Etiny():
1211636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                exp = context.Etiny()
1212636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context._raise_error(Clamped, '0e-x / y')
1213636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if exp > context.Emax:
1214636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                exp = context.Emax
1215636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context._raise_error(Clamped, '0e+x / y')
1216636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return Decimal( (sign, (0,), exp) )
12177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1218636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if not other:
1219636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if divmod:
12207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(DivisionByZero, 'divmod(x,0)',
12217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                           sign, 1)
1222636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return context._raise_error(DivisionByZero, 'x / 0', sign)
12237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1224636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        #OK, so neither = 0, INF or NaN
12257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
12277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #If we're dividing into ints, and self < other, stop.
12297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #self.__abs__(0) does not round.
12307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if divmod and (self.__abs__(0, context) < other.__abs__(0, context)):
12317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if divmod == 1 or divmod == 3:
12337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = min(self._exp, other._exp)
12347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans2 = self._rescale(exp, context=context, watchexp=0)
12357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if shouldround:
1236dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger                    ans2 = ans2._fix(context)
12377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal( (sign, (0,), 0) ),
12387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                        ans2)
12397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            elif divmod == 2:
12417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #Don't round the mod part, if we don't need it.
12427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal( (sign, (0,), 0) ), Decimal(self))
12437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = _WorkRep(self)
12457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = _WorkRep(other)
12467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1, op2, adjust = _adjust_coefficients(op1, op2)
1247636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        res = _WorkRep( (sign, 0, (op1.exp - op2.exp)) )
12487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if divmod and res.exp > context.prec + 1:
12497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(DivisionImpossible)
12507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1251636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        prec_limit = 10 ** context.prec
12527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while 1:
1253636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            while op2.int <= op1.int:
1254636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                res.int += 1
1255636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                op1.int -= op2.int
12567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if res.exp == 0 and divmod:
1257636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if res.int >= prec_limit and shouldround:
12587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return context._raise_error(DivisionImpossible)
12597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = Decimal(op1)
12607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                frozen = context._ignore_all_flags()
12617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = min(self._exp, other._exp)
126317931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger                otherside = otherside._rescale(exp, context=context, watchexp=0)
12647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._regard_flags(*frozen)
12657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if shouldround:
1266dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger                    otherside = otherside._fix(context)
12677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal(res), otherside)
12687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1269636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if op1.int == 0 and adjust >= 0 and not divmod:
12707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
1271636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if res.int >= prec_limit and shouldround:
12727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if divmod:
12737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return context._raise_error(DivisionImpossible)
12747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                shouldround=1
12757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                # Really, the answer is a bit higher, so adding a one to
12767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                # the end will make sure the rounding is right.
1277636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if op1.int != 0:
1278636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    res.int *= 10
1279636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    res.int += 1
12807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    res.exp -= 1
12817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
1283636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            res.int *= 10
12847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            res.exp -= 1
12857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            adjust += 1
1286636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            op1.int *= 10
12877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            op1.exp -= 1
12887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1289636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if res.exp == 0 and divmod and op2.int > op1.int:
12907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #Solves an error in precision.  Same as a previous block.
12917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1292636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if res.int >= prec_limit and shouldround:
12937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return context._raise_error(DivisionImpossible)
12947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = Decimal(op1)
12957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                frozen = context._ignore_all_flags()
12967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = min(self._exp, other._exp)
12987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = otherside._rescale(exp, context=context)
12997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._regard_flags(*frozen)
13017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal(res), otherside)
13037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(res)
13057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
1306dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger            ans = ans._fix(context)
13077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
13087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rdiv__(self, other, context=None):
13107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __div__."""
1311636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1312267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1313267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__div__(self, context=context)
13157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __rtruediv__ = __rdiv__
13167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __divmod__(self, other, context=None):
13187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (self // other, self % other)
13207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, 1, context)
13227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rdivmod__(self, other, context=None):
13247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __divmod__."""
1325636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1326267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1327267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__divmod__(self, context=context)
13297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mod__(self, other, context=None):
13317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self % other
13337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1334636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1335267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1336267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1338636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1339636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1340636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1341636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
13427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self and not other:
13447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x % 0')
13457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, 3, context)[1]
13477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rmod__(self, other, context=None):
13497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __mod__."""
1350636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1351267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1352267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__mod__(self, context=context)
13547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, other, context=None):
13567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Remainder nearest to 0-  abs(remainder-near) <= other/2
13587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1359636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1360267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1361267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1363636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1364636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1365636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1366636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
13677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self and not other:
13687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x % 0')
13697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1370636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1371636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
13727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # If DivisionImpossible causes an error, do not leave Rounded/Inexact
13737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # ignored in the calling function.
13749fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
13757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_flags(Rounded, Inexact)
13767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #keep DivisionImpossible flags
13777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (side, r) = self.__divmod__(other, context=context)
13787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r._isnan():
13807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._regard_flags(*flags)
13817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return r
13827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13839fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
13847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
13857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._sign:
13877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            comparison = other.__div__(Decimal(-2), context=context)
13887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
13897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            comparison = other.__div__(Decimal(2), context=context)
13907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
13927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._regard_flags(*flags)
13937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        s1, s2 = r._sign, comparison._sign
13957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        r._sign, comparison._sign = 0, 0
13967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r < comparison:
13987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            r._sign, comparison._sign = s1, s2
13997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Get flags now
14007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.__divmod__(other, context=context)
1401dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger            return r._fix(context)
14027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        r._sign, comparison._sign = s1, s2
14037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
14057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (side, r) = self.__divmod__(other, context=context)
14077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
14087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r._isnan():
14097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return r
14107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        decrease = not side._iseven()
14127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
14137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        side = side.__abs__(context=context)
14147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
14157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        s1, s2 = r._sign, comparison._sign
14177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        r._sign, comparison._sign = 0, 0
14187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r > comparison or decrease and r == comparison:
14197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            r._sign, comparison._sign = s1, s2
14207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec += 1
14217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(side.__add__(Decimal(1), context=context)._int) >= context.prec:
14227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context.prec -= 1
14237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(DivisionImpossible)[1]
14247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec -= 1
14257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign == other._sign:
14267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                r = r.__sub__(other, context=context)
14277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
14287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                r = r.__add__(other, context=context)
14297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
14307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            r._sign, comparison._sign = s1, s2
14317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1432dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        return r._fix(context)
14337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __floordiv__(self, other, context=None):
14357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """self // other"""
14367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, 2, context)[0]
14377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rfloordiv__(self, other, context=None):
14397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __floordiv__."""
1440636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1441267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1442267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
14437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__floordiv__(self, context=context)
14447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __float__(self):
14467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Float representation."""
14477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return float(str(self))
14487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __int__(self):
145046b0802ccd9a9c47b27a285526fbb2a8bee5b8cbBrett Cannon        """Converts self to an int, truncating if necessary."""
1451636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1452636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isnan():
1453636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context = getcontext()
1454636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidContext)
1455636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            elif self._isinfinity():
1456636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                raise OverflowError, "Cannot convert infinity to long"
14577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
1458605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger            s = ''.join(map(str, self._int)) + '0'*self._exp
1459605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger        else:
1460605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger            s = ''.join(map(str, self._int))[:self._exp]
1461605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger        if s == '':
1462605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger            s = '0'
1463605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger        sign = '-'*self._sign
1464605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger        return int(sign + s)
14657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __long__(self):
14677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts to a long.
14687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Equivalent to long(int(self))
14707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
14717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return long(self.__int__())
14727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1473dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    def _fix(self, context):
14747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round if it is necessary to keep self within prec precision.
14757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds and fixes the exponent.  Does not raise on a sNaN.
14777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Arguments:
14797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self - Decimal instance
14807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context - context used.
14817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1482636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
14837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
14847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
14857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
1486dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        prec = context.prec
148799b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista        ans = self._fixexponents(context)
14887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(ans._int) > prec:
1489dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger            ans = ans._round(prec, context=context)
149099b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista            ans = ans._fixexponents(context)
14917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
14927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
149399b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista    def _fixexponents(self, context):
1494dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        """Fix the exponents and return a copy with the exponent in bounds.
1495dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        Only call if known to not be a special value.
1496dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        """
1497dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        folddown = context._clamp
1498636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        Emin = context.Emin
149999b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista        ans = self
1500636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        ans_adjusted = ans.adjusted()
1501636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if ans_adjusted < Emin:
15027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            Etiny = context.Etiny()
15037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if ans._exp < Etiny:
15047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if not ans:
150599b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista                    ans = Decimal(self)
15067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    ans._exp = Etiny
15077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Clamped)
15087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return ans
15097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._rescale(Etiny, context=context)
15107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #It isn't zero, and exp < Emin => subnormal
15117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._raise_error(Subnormal)
15127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if context.flags[Inexact]:
15137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Underflow)
15147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
15157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if ans:
15167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    #Only raise subnormal if non-zero.
15177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Subnormal)
1518636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        else:
1519636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            Etop = context.Etop()
1520636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if folddown and ans._exp > Etop:
15217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._raise_error(Clamped)
1522636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                ans = ans._rescale(Etop, context=context)
1523636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            else:
1524636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                Emax = context.Emax
1525636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if ans_adjusted > Emax:
1526636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    if not ans:
152799b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista                        ans = Decimal(self)
1528636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                        ans._exp = Emax
1529636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                        context._raise_error(Clamped)
1530636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                        return ans
1531636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    context._raise_error(Inexact)
1532636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    context._raise_error(Rounded)
1533636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(Overflow, 'above Emax', ans._sign)
15347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
15357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round(self, prec=None, rounding=None, context=None):
15377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a rounded version of self.
15387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        You can specify the precision or rounding method.  Otherwise, the
15407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context determines it.
15417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
15427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1543636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1544636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1545636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1546636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
1547636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1548636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity():
1549636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal(self)
1550636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
15517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
15527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
15537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if rounding is None:
15557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            rounding = context.rounding
15567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec is None:
15577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = context.prec
15587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
15607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if prec <= 0:
15617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                dig = (0,)
15627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = len(self._int) - prec + self._exp
15637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
15647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                dig = (0,) * prec
15657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = len(self._int) + self._exp - prec
15667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((self._sign, dig, exp))
15677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
15687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
15697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec == 0:
15717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp = Decimal(self)
15727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp._int = (0,)+temp._int
15737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = 1
15747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif prec < 0:
15757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = self._exp + len(self._int) - prec - 1
15767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp = Decimal( (self._sign, (0, 1), exp))
15777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = 1
15787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
15797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp = Decimal(self)
15807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = len(temp._int)
15827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec == numdigits:
15837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return temp
15847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # See if we need to extend precision
15867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        expdiff = prec - numdigits
15877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if expdiff > 0:
15887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = list(temp._int)
15897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.extend([0] * expdiff)
15907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans =  Decimal( (temp._sign, tmp, temp._exp - expdiff))
15917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
15927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #OK, but maybe all the lost digits are 0.
15947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        lostdigits = self._int[expdiff:]
15957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if lostdigits == (0,) * len(lostdigits):
15967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal( (temp._sign, temp._int[:prec], temp._exp - expdiff))
15977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Rounded, but not Inexact
15987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
15997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
16007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Okay, let's round and lose data
16027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        this_function = getattr(temp, self._pick_rounding_function[rounding])
16047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Now we've got the rounding function
16057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec != context.prec:
16079fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context._shallow_copy()
16087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec = prec
16097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = this_function(prec, expdiff, context)
16107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._raise_error(Rounded)
16117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._raise_error(Inexact, 'Changed in rounding')
16127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
16147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    _pick_rounding_function = {}
16167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_down(self, prec, expdiff, context):
16187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Also known as round-towards-0, truncate."""
16197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
16207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_half_up(self, prec, expdiff, context, tmp = None):
16227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds 5 up (away from 0)"""
16237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tmp is None:
16257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = Decimal( (self._sign,self._int[:prec], self._exp - expdiff))
16267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._int[prec] >= 5:
16277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = tmp._increment(round=0, context=context)
16287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(tmp._int) > prec:
16297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
16307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return tmp
16317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_half_even(self, prec, expdiff, context):
16337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round 5 to even, rest to nearest."""
16347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
16367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        half = (self._int[prec] == 5)
16377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
16387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for digit in self._int[prec+1:]:
16397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if digit != 0:
16407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    half = 0
16417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    break
16427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
164361992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            if self._int[prec-1] & 1 == 0:
16447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return tmp
16457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._round_half_up(prec, expdiff, context, tmp)
16467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_half_down(self, prec, expdiff, context):
16487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round 5 down"""
16497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
16517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        half = (self._int[prec] == 5)
16527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
16537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for digit in self._int[prec+1:]:
16547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if digit != 0:
16557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    half = 0
16567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    break
16577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
16587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return tmp
16597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._round_half_up(prec, expdiff, context, tmp)
16607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_up(self, prec, expdiff, context):
16627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds away from 0."""
16637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
16647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for digit in self._int[prec:]:
16657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if digit != 0:
16667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp = tmp._increment(round=1, context=context)
16677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if len(tmp._int) > prec:
16687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
16697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
16707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return tmp
16717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return tmp
16727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_ceiling(self, prec, expdiff, context):
16747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds up (not away from 0 if negative.)"""
16757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
16767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._round_down(prec, expdiff, context)
16777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
16787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._round_up(prec, expdiff, context)
16797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_floor(self, prec, expdiff, context):
16817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds down (not towards 0 if negative)"""
16827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self._sign:
16837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._round_down(prec, expdiff, context)
16847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
16857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._round_up(prec, expdiff, context)
16867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __pow__(self, n, modulo = None, context=None):
16887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self ** n (mod modulo)
16897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If modulo is None (default), don't take it mod modulo.
16917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1692636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        n = _convert_other(n)
1693267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if n is NotImplemented:
1694267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return n
1695636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
16967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
16977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
16987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1699636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or n._is_special or n.adjusted() > 8:
1700636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            #Because the spot << doesn't work with really big exponents
1701636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if n._isinfinity() or n.adjusted() > 8:
1702636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation, 'x ** INF')
17037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1704636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(n, context)
1705636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1706636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
17077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1708636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if not n._isinteger():
17097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x ** (non-integer)')
17107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not n:
17127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, '0 ** 0')
17137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not n:
17157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(1)
17167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self == Decimal(1):
17187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(1)
17197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = self._sign and not n._iseven()
17217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        n = int(n)
17227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
17247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if modulo:
17257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, 'INF % x')
17267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if n > 0:
17277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
17287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (sign, (0,), 0) )
17297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #with ludicrously large exponent, just raise an overflow and return inf.
17317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not modulo and n > 0 and (self._exp + len(self._int) - 1) * n > context.Emax \
17327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger           and self:
17337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = Decimal('inf')
17357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._sign = sign
17367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
17377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Inexact)
17387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Overflow, 'Big power', sign)
17397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return tmp
17407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elength = len(str(abs(n)))
17427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        firstprec = context.prec
17437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
174499148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        if not modulo and firstprec + elength + 1 > DefaultContext.Emax:
17457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(Overflow, 'Too much precision.', sign)
17467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        mul = Decimal(self)
17487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = Decimal(1)
17499fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
17507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec + elength + 1
17517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if n < 0:
17527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #n is a long now, not Decimal instance
17537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            n = -n
17547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            mul = Decimal(1).__div__(mul, context=context)
17557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        spot = 1
17577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while spot <= n:
17587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            spot <<= 1
17597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        spot >>= 1
17617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Spot is the highest power of 2 less than n
17627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while spot:
17637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            val = val.__mul__(val, context=context)
17647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if val._isinfinity():
17657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                val = Infsign[sign]
17667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
17677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if spot & n:
17687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                val = val.__mul__(mul, context=context)
17697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if modulo is not None:
17707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                val = val.__mod__(modulo, context=context)
17717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            spot >>= 1
17727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec
17737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
177476e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger        if context._rounding_decision == ALWAYS_ROUND:
1775dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger            return val._fix(context)
17767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return val
17777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rpow__(self, other, context=None):
17797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __pow__."""
1780636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1781267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1782267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
17837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__pow__(self, context=context)
17847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def normalize(self, context=None):
17867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
17877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1788636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1789636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1790636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1791636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
17927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1793dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        dup = self._fix(context)
17947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if dup._isinfinity():
17957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return dup
17967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not dup:
17987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (dup._sign, (0,), 0) )
17997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        end = len(dup._int)
18007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = dup._exp
18017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while dup._int[end-1] == 0:
18027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp += 1
18037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            end -= 1
18047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal( (dup._sign, dup._int[:end], exp) )
18057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1807dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    def quantize(self, exp, rounding=None, context=None, watchexp=1):
18087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Quantize self so its exponent is the same as that of exp.
18097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Similar to self._rescale(exp._exp) but with error checking.
18117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1812636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or exp._is_special:
1813636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(exp, context)
1814636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1815636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
18167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1817636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if exp._isinfinity() or self._isinfinity():
1818636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if exp._isinfinity() and self._isinfinity():
1819636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return self  #if both are inf, it is OK
1820636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if context is None:
1821636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    context = getcontext()
1822636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation,
1823636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                                        'quantize with one INF')
18247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._rescale(exp._exp, rounding, context, watchexp)
18257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, other):
18277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Test whether self and other have the same exponent.
18287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        same as self._exp == other._exp, except NaN == sNaN
18307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1831636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1832636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isnan() or other._isnan():
1833636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self._isnan() and other._isnan() and True
1834636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity() or other._isinfinity():
1835636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self._isinfinity() and other._isinfinity() and True
18367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._exp == other._exp
18377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1838dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    def _rescale(self, exp, rounding=None, context=None, watchexp=1):
18397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rescales so that the exponent is exp.
18407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = exp to scale to (an integer)
18427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = rounding version
18437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        watchexp: if set (default) an error is returned if exp is greater
18447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        than Emax or less than Etiny.
18457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
18467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
18477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
18487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1849636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1850636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity():
1851636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation, 'rescale with an INF')
18527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1853636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1854636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1855636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
18567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if watchexp and (context.Emax  < exp or context.Etiny() > exp):
18587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'rescale(a, INF)')
18597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
18617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal(self)
18627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._int = (0,)
18637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._exp = exp
18647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
18657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        diff = self._exp - exp
1867dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        digits = len(self._int) + diff
18687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if watchexp and digits > context.prec:
18707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'Rescale > prec')
18717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(self)
1873dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        tmp._int = (0,) + tmp._int
18747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        digits += 1
18757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if digits < 0:
18777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._exp = -digits + tmp._exp
18787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._int = (0,1)
18797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            digits = 1
18807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = tmp._round(digits, rounding, context=context)
18817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tmp._int[0] == 0 and len(tmp._int) > 1:
18837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._int = tmp._int[1:]
18847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._exp = exp
18857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1886636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        tmp_adjusted = tmp.adjusted()
1887636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if tmp and tmp_adjusted < context.Emin:
18887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Subnormal)
1889636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        elif tmp and tmp_adjusted > context.Emax:
18907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'rescale(a, INF)')
18917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return tmp
18927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1893dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    def to_integral(self, rounding=None, context=None):
18947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds to the nearest integer, without raising inexact, rounded."""
1895636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1896636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1897636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1898636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
18997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
19007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
1901636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1902636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
19037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_flags(Rounded, Inexact)
19047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._rescale(0, rounding, context=context)
19057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._regard_flags(flags)
19067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
19077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def sqrt(self, context=None):
19097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the square root of self.
19107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Uses a converging algorithm (Xn+1 = 0.5*(Xn + self / Xn))
19127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Should quadratically approach the right answer.
19137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1914636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1915636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1916636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1917636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
19187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1919636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity() and self._sign == 0:
1920636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal(self)
19217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
19237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #exponent = self._exp / 2, using round_down.
19247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #if self._exp < 0:
19257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #    exp = (self._exp+1) // 2
19267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #else:
19277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = (self._exp) // 2
19287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign == 1:
19297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #sqrt(-0) = -0
19307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (1, (0,), exp))
19317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
19327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (0, (0,), exp))
19337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1934636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1935636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
1936636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
19377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign == 1:
19387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
19397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(self)
19417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19424837a223eea09681f0bf41d41882cad5ade0f6abRaymond Hettinger        expadd = tmp._exp // 2
194361992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger        if tmp._exp & 1:
19447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._int += (0,)
19457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._exp = 0
19467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
19477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._exp = 0
19487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19499fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
19507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_all_flags()
19517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        firstprec = context.prec
19527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = 3
195361992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger        if tmp.adjusted() & 1 == 0:
19547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal( (0, (8,1,9), tmp.adjusted()  - 2) )
19557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans.__add__(tmp.__mul__(Decimal((0, (2,5,9), -2)),
19567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                          context=context), context=context)
19574837a223eea09681f0bf41d41882cad5ade0f6abRaymond Hettinger            ans._exp -= 1 + tmp.adjusted() // 2
19587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
19597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal( (0, (2,5,9), tmp._exp + len(tmp._int)- 3) )
19607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans.__add__(tmp.__mul__(Decimal((0, (8,1,9), -3)),
19617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                          context=context), context=context)
19624837a223eea09681f0bf41d41882cad5ade0f6abRaymond Hettinger            ans._exp -= 1 + tmp.adjusted()  // 2
19637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #ans is now a linear approximation.
19657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Emax, Emin = context.Emax, context.Emin
196799148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        context.Emax, context.Emin = DefaultContext.Emax, DefaultContext.Emin
19687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        half = Decimal('0.5')
19707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        maxp = firstprec + 2
19727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_HALF_EVEN)
19737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while 1:
19747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec = min(2*context.prec - 2, maxp)
19757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = half.__mul__(ans.__add__(tmp.__div__(ans, context=context),
19767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                           context=context), context=context)
19777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.prec == maxp:
19787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
19797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #round to the answer's precision-- the only error can be 1 ulp.
19817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec
19827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prevexp = ans.adjusted()
19837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = ans._round(context=context)
19847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Now, check if the other last digits are better.
19867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec + 1
19877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # In case we rounded up another digit and we should actually go lower.
19887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prevexp != ans.adjusted():
19897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._int += (0,)
19907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._exp -= 1
19917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        lower = ans.__sub__(Decimal((0, (5,), ans._exp-1)), context=context)
19947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding(ROUND_UP)
19957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if lower.__mul__(lower, context=context) > (tmp):
19967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans.__sub__(Decimal((0, (1,), ans._exp)), context=context)
19977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
19997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            upper = ans.__add__(Decimal((0, (5,), ans._exp-1)),context=context)
20007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._set_rounding(ROUND_DOWN)
20017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if upper.__mul__(upper, context=context) < tmp:
20027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans.__add__(Decimal((0, (1,), ans._exp)),context=context)
20037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans._exp += expadd
20057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec
20077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.rounding = rounding
2008dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        ans = ans._fix(context)
20097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
20117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not ans.__mul__(ans, context=context) == self:
20127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # Only rounded/inexact if here.
20137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._regard_flags(flags)
20147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
20157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Inexact)
20167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
20177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Exact answer, so let's set the exponent right.
20187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #if self._exp < 0:
20197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #    exp = (self._exp +1)// 2
20207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #else:
20217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = self._exp // 2
20227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec += ans._exp - exp
20237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._rescale(exp, context=context)
20247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec = firstprec
20257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._regard_flags(flags)
20267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.Emax, context.Emin = Emax, Emin
20277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2028dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        return ans._fix(context)
20297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, other, context=None):
20317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the larger value.
20327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        like max(self, other) except if one is not a number, returns
20347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
20357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2036636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
2037267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
2038267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
2039636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2040636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
2041636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # if one operand is a quiet NaN and the other is number, then the
2042636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # number is always returned
2043636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            sn = self._isnan()
2044636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            on = other._isnan()
2045636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if sn or on:
2046636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if on == 1 and sn != 2:
2047636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return self
2048636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if sn == 1 and on != 2:
2049636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return other
2050636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self._check_nans(other, context)
20517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self
2053d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        c = self.__cmp__(other)
2054d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
2055d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if both operands are finite and equal in numerical value
2056d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # then an ordering is applied:
2057d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2058d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs differ then max returns the operand with the
2059d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # positive sign and min returns the operand with the negative sign
2060d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2061d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs are the same then the exponent is used to select
2062d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # the result.
2063d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if self._sign != other._sign:
2064d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                if self._sign:
2065d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                    ans = other
2066d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp < other._exp and not self._sign:
2067d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2068d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp > other._exp and self._sign:
2069d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2070d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        elif c == -1:
20717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2072636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2073636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
2074636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
207576e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger        if context._rounding_decision == ALWAYS_ROUND:
207676e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger            return ans._fix(context)
207776e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger        return ans
20787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, other, context=None):
20807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the smaller value.
20817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        like min(self, other) except if one is not a number, returns
20837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
20847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2085636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
2086267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
2087267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
2088636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2089636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
2090636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # if one operand is a quiet NaN and the other is number, then the
2091636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # number is always returned
2092636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            sn = self._isnan()
2093636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            on = other._isnan()
2094636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if sn or on:
2095636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if on == 1 and sn != 2:
2096636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return self
2097636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if sn == 1 and on != 2:
2098636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return other
2099636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self._check_nans(other, context)
21007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self
2102d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        c = self.__cmp__(other)
2103d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
2104d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if both operands are finite and equal in numerical value
2105d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # then an ordering is applied:
2106d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2107d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs differ then max returns the operand with the
2108d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # positive sign and min returns the operand with the negative sign
2109d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2110d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs are the same then the exponent is used to select
2111d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # the result.
2112d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if self._sign != other._sign:
2113d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                if other._sign:
2114d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                    ans = other
2115d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp > other._exp and not self._sign:
2116d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2117d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp < other._exp and self._sign:
2118d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2119d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        elif c == 1:
21207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2121636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2122636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
2123636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
212476e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger        if context._rounding_decision == ALWAYS_ROUND:
212576e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger            return ans._fix(context)
212676e60d687dde9d987f39e16f8fe7814daf1f1e26Raymond Hettinger        return ans
21277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinteger(self):
21297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether self is an integer"""
21307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
21317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return True
21327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rest = self._int[self._exp:]
21337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rest == (0,)*len(rest)
21347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _iseven(self):
21367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns 1 if self is even.  Assumes self is an integer."""
21377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp > 0:
21387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
213961992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger        return self._int[-1+self._exp] & 1 == 0
21407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def adjusted(self):
21427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the adjusted exponent of self"""
21437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        try:
21447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._exp + len(self._int) - 1
21457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #If NaN or Infinity, self._exp is string
21467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        except TypeError:
21477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
21487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # support for pickling, copy, and deepcopy
21507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __reduce__(self):
21517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (self.__class__, (str(self),))
21527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __copy__(self):
21547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
21557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self     # I'm immutable; therefore I am my own clone
21567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
21577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __deepcopy__(self, memo):
21597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
21607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self     # My components are also immutable
21617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
21627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2163d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger##### Context class ###########################################
2164d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger
21657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# get rounding method function:
21677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerrounding_functions = [name for name in Decimal.__dict__.keys() if name.startswith('_round_')]
21687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerfor name in rounding_functions:
21697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
21707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    globalname = name[1:].upper()
21717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    val = globals()[globalname]
21727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Decimal._pick_rounding_function[val] = name
21737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettingerdel name, val, globalname, rounding_functions
21757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2176afd5e63e243b600e5344a34760d9e6565dafe1a9Nick Coghlanclass ContextManager(object):
21771a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    """Helper class to simplify Context management.
21781a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
21791a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    Sample usage:
21801a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
21811a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    with decimal.ExtendedContext:
21821a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        s = ...
21831a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    return +s # Convert result to normal precision
21841a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
21851a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    with decimal.getcontext() as ctx:
21861a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        ctx.prec += 2
21871a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        s = ...
21881a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    return +s
21891a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
21901a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    """
21911a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __init__(self, new_context):
21921a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        self.new_context = new_context
21931a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __enter__(self):
21941a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        self.saved_context = getcontext()
21951a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        setcontext(self.new_context)
21961a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        return self.new_context
21971a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __exit__(self, t, v, tb):
21981a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        setcontext(self.saved_context)
21991a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
22007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Context(object):
22017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Contains the context for a Decimal instance.
22027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Contains:
22047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    prec - precision (for use in rounding, division, square roots..)
22057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    rounding - rounding type. (how you round)
22067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round?
2207bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger    traps - If traps[exception] = 1, then the exception is
22087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    raised when it is caused.  Otherwise, a value is
22097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    substituted in.
22107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    flags  - When an exception is caused, flags[exception] is incremented.
22117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             (Whether or not the trap_enabler is set)
22127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             Should be reset by user of Decimal instance.
22130ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emin -   Minimum exponent
22140ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emax -   Maximum exponent
22157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    capitals -      If 1, 1*10^1 is printed as 1E+1.
22167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    If 0, printed as 1e1
2217e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger    _clamp - If 1, change exponents if too high (Default 0)
22187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
22199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger
22207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, prec=None, rounding=None,
2221abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger                 traps=None, flags=None,
22227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                 _rounding_decision=None,
22230ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                 Emin=None, Emax=None,
2224e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger                 capitals=None, _clamp=0,
2225abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger                 _ignored_flags=None):
2226abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger        if flags is None:
2227abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger            flags = []
2228abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger        if _ignored_flags is None:
2229abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger            _ignored_flags = []
2230bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not isinstance(flags, dict):
2231fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger            flags = dict([(s,s in flags) for s in _signals])
2232b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
2233bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if traps is not None and not isinstance(traps, dict):
2234fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger            traps = dict([(s,s in traps) for s in _signals])
2235b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
22367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for name, val in locals().items():
22377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if val is None:
2238eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettinger                setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
22397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
22407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                setattr(self, name, val)
22417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        del self.self
22427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2243b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger    def __repr__(self):
2244bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        """Show the current context."""
2245b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        s = []
2246bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' % vars(self))
2247bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        s.append('flags=[' + ', '.join([f.__name__ for f, v in self.flags.items() if v]) + ']')
2248bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        s.append('traps=[' + ', '.join([t.__name__ for t, v in self.traps.items() if v]) + ']')
2249b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        return ', '.join(s) + ')'
2250b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger
2251afd5e63e243b600e5344a34760d9e6565dafe1a9Nick Coghlan    def get_manager(self):
2252afd5e63e243b600e5344a34760d9e6565dafe1a9Nick Coghlan        return ContextManager(self.copy())
22531a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
2254d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger    def clear_flags(self):
2255d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        """Reset all flags to zero"""
2256d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        for flag in self.flags:
2257b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger            self.flags[flag] = 0
2258d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger
22599fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def _shallow_copy(self):
22609fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a shallow copy from self."""
2261bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        nc = Context(self.prec, self.rounding, self.traps, self.flags,
22627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                         self._rounding_decision, self.Emin, self.Emax,
22637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                         self.capitals, self._clamp, self._ignored_flags)
22647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return nc
22659fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger
22669fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def copy(self):
22679fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a deep copy from self."""
22689fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        nc = Context(self.prec, self.rounding, self.traps.copy(), self.flags.copy(),
22699fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger                         self._rounding_decision, self.Emin, self.Emax,
22709fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger                         self.capitals, self._clamp, self._ignored_flags)
22719fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        return nc
22729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    __copy__ = copy
22737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22745aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    def _raise_error(self, condition, explanation = None, *args):
22757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Handles an error
22767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the flag is in _ignored_flags, returns the default response.
22787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, it increments the flag, then, if the corresponding
22797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        trap_enabler is set, it reaises the exception.  Otherwise, it returns
22807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the default value after incrementing the flag.
22817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
22825aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        error = _condition_map.get(condition, condition)
22837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if error in self._ignored_flags:
22847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Don't touch the flag
22857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return error().handle(self, *args)
22867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.flags[error] += 1
2288bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not self.traps[error]:
22897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #The errors define how to handle themselves.
22905aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger            return condition().handle(self, *args)
22917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Errors should only be risked on copies of the context
22937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #self._ignored_flags = []
22947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        raise error, explanation
22957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_all_flags(self):
22977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore all flags, if they are raised"""
2298fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger        return self._ignore_flags(*_signals)
22997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_flags(self, *flags):
23017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore the flags, if they are raised"""
23027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Do not mutate-- This way, copies of a context leave the original
23037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # alone.
23047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self._ignored_flags = (self._ignored_flags + list(flags))
23057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return list(flags)
23067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _regard_flags(self, *flags):
23087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Stop ignoring the flags, if they are raised"""
23097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if flags and isinstance(flags[0], (tuple,list)):
23107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            flags = flags[0]
23117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for flag in flags:
23127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._ignored_flags.remove(flag)
23137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23145aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    def __hash__(self):
23155aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        """A Context cannot be hashed."""
23165aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        # We inherit object.__hash__, so we must deny this explicitly
23175aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        raise TypeError, "Cannot hash a Context."
23185aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger
23197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etiny(self):
23207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns Etiny (= Emin - prec + 1)"""
23217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emin - self.prec + 1)
23227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etop(self):
2324e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """Returns maximum exponent (= Emax - prec + 1)"""
23257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emax - self.prec + 1)
23267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _set_rounding_decision(self, type):
23287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Sets the rounding decision.
23297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Sets the rounding decision, and returns the current (previous)
23317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding decision.  Often used like:
23327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23339fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
23347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # That so you don't change the calling context
23357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # if an error occurs in the middle (say DivisionImpossible is raised).
23367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
23387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        instance = instance / Decimal(2)
23397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
23407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This will make it not round for that operation.
23427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = self._rounding_decision
23457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self._rounding_decision = type
23467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rounding
23477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _set_rounding(self, type):
23497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Sets the rounding type.
23507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Sets the rounding type, and returns the current (previous)
23527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding type.  Often used like:
23537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context = context.copy()
23557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # so you don't change the calling context
23567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # if an error occurs in the middle.
23577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_UP)
23587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = self.__sub__(other, context=context)
23597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding(rounding)
23607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This will make it round up for that operation.
23627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = self.rounding
23647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.rounding= type
23657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rounding
23667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2367fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger    def create_decimal(self, num='0'):
23687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Creates a new Decimal instance but using self as context."""
23697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        d = Decimal(num, context=self)
2370dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        return d._fix(self)
23717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #Methods
23737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def abs(self, a):
23747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of the operand.
23757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the operand is negative, the result is the same as using the minus
23777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation on the operand. Otherwise, the result is the same as using
23787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the plus operation on the operand.
23797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('2.1'))
23817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.1")
23829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-100'))
23837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("100")
23849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('101.5'))
23857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("101.5")
23869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-101.5'))
23877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("101.5")
23887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__abs__(context=self)
23907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def add(self, a, b):
23927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the sum of the two operands.
23937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
23957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("19.00")
23969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
23977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.02E+4")
23987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__add__(b, context=self)
24007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _apply(self, a):
2402dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        return str(a._fix(self))
24037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, a, b):
24057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares values numerically.
24067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the signs of the operands differ, a value representing each operand
24087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ('-1' if the operand is less than zero, '0' if the operand is zero or
24097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negative zero, or '1' if the operand is greater than zero) is used in
24107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        place of that operand for the comparison instead of the actual
24117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operand.
24127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The comparison is then effected by subtracting the second operand from
24147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the first and then returning a value according to the result of the
24157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        subtraction: '-1' if the result is less than zero, '0' if the result is
24167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        zero or negative zero, or '1' if the result is greater than zero.
24177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
24197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
24209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
24217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
24229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
24237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
24249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
24257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
24269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
24277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
24289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
24297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
24307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.compare(b, context=self)
24327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide(self, a, b):
24347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Decimal division in a specified context.
24357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
24377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.333333333")
24389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
24397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.666666667")
24409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
24417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.5")
24429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
24437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.1")
24449ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
24457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
24469ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
24477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("4.00")
24489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
24497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.20")
24509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
24517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("10")
24529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
24537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1000")
24549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
24557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.20E+6")
24567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__div__(b, context=self)
24587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide_int(self, a, b):
24607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Divides two numbers and returns the integer part of the result.
24617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24629ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
24637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
24649ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
24657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24669ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
24677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__floordiv__(b, context=self)
24707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divmod(self, a, b):
24727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__divmod__(b, context=self)
24737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, a,b):
24757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """max compares two values numerically and returns the maximum.
24767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
24787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, the operands are compared as as though by the compare
24797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation. If they are numerically equal then the left-hand operand
24807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        is chosen as the result. Otherwise the maximum (closer to positive
24817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
24827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
24847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
24867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
2488d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        Decimal("1")
2489d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
2490d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        Decimal("7")
24917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.max(b, context=self)
24937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, a,b):
24957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """min compares two values numerically and returns the minimum.
24967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
24987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, the operands are compared as as though by the compare
24997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation. If they are numerically equal then the left-hand operand
25007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        is chosen as the result. Otherwise the minimum (closer to negative
25017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
25027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
25047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2")
25059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
25067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-10")
25079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
25087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
2509d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
2510d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        Decimal("7")
25117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.min(b, context=self)
25137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def minus(self, a):
25157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Minus corresponds to unary prefix minus in Python.
25167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as subtract; the
25187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation minus(a) is calculated as subtract('0', a) where the '0'
25197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
25207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('1.3'))
25227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1.3")
25239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('-1.3'))
25247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.3")
25257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__neg__(context=self)
25277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def multiply(self, a, b):
25297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """multiply multiplies two operands.
25307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a special value then the general rules apply.
25327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, the operands are multiplied together ('long multiplication'),
25337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resulting in a number which may be as long as the sum of the lengths
25347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        of the two operands.
25357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
25377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.60")
25389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
25397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("21")
25409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
25417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.72")
25429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
25437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.0")
25449ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
25457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("4.28135971E+11")
25467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mul__(b, context=self)
25487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def normalize(self, a):
2550e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """normalize reduces an operand to its simplest form.
25517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Essentially a plus operation with all trailing zeros removed from the
25537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.
25547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('2.1'))
25567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.1")
25579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-2.0'))
25587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-2")
25599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('1.200'))
25607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.2")
25619ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-120'))
25627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1.2E+2")
25639ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('120.00'))
25647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.2E+2")
25659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('0.00'))
25667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
25677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.normalize(context=self)
25697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def plus(self, a):
25717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Plus corresponds to unary prefix plus in Python.
25727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as add; the
25747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation plus(a) is calculated as add('0', a) where the '0'
25757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
25767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('1.3'))
25787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.3")
25799ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('-1.3'))
25807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1.3")
25817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pos__(context=self)
25837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def power(self, a, b, modulo=None):
25857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Raises a to the power of b, to modulo if given.
25867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The right-hand operand must be a whole number whose integer part (after
25887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        any exponent has been applied) has no more than 9 digits and whose
25897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        fractional part (if any) is all zeros before any rounding. The operand
25907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        may be positive, negative, or zero; if negative, the absolute value of
25917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the power is used, and the left-hand operand is inverted (divided into
25927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1) before use.
25937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the increased precision needed for the intermediate calculations
25957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exceeds the capabilities of the implementation then an Invalid operation
25967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        condition is raised.
25977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If, when raising to a negative power, an underflow occurs during the
25997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        division into 1, the operation is not halted at that point but
26007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        continues.
26017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26029ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('2'), Decimal('3'))
26037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("8")
26049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('2'), Decimal('-3'))
26057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.125")
26069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('1.7'), Decimal('8'))
26077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("69.7575744")
26089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-2'))
26097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
26109ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-1'))
26117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
26129ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('0'))
26137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
26149ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('1'))
26157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("Infinity")
26169ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('2'))
26177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("Infinity")
26189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-2'))
26197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
26209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-1'))
26217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0")
26229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('0'))
26237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
26249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('1'))
26257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-Infinity")
26269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('2'))
26277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("Infinity")
26289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('0'), Decimal('0'))
26297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
26307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
26317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pow__(b, modulo, context=self)
26327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def quantize(self, a, b):
26347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a value equal to 'a' (rounded) and having the exponent of 'b'.
26357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The coefficient of the result is derived from that of the left-hand
26377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operand. It may be rounded using the current rounding setting (if the
26387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exponent is being increased), multiplied by a positive power of ten (if
26397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the exponent is being decreased), or is unchanged (if the exponent is
26407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        already equal to that of the right-hand operand).
26417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Unlike other operations, if the length of the coefficient after the
26437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        quantize operation would be greater than precision then an Invalid
26447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation condition is raised. This guarantees that, unless there is an
26457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        error condition, the exponent of the result of a quantize is always
26467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        equal to that of the right-hand operand.
26477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Also unlike other operations, quantize will never raise Underflow, even
26497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if the result is subnormal and inexact.
26507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26519ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
26527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.170")
26539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
26547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.17")
26559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
26567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.2")
26579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
26587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2")
26599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
26607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0E+1")
26619ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
26627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-Infinity")
26639ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
26647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
26659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
26667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0")
26679ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
26687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0E+5")
26699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
26707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
26719ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
26727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
26739ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
26747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("217.0")
26759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
26767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("217")
26779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
26787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.2E+2")
26799ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
26807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2E+2")
26817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
26827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.quantize(b, context=self)
26837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder(self, a, b):
26857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the remainder from integer division.
26867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is the residue of the dividend after the operation of
26887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        calculating integer division as described for divide-integer, rounded to
26897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        precision digits if necessary. The sign of the result, if non-zero, is
26907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the same as that of the original dividend.
26917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
26937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
26947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
26957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
26977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.1")
26989ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
26997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
27009ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
27017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
27029ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
27037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.2")
27049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
27057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.1")
27069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
27077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
27087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mod__(b, context=self)
27107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, a, b):
27127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns to be "a - b * n", where n is the integer nearest the exact
27137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        value of "x / b" (if two integers are equally near then the even one
27147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        is chosen). If the result is equal to 0 then its sign will be the
27157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign of a.
27167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
27187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
27197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
27207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
27227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.9")
27239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
27247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-2")
27259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
27267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
27279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
27287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
27299ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
27307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.2")
27319ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
27327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.1")
27339ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
27347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.3")
27357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.remainder_near(b, context=self)
27377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, a, b):
27397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns True if the two operands have the same exponent.
27407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is never affected by either the sign or the coefficient of
27427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        either operand.
27437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27449ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
27457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
27469ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
27477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
27489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
27497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
27509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
27517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
27527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.same_quantum(b)
27547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def sqrt(self, a):
27567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the square root of a non-negative number to context precision.
27577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the result must be inexact, it is rounded using the round-half-even
27597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        algorithm.
27607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27619ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0'))
27627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
27639ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('-0'))
27647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0")
27659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0.39'))
27667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.624499800")
27679ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('100'))
27687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("10")
27699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1'))
27707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
27719ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.0'))
27727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
27739ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.00'))
27747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
27759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('7'))
27767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.64575131")
27779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('10'))
27787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.16227766")
27799ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.prec
27806ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        9
27817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.sqrt(context=self)
27837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def subtract(self, a, b):
2785f33d01d304c349a7f555779c7c99930f1203adb7Georg Brandl        """Return the difference between the two operands.
27867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
27887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.23")
27899ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
27907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.00")
27919ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
27927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.77")
27937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__sub__(b, context=self)
27957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, a):
27977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
27987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
28007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
28017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.to_eng_string(context=self)
28027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_sci_string(self, a):
28047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
28057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
28077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
28087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__str__(context=self)
28097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_integral(self, a):
28117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds to an integer.
28127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        When the operand has a negative exponent, the result is the same
28147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        as using the quantize() operation using the given operand as the
28157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
28167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        of the operand as the precision setting, except that no flags will
28177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        be set. The rounding mode is taken from the context.
28187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('2.1'))
28207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2")
28219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('100'))
28227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("100")
28239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('100.0'))
28247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("100")
28259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('101.5'))
28267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("102")
28279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('-101.5'))
28287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-102")
28299ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('10E+5'))
28307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0E+6")
28319ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('7.89E+77'))
28327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("7.89E+77")
28339ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('-Inf'))
28347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-Infinity")
28357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
28367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.to_integral(context=self)
28377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass _WorkRep(object):
28397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __slots__ = ('sign','int','exp')
284017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger    # sign: 0 or 1
2841636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # int:  int or long
28427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # exp:  None, int, or string
28437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, value=None):
28457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if value is None:
28467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = None
2847636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self.int = 0
28487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = None
284917931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        elif isinstance(value, Decimal):
285017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            self.sign = value._sign
2851636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            cum = 0
285217931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            for digit  in value._int:
2853636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                cum = cum * 10 + digit
2854636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self.int = cum
28557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value._exp
285617931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        else:
285717931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            # assert isinstance(value, tuple)
28587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = value[0]
28597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int = value[1]
28607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value[2]
28617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
28637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
28647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __str__ = __repr__
28667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _normalize(op1, op2, shouldround = 0, prec = 0):
28707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Normalizes op1, op2 to have the same exp and length of coefficient.
28717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Done during addition.
28737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
28747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Yes, the exponent is a long, but the difference between exponents
28757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # must be an int-- otherwise you'd get a big memory problem.
28767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    numdigits = int(op1.exp - op2.exp)
28777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if numdigits < 0:
28787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = -numdigits
28797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op2
28807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op1
28817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
28827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op1
28837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op2
28847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2885636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2886636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    if shouldround and numdigits > prec + 1:
2887636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # Big difference in exponents - check the adjusted exponents
2888636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        tmp_len = len(str(tmp.int))
2889636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other_len = len(str(other.int))
2890636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if numdigits > (other_len + prec + 1 - tmp_len):
2891636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # If the difference in adjusted exps is > prec+1, we know
2892636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # other is insignificant, so might as well put a 1 after the precision.
2893636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # (since this is only for addition.)  Also stops use of massive longs.
2894636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2895636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            extend = prec + 2 - tmp_len
2896636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if extend <= 0:
2897636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                extend = 1
2898636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            tmp.int *= 10 ** extend
2899636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            tmp.exp -= extend
2900636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            other.int = 1
2901636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            other.exp = tmp.exp
2902636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return op1, op2
2903636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2904636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    tmp.int *= 10 ** numdigits
2905636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    tmp.exp -= numdigits
29067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return op1, op2
29077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _adjust_coefficients(op1, op2):
2909636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    """Adjust op1, op2 so that op2.int * 10 > op1.int >= op2.int.
29107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Returns the adjusted op1, op2 as well as the change in op1.exp-op2.exp.
29127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Used on _WorkRep instances during division.
29147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
29157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    adjust = 0
2916636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    #If op1 is smaller, make it larger
2917636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    while op2.int > op1.int:
2918636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        op1.int *= 10
29197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.exp -= 1
2920636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        adjust += 1
29217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2922636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    #If op2 is too small, make it larger
2923636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    while op1.int >= (10 * op2.int):
2924636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        op2.int *= 10
29257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.exp -= 1
29267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust -= 1
2927636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
29287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return op1, op2, adjust
29297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Helper Functions ########################################
29317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2932636a6b100fe6083388bc5315758326078abe65b4Raymond Hettingerdef _convert_other(other):
2933636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    """Convert other to Decimal.
2934636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2935636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    Verifies that it's ok to use in an implicit construction.
2936636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    """
2937636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    if isinstance(other, Decimal):
2938636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        return other
2939636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    if isinstance(other, (int, long)):
2940636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        return Decimal(other)
2941267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger    return NotImplemented
2942636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
29437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger_infinity_map = {
29447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'inf' : 1,
29457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'infinity' : 1,
29467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '+inf' : 1,
29477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '+infinity' : 1,
29487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '-inf' : -1,
29497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '-infinity' : -1
29507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger}
29517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29520ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerdef _isinfinity(num):
29537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Determines whether a string or float is infinity.
29547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29550ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    +1 for negative infinity; 0 for finite ; +1 for positive infinity
29567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
29577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    num = str(num).lower()
29587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return _infinity_map.get(num, 0)
29597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29600ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerdef _isnan(num):
29617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Determines whether a string or float is NaN
29627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (1, sign, diagnostic info as string) => NaN
29647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (2, sign, diagnostic info as string) => sNaN
29657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    0 => not a NaN
29667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
29677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    num = str(num).lower()
29687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if not num:
29697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
29707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #get the sign, get rid of trailing [+-]
29727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    sign = 0
29737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if num[0] == '+':
29747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        num = num[1:]
29757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    elif num[0] == '-':  #elif avoids '+-nan'
29767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        num = num[1:]
29777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = 1
29787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if num.startswith('nan'):
29807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(num) > 3 and not num[3:].isdigit(): #diagnostic info
29817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
29827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (1, sign, num[3:].lstrip('0'))
29837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if num.startswith('snan'):
29847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(num) > 4 and not num[4:].isdigit():
29857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
29867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (2, sign, num[4:].lstrip('0'))
29877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return 0
29887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Setup Specific Contexts ################################
29917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# The default context prototype used by Context()
2993fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger# Is mutable, so that new contexts can have different default values
29947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDefaultContext = Context(
29966ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=28, rounding=ROUND_HALF_EVEN,
2997bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation],
2998bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
29997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        _rounding_decision=ALWAYS_ROUND,
300099148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emax=999999999,
300199148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emin=-999999999,
3002e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        capitals=1
30037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
30047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Pre-made alternate contexts offered by the specification
30067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Don't change these; the user should be able to select these
30077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# contexts and be able to reproduce results from other implementations
30087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# of the spec.
30097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30109ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerBasicContext = Context(
30117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prec=9, rounding=ROUND_HALF_UP,
3012bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
3013bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
30147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
30157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30169ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerExtendedContext = Context(
30176ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=9, rounding=ROUND_HALF_EVEN,
3018bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[],
3019bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
30207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
30217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3023d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger##### Useful Constants (internal use only) ####################
30247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Reusable defaults
30267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInf = Decimal('Inf')
30277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingernegInf = Decimal('-Inf')
30287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Infsign[sign] is infinity w/ that sign
30307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfsign = (Inf, negInf)
30317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN = Decimal('NaN')
30337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### crud for parsing strings #################################
30367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport re
30377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# There's an optional sign at the start, and an optional exponent
30397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# at the end.  The exponent has an optional sign and at least one
30407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# digit.  In between, must have either at least one digit followed
30417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# by an optional fraction, or a decimal point followed by at least
30427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# one digit.  Yuck.
30437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger_parser = re.compile(r"""
30457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
30467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (?P<sign>[-+])?
30477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (
30487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (?P<int>\d+) (\. (?P<frac>\d*))?
30497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    |
30507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        \. (?P<onlyfrac>\d+)
30517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    )
30527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    ([eE](?P<exp>[-+]? \d+))?
30537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
30547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    $
30557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger""", re.VERBOSE).match #Uncomment the \s* to allow leading or trailing spaces.
30567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdel re
30587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# return sign, n, p s.t. float string value == -1**sign * n * 10**p exactly
30607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _string2exact(s):
30627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    m = _parser(s)
30637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if m is None:
30647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        raise ValueError("invalid literal for Decimal: %r" % s)
30657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if m.group('sign') == "-":
30677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = 1
30687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
30697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = 0
30707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    exp = m.group('exp')
30727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if exp is None:
30737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = 0
30747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
30757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = int(exp)
30767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    intpart = m.group('int')
30787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if intpart is None:
30797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        intpart = ""
30807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        fracpart = m.group('onlyfrac')
30817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
30827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        fracpart = m.group('frac')
30837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if fracpart is None:
30847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            fracpart = ""
30857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    exp -= len(fracpart)
30877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    mantissa = intpart + fracpart
30897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    tmp = map(int, mantissa)
30907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    backup = tmp
30917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    while tmp and tmp[0] == 0:
30927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        del tmp[0]
30937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # It's a zero
30957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if not tmp:
30967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if backup:
30977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (sign, tuple(backup), exp)
30987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (sign, (0,), exp)
30997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    mantissa = tuple(tmp)
31007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return (sign, mantissa, exp)
31027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerif __name__ == '__main__':
31057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    import doctest, sys
31067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    doctest.testmod(sys.modules[__name__])
3107