decimal.py revision 27dbcf2162c61d5ba248c57c89ff4fa3d85a21c7
17c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Copyright (c) 2004 Python Software Foundation.
27c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# All rights reserved.
37c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Written by Eric Price <eprice at tjhsst.edu>
57c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Facundo Batista <facundo at taniquetil.com.ar>
67c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Raymond Hettinger <python at rcn.com>
71f34eb17b501687c1251678bcffab9accd432591Fred Drake#    and Aahz <aahz at pobox.com>
87c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Tim Peters
97c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1027dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# This module is currently Py2.3 compatible and should be kept that way
1127dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# unless a major compelling advantage arises.  IOW, 2.3 compatibility is
1227dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# strongly preferred, but not guaranteed.
1327dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger
1427dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# Also, this module should be kept in sync with the latest updates of
1527dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# the IBM specification as it evolves.  Those updates will be treated
1627dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# as bug fixes (deviation from the spec is a compatibility, usability
1727dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# bug) and will be backported.  At this point the spec is stabilizing
1827dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# and the updates are becoming fewer, smaller, and less significant.
197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"""
217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThis is a Py2.3 implementation of decimal floating point arithmetic based on
227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerthe General Decimal Arithmetic Specification:
237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    www2.hursley.ibm.com/decimal/decarith.html
257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
260ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerand IEEE standard 854-1987:
277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal floating point has finite precision with arbitrarily large bounds.
317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThe purpose of the module is to support arithmetic using familiar
337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"schoolhouse" rules and to avoid the some of tricky representation
347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerissues associated with binary floating point.  The package is especially
357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingeruseful for financial applications or for contexts where users have
367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerexpectations that are at odds with binary floating point (for instance,
377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerin binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerof the expected Decimal("0.00") returned by decimal floating point).
397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerHere are some examples of using the decimal module:
417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> from decimal import *
43bd7f76dd04780304c397323ae994092ce759d5a2Raymond Hettinger>>> setcontext(ExtendedContext)
447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(0)
457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("0")
467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("1")
477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("1")
487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("-.0123")
497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("-0.0123")
507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(123456)
517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("123456")
527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("123.45e12345678901234567890")
537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("1.2345E+12345678901234567892")
547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("1.33") + Decimal("1.27")
557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("2.60")
567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41")
577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("-2.20")
587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> dig = Decimal(1)
597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3)
607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333
617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> getcontext().prec = 18
627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3)
637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333333333333
647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig.sqrt()
657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3).sqrt()
677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1.73205080756887729
687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3) ** 123
697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger4.85192780976896427E+58
707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> inf = Decimal(1) / Decimal(0)
717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print inf
727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity
737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> neginf = Decimal(-1) / Decimal(0)
747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf
757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity
767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf + inf
777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN
787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf * inf
797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity
807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0
817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity
82bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> getcontext().traps[DivisionByZero] = 1
837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0
847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last):
857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDivisionByZero: x / 0
897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c = Context()
90bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0
915aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0
937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c.divide(Decimal(0), Decimal(0))
947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("NaN")
95bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 1
965aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
985aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0
995aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0
1017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0))
1027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last):
1037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1065aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond HettingerInvalidOperation: 0 / 0
1075aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
1095aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0
110bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0
1117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0))
1127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN
1135aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
1157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>>
1167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"""
1177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger__all__ = [
1197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Two major classes
1207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'Decimal', 'Context',
1217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Contexts
1239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    'DefaultContext', 'BasicContext', 'ExtendedContext',
1247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Exceptions
126d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger    'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
127d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger    'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
1287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Constants for use in setting up contexts
1307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
1317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN',
1327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Functions for manipulating contexts
1340ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    'setcontext', 'getcontext'
1357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger]
1367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport threading
1387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport copy
1397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport operator
1407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Rounding
1420ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_DOWN = 'ROUND_DOWN'
1430ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_UP = 'ROUND_HALF_UP'
1440ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
1450ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_CEILING = 'ROUND_CEILING'
1460ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_FLOOR = 'ROUND_FLOOR'
1470ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_UP = 'ROUND_UP'
1480ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
1497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger#Rounding decision (not part of the public API)
1510ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerNEVER_ROUND = 'NEVER_ROUND'    # Round in division (non-divmod), sqrt ONLY
1520ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerALWAYS_ROUND = 'ALWAYS_ROUND'  # Every operation rounds at end.
1537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Errors
1557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DecimalException(ArithmeticError):
1575aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    """Base exception class.
1587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Used exceptions derive from this.
1607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    If an exception derives from another exception besides this (such as
1617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
1627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    called if the others are present.  This isn't actually used for
1637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    anything, though.
1647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    handle  -- Called when context._raise_error is called and the
1667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               trap_enabler is set.  First argument is self, second is the
1677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               context.  More arguments can be given, those being after
1687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               the explanation in _raise_error (For example,
1697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               context._raise_error(NewError, '(-x)!', self._sign) would
1707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               call NewError().handle(context, self._sign).)
1717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    To define a new exception, it should be sufficient to have it derive
1737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    from DecimalException.
1747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
1767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        pass
1777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Clamped(DecimalException):
1807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent of a 0 changed to fit bounds.
1817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals clamped if the exponent of a result has been
1837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    altered in order to fit the constraints of a specific concrete
1847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    representation. This may occur when the exponent of a zero result would
1857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    be outside the bounds of a representation, or  when a large normal
1867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    number would have an encoded exponent that cannot be represented. In
1877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    this latter case, the exponent is reduced to fit and the corresponding
1887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    number of zero digits are appended to the coefficient ("fold-down").
1897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidOperation(DecimalException):
1937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """An invalid operation was performed.
1947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Various bad things cause this:
1967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Something creates a signaling NaN
1987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -INF + INF
1997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger     0 * (+-)INF
2007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger     (+-)INF / (+-)INF
2017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x % 0
2027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (+-)INF % x
2037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x._rescale( non-integer )
2047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    sqrt(-x) , x > 0
2057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    0 ** 0
2067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (non-integer)
2077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (+-)INF
2087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    An operand is invalid
2097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if args:
2127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if args[0] == 1: #sNaN, must drop 's' but keep diagnostics
2137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (args[1]._sign, args[1]._int, 'n') )
2147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass ConversionSyntax(InvalidOperation):
2177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Trying to convert badly formed string.
2187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an string is being
2207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    converted to a number and it does not conform to the numeric string
2217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    syntax. The result is [0,qNaN].
2227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (0, (0,), 'n') #Passed to something which uses a tuple.
2267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionByZero(DecimalException, ZeroDivisionError):
2287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Division by 0.
2297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals division-by-zero if division of a finite number
2317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero was attempted (during a divide-integer or divide operation, or a
2327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    power operation with negative right-hand operand), and the dividend was
2337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not zero.
2347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result of the operation is [sign,inf], where sign is the exclusive
2367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or of the signs of the operands for divide, or is 1 for an odd power of
2377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -0, for power.
2387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, sign, double = None, *args):
2417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if double is not None:
2427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (Infsign[sign],)*2
2437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Infsign[sign]
2447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionImpossible(InvalidOperation):
2467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Cannot perform the division adequately.
2477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if the integer result of a
2497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    divide-integer or remainder operation had too many digits (would be
2507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    longer than precision). The result is [0,qNaN].
2517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (NaN, NaN)
2557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionUndefined(InvalidOperation, ZeroDivisionError):
2577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Undefined result of division.
2587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if division by zero was
2607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    attempted (during a divide-integer, divide, or remainder operation), and
2617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the dividend is also zero. The result is [0,qNaN].
2627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, tup=None, *args):
2657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tup is not None:
2667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (NaN, NaN) #for 0 %0, 0 // 0
2677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Inexact(DecimalException):
2707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Had to round, losing information.
2717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals inexact whenever the result of an operation is
2737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not exact (that is, it needed to be rounded and any discarded digits
2747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    were non-zero), or if an overflow or underflow condition occurs. The
2757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
2767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The inexact signal may be tested (or trapped) to determine if a given
2787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) was inexact.
2797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2805aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    pass
2817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidContext(InvalidOperation):
2837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Invalid context.  Unknown rounding, for example.
2847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an invalid context was
2867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    detected during an operation. This can occur if contexts are not checked
2877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    on creation and either the precision exceeds the capability of the
2887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    underlying concrete representation or an unknown or unsupported rounding
2897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    was specified. These aspects of the context need only be checked when
2907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the values are required to be used. The result is [0,qNaN].
2917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Rounded(DecimalException):
2977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Number got rounded (not  necessarily changed during rounding).
2987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals rounded whenever the result of an operation is
3007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    rounded (that is, some zero or non-zero digits were discarded from the
3017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    coefficient), or if an overflow or underflow condition occurs. The
3027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
3037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The rounded signal may be tested (or trapped) to determine if a given
3057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) caused a loss of precision.
3067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3075aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    pass
3087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Subnormal(DecimalException):
3107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent < Emin before rounding.
3117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals subnormal whenever the result of a conversion or
3137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation is subnormal (that is, its adjusted exponent is less than
3147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Emin, before any rounding). The result in all cases is unchanged.
3157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The subnormal signal may be tested (or trapped) to determine if a given
3177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or operation (or sequence of operations) yielded a subnormal result.
3187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    pass
3207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Overflow(Inexact, Rounded):
3227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical overflow.
3237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals overflow if the adjusted exponent of a result
3257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (from a conversion or from an operation that is not an attempt to divide
3267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero), after rounding, would be greater than the largest value that
3277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    can be handled by the implementation (the value Emax).
3287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result depends on the rounding mode:
3307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    For round-half-up and round-half-even (and for round-half-down and
3327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-up, if implemented), the result of the operation is [sign,inf],
3337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    where sign is the sign of the intermediate result. For round-down, the
3347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result is the largest finite number that can be represented in the
3357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    current precision, with the sign of the intermediate result. For
3367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-ceiling, the result is the same as for round-down if the sign of
3377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
3387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the result is the same as for round-down if the sign of the intermediate
3397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
3407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    will also be raised.
3417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger   """
3427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, sign, *args):
3447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
3457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                     ROUND_HALF_DOWN, ROUND_UP):
3467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Infsign[sign]
3477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 0:
3487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_CEILING:
3497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
3507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal((sign, (9,)*context.prec,
3517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                            context.Emax-context.prec+1))
3527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 1:
3537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_FLOOR:
3547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
3557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (sign, (9,)*context.prec,
3567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                             context.Emax-context.prec+1))
3577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Underflow(Inexact, Rounded, Subnormal):
3607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical underflow with result rounded to 0.
3617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals underflow if a result is inexact and the
3637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    adjusted exponent of the result would be smaller (more negative) than
3647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the smallest value that can be handled by the implementation (the value
3657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Emin). That is, the result is both inexact and subnormal.
3667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result after an underflow will be a subnormal number rounded, if
3687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    necessary, so that its exponent is not less than Etiny. This may result
3697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    in 0 with the sign of the intermediate result and an exponent of Etiny.
3707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    In all cases, Inexact, Rounded, and Subnormal will also be raised.
3727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3745aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# List of public traps and flags
375fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
3765aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger           Underflow, InvalidOperation, Subnormal]
3777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3785aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# Map conditions (per the spec) to signals
3795aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger_condition_map = {ConversionSyntax:InvalidOperation,
3805aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionImpossible:InvalidOperation,
3815aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionUndefined:InvalidOperation,
3825aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  InvalidContext:InvalidOperation}
3837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Context Functions #######################################
3857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
386ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# The getcontext() and setcontext() function manage access to a thread-local
387ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# current context.  Py2.4 offers direct support for thread locals.  If that
388ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# is not available, use threading.currentThread() which is slower but will
389ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# work for older Pythons.
390ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
391ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingertry:
392ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    threading.local
393ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
394ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerexcept AttributeError:
395ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
396ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    #To fix reloading, force it to create a new context
397ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    #Old contexts have different exceptions in their dicts, making problems.
398ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    if hasattr(threading.currentThread(), '__decimal_context__'):
399ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        del threading.currentThread().__decimal_context__
400ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
401ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context):
402ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
403ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4049fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
40561992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
4067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        threading.currentThread().__decimal_context__ = context
407ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
408ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext():
409ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
410ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
411ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
412ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
413ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
414ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
415ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
416ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return threading.currentThread().__decimal_context__
417ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
418ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
419ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            threading.currentThread().__decimal_context__ = context
420ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
421ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
422ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerelse:
423ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
424ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    local = threading.local()
4259fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    if hasattr(local, '__decimal_context__'):
4269fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        del local.__decimal_context__
427ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
428ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext(_local=local):
429ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
430ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
431ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
432ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
433ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
434ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
435ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
436ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return _local.__decimal_context__
437ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
438ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
439ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            _local.__decimal_context__ = context
440ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
441ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
442ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context, _local=local):
443ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
444ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4459fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
44661992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
447ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        _local.__decimal_context__ = context
448ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
449ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    del threading, local        # Don't contaminate the namespace
4507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Decimal class ###########################################
4537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Decimal(object):
4557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Floating point class for decimal arithmetic."""
4567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __slots__ = ('_exp','_int','_sign')
4587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, value="0", context=None):
4607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Create a decimal point instance.
4617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal('3.14')              # string input
4637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.14")
4647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal((0, (3, 1, 4), -2))  # tuple input (sign, digit_tuple, exponent)
4657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.14")
4667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(314)                 # int or long
4677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("314")
4687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(Decimal(314))        # another decimal instance
4697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("314")
4707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
4717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
4727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
4737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, (int,long)):
4757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            value = str(value)
4767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # String?
4787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # REs insist on real strings, so we can too.
4797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, basestring):
4800ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger            if _isinfinity(value):
4817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._exp = 'F'
4827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._int = (0,)
4830ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                sign = _isinfinity(value)
4847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if sign == 1:
4857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._sign = 0
4867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
4877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._sign = 1
4887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return
4890ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger            if _isnan(value):
4900ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                sig, sign, diag = _isnan(value)
4917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if len(diag) > context.prec: #Diagnostic info too long
4927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._sign, self._int, self._exp = \
4937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                context._raise_error(ConversionSyntax)
4947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return
4957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if sig == 1:
4967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._exp = 'n' #qNaN
4977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else: #sig == 2
4987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._exp = 'N' #sNaN
4997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._sign = sign
5007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._int = tuple(map(int, diag)) #Diagnostic info
5017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return
502d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger            try:
503d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger                self._sign, self._int, self._exp = _string2exact(value)
504d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger            except ValueError:
505d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger                self._sign, self._int, self._exp = context._raise_error(ConversionSyntax)
5067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return
5077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # tuple/list conversion (possibly from as_tuple())
5097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, (list,tuple)):
5107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(value) != 3:
5117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                raise ValueError, 'Invalid arguments'
5127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if value[0] not in [0,1]:
5137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                raise ValueError, 'Invalid sign'
5147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for digit in value[1]:
5157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if not isinstance(digit, (int,long)) or digit < 0:
5167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    raise ValueError, "The second value in the tuple must be composed of non negative integer elements."
5177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._sign = value[0]
5197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._int  = tuple(value[1])
5207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if value[2] in ('F','n','N'):
5217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._exp = value[2]
5227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
5237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._exp  = int(value[2])
5247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return
5257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Turn an intermediate value back to Decimal()
5277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, _WorkRep):
5287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if value.sign == 1:
5297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._sign = 0
5307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
5317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._sign = 1
5327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._int = tuple(value.int)
5337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._exp = int(value.exp)
5347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return
5357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, Decimal):
5374e0e1b6a540e664e89739456db4c706701bf062bTim Peters            self._exp  = value._exp
5384e0e1b6a540e664e89739456db4c706701bf062bTim Peters            self._sign = value._sign
5394e0e1b6a540e664e89739456db4c706701bf062bTim Peters            self._int  = value._int
5404e0e1b6a540e664e89739456db4c706701bf062bTim Peters            return
5417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
542bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if isinstance(value, float):
543bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger            raise TypeError("Cannot convert float to Decimal.  " +
544bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger                            "First convert the float to a string")
545bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger
546bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        raise TypeError("Cannot convert %r" % value)
5477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _convert_other(self, other):
5497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Convert other to Decimal.
5507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Verifies that it's ok to use in an implicit construction.
5527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(other, Decimal):
5547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return other
5557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(other, (int, long)):
5567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            other = Decimal(other)
5577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return other
5587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        raise TypeError, "You can interact Decimal only with int, long or Decimal data types."
5607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isnan(self):
5627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
5637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if a number
5657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if NaN
5667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        2 if sNaN
5677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 'n':
5697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
5707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._exp == 'N':
5717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 2
5727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
5737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinfinity(self):
5757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is infinite
5767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if finite or not a number
5787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if +INF
5797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 if -INF
5807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 'F':
5827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign:
5837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return -1
5847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
5857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
5867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _check_nans(self, other = None, context=None):
5887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
5897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are sNaN, signal
5917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are NaN return nan
5927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
5937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Done before operations.
5957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
5977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
5987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isnan() == 2:
6007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'sNaN',
6017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                       1, self)
6027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other is not None and other._isnan() == 2:
6037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'sNaN',
6047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                       1, other)
6057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isnan():
6067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
6077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other is not None and other._isnan():
6087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return other
6097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
6107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __nonzero__(self):
6127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Is the number non-zero?
6137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if self == 0
6157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if self != 0
6167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
6177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(self._exp, str):
6187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
6197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._int != (0,)*len(self._int)
6207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __cmp__(self, other, context=None):
6227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
6237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
6247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
6257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
6277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
6287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
6297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
6317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0 #If both 0, sign comparison isn't certain.
6327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #If different signs, neg one is less
6347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._sign < self._sign:
6357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -1
6367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign < other._sign:
6377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
6387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # INF = INF
6407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity() and other._isinfinity():
6417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
6427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
6437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (-1)**self._sign
6447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._isinfinity():
6457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -((-1)**other._sign)
6467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.adjusted() == other.adjusted() and \
6487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger           self._int + (0,)*(self._exp - other._exp) == \
6497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger           other._int + (0,)*(other._exp - self._exp):
6507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0 #equal, except in precision. ([0]*(-x) = [])
6517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self.adjusted() > other.adjusted() and self._int[0] != 0:
6527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (-1)**self._sign
6537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self.adjusted < other.adjusted() and other._int[0] != 0:
6547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -((-1)**self._sign)
6557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6569fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
6577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_UP) #round away from 0
6587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_all_flags()
6607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        res = self.__sub__(other, context=context)
6617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._regard_flags(*flags)
6637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.rounding = rounding
6657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not res:
6677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
6687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif res._sign:
6697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -1
6707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 1
6717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6720aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __eq__(self, other):
6730aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        if not isinstance(other, (Decimal, int, long)):
6740aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger            return False
6750aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        return self.__cmp__(other) == 0
6760aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
6770aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __ne__(self, other):
6780aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        if not isinstance(other, (Decimal, int, long)):
6790aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger            return True
6800aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        return self.__cmp__(other) != 0
6810aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
6827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, other, context=None):
6837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares one to another.
6847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 => a < b
6867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0  => a = b
6877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1  => a > b
6887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN => one is NaN
6897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Like __cmp__, but returns Decimal instances.
6907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
6917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
6927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
6937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
6947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #compare(NaN, NaN) = NaN
6967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
6977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
6987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
6997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal(self.__cmp__(other, context))
7017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __hash__(self):
7037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """x.__hash__() <==> hash(x)"""
7047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Decimal integers must hash the same as the ints
7057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Non-integer decimals are normalized and hashed as strings
7067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Normalization assures that hast(100E-1) == hash(10)
7077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        i = int(self)
7087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self == Decimal(i):
7097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return hash(i)
7107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        assert self.__nonzero__()   # '-0' handled by integer case
7117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return hash(str(self.normalize()))
7127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def as_tuple(self):
7147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as a triple tuple.
7157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        To show the internals exactly as they are.
7177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
7187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (self._sign, self._int, self._exp)
7197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
7217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as an instance of Decimal."""
7227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Invariant:  eval(repr(d)) == d
7237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 'Decimal("%s")' % str(self)
7247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __str__(self, eng = 0, context=None):
7267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return string representation of the number in scientific notation.
7277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Captures all of the information in the underlying representation.
7297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
7307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isnan():
7327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            minus = '-'*self._sign
7337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._int == (0,):
7347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                info = ''
7357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
7367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                info = ''.join(map(str, self._int))
7377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._isnan() == 2:
7387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return minus + 'sNaN' + info
7397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return minus + 'NaN' + info
7407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
7417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            minus = '-'*self._sign
7427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return minus + 'Infinity'
7437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
7457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
7467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = map(str, self._int)
7487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = len(self._int)
7497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        leftdigits = self._exp + numdigits
7507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if eng and not self: #self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY
7517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._exp < 0 and self._exp >= -6: #short, no need for e/E
7527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s = '-'*self._sign + '0.' + '0'*(abs(self._exp))
7537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return s
7547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #exp is closest mult. of 3 >= self._exp
7557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = ((self._exp - 1)// 3 + 1) * 3
7567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp != self._exp:
7577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s = '0.'+'0'*(exp - self._exp)
7587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
7597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s = '0'
7607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp != 0:
7617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if context.capitals:
7627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    s += 'E'
7637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
7647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    s += 'e'
7657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if exp > 0:
7667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    s += '+' #0.0e+3, not 0.0e3
7677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s += str(exp)
7687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            s = '-'*self._sign + s
7697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return s
7707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if eng:
7717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            dotplace = (leftdigits-1)%3+1
7727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            adjexp = leftdigits -1 - (leftdigits-1)%3
7737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
7747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            adjexp = leftdigits-1
7757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            dotplace = 1
7767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 0:
7777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            pass
7787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._exp < 0 and adjexp >= 0:
7797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.insert(leftdigits, '.')
7807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._exp < 0 and adjexp >= -6:
7817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp[0:0] = ['0'] * int(-leftdigits)
7827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.insert(0, '0.')
7837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
7847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if numdigits > dotplace:
7857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp.insert(dotplace, '.')
7867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            elif numdigits < dotplace:
7877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp.extend(['0']*(dotplace-numdigits))
7887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if adjexp:
7897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if not context.capitals:
7907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    tmp.append('e')
7917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
7927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    tmp.append('E')
7937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    if adjexp > 0:
7947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                        tmp.append('+')
7957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp.append(str(adjexp))
7967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if eng:
7977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            while tmp[0:1] == ['0']:
7987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp[0:1] = []
7997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(tmp) == 0 or tmp[0] == '.' or tmp[0].lower() == 'e':
8007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp[0:0] = ['0']
8017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
8027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.insert(0, '-')
8037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ''.join(tmp)
8057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, context=None):
8077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Convert to engineering-type string.
8087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Engineering notation has an exponent which is a multiple of 3, so there
8107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        are up to 3 digits left of the decimal place.
8117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Same rules for when in exponential and when as a value as in __str__.
8137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
8157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
8167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__str__(eng=1, context=context)
8177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __neg__(self, context=None):
8197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy with the sign switched.
8207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds, if it has reason.
8227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
8247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
8257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
8267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
8277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
8287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
8307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # -Decimal('0') is Decimal('0'), not Decimal('-0')
8317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 0
8327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._sign:
8337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 0
8347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
8357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 1
8367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context._rounding_decision == ALWAYS_ROUND:
8377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal((sign, self._int, self._exp))._fix(context=context)
8387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal( (sign, self._int, self._exp))
8397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __pos__(self, context=None):
8417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy, unless it is a sNaN.
8427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds the number (if more then precision digits)
8447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
8467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
8477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
8487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
8497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
8507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = self._sign
8527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
8537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # + (-0) = 0
8547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 0
8557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context._rounding_decision == ALWAYS_ROUND:
8577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self._fix(context=context)
8587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
8597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal(self)
8607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans._sign = sign
8617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
8627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __abs__(self, round=1, context=None):
8647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of self.
8657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the second argument is 0, do not round.
8677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
8697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
8707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
8717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
8727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
8737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not round:
8759fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context._shallow_copy()
8767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._set_rounding_decision(NEVER_ROUND)
8777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
8797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__neg__(context=context)
8807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
8817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__pos__(context=context)
8827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
8847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __add__(self, other, context=None):
8867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns self + other.
8877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -INF + INF (or the reverse) cause InvalidOperation errors.
8897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
8917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
8927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
8937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
8957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
8967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
8977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
8997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #If both INF, same sign => same as both, opposite => error.
9007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign != other._sign and other._isinfinity():
9017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '-INF + INF')
9027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(self)
9037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._isinfinity():
9047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(other)  #Can't both be infinity here
9057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
9077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = min(self._exp, other._exp)
9097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negativezero = 0
9107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding == ROUND_FLOOR and self._sign != other._sign:
9117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #If the answer is 0, the sign should be negative, in this case.
9127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            negativezero = 1
9137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
9157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = min(self._sign, other._sign)
9167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if negativezero:
9177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                sign = 1
9187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (sign, (0,), exp))
9197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
9207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp < other._exp - context.prec-1:
9217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = other._exp - context.prec-1
9227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other._rescale(exp, watchexp=0, context=context)
9237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
9247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._fix(context=context)
9257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
9267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not other:
9277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp < self._exp - context.prec-1:
9287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = self._exp - context.prec-1
9297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self._rescale(exp, watchexp=0, context=context)
9307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
9317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._fix(context=context)
9327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
9337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = _WorkRep(self)
9357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = _WorkRep(other)
9367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1, op2 = _normalize(op1, op2, shouldround, context.prec)
9377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result = _WorkRep()
9397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if op1.sign != op2.sign:
9417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            diff = cmp(abs(op1), abs(op2))
9427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # Equal and opposite
9437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if diff == 0:
9447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if exp < context.Etiny():
9457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    exp = context.Etiny()
9467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Clamped)
9477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal((negativezero, (0,), exp))
9487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if diff < 0:
9497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1, op2 = op2, op1
9507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #OK, now abs(op1) > abs(op2)
9517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if op1.sign == -1:
9527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                result.sign = -1
9537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1.sign, op2.sign = op2.sign, op1.sign
9547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
9557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                result.sign = 1
9567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #So we know the sign, and op1 > 0.
9577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif op1.sign == -1:
9587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.sign = -1
9597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            op1.sign, op2.sign = (1, 1)
9607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
9617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.sign = 1
9627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Now, op1 > abs(op2) > 0
9637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.int.reverse()
9657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.int.reverse()
9667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if op2.sign == 1:
9687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.int = resultint = map(operator.add, op1.int, op2.int)
9697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            carry = 0
9707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for i in xrange(len(op1.int)):
9717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp = resultint[i] + carry
9727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                carry = 0
9737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if tmp > 9:
9747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    carry = 1
9757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    tmp -= 10
9767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                resultint[i] = tmp
9777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if carry:
9787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                resultint.append(1)
9797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
9807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.int = resultint = map(operator.sub, op1.int, op2.int)
9817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            loan = 0
9827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for i in xrange(len(op1.int)):
9837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp = resultint[i] - loan
9847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                loan = 0
9857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if tmp < 0:
9867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    loan = 1
9877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    tmp += 10
9887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                resultint[i] = tmp
9897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            assert not loan
9907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while resultint[-1] == 0:
9927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            resultint.pop()
9937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resultint.reverse()
9947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.exp = op1.exp
9967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(result)
9977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
9987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._fix(context=context)
9997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
10007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __radd__ = __add__
10027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __sub__(self, other, context=None):
10047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self + (-other)"""
10057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
10067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
10077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
10087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context=context)
10107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
10117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # -Decimal(0) = Decimal(0), which we don't want since
10147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # (-0 - 0 = -0 + (-0) = -0, but -0 + 0 = 0.)
10157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # so we change the sign directly to a copy
10167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(other)
10177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._sign = 1-tmp._sign
10187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__add__(tmp, context=context)
10207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rsub__(self, other, context=None):
10227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return other + (-self)"""
10237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
10247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
10257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
10267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(self)
10287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._sign = 1 - tmp._sign
10297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__add__(tmp, context=context)
10307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _increment(self, round=1, context=None):
10327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Special case of add, adding 1eExponent
10337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Since it is common, (rounding, for example) this adds
10357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (sign)*one E self._exp to the number more efficiently than add.
10367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        For example:
10387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal('5.624e10')._increment() == Decimal('5.625e10')
10397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
10407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
10417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
10427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
10437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
10447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        L = list(self._int)
10477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        L[-1] += 1
10487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        spot = len(L)-1
10497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while L[spot] == 10:
10507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            L[spot] = 0
10517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if spot == 0:
10527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                L[0:0] = [1]
10537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
10547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            L[spot-1] += 1
10557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            spot -= 1
10567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal((self._sign, L, self._exp))
10577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if round and context._rounding_decision == ALWAYS_ROUND:
10597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._fix(context=context)
10607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
10617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mul__(self, other, context=None):
10637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self * other.
10647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (+-) INF * 0 (or its reverse) raise InvalidOperation.
10667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
10677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
10687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
10697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
10707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
10727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
10737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1075d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger        resultsign = self._sign ^ other._sign
10767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
10777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not other:
10787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '(+-)INF * 0')
10797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Infsign[resultsign]
10807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._isinfinity():
10827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not self:
10837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '0 * (+-)INF')
10847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Infsign[resultsign]
10857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resultexp = self._exp + other._exp
10877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
10887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by zero
10907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self or not other:
10917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((resultsign, (0,), resultexp))
10927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
10937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #Fixing in case the exponent is out of bounds
10947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._fix(context=context)
10957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by power of 10
10987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._int == (1,):
10997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((resultsign, other._int, resultexp))
11007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
11017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._fix(context=context)
11027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._int == (1,):
11047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((resultsign, self._int, resultexp))
11057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
11067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._fix(context=context)
11077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = list(self._int)
11107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = list(other._int)
11117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.reverse()
11127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.reverse()
11137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Minimize Decimal additions
11147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(op2) > len(op1):
11157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            op1, op2 = op2, op1
11167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        _divmod = divmod
11187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        accumulator = [0]*(len(self._int) + len(other._int))
11197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for i in xrange(len(op2)):
11207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if op2[i] == 0:
11217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                continue
11227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            mult = op2[i]
11237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            carry = 0
11247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for j in xrange(len(op1)):
11257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                carry, accumulator[i+j] = _divmod( mult * op1[j] + carry
11267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                                  + accumulator[i+j], 10)
11277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if carry:
11297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                accumulator[i + j + 1] += carry
11307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while not accumulator[-1]:
11317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            accumulator.pop()
11327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        accumulator.reverse()
11337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal( (resultsign, accumulator, resultexp))
11357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
11367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._fix(context=context)
11377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
11397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __rmul__ = __mul__
11407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __div__(self, other, context=None):
11427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self / other."""
11437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, context=context)
11447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __truediv__ = __div__
11457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _divide(self, other, divmod = 0, context=None):
11477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return a / b, to context.prec precision.
11487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        divmod:
11507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 => true division
11517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 => (a //b, a%b)
11527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        2 => a //b
11537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        3 => a%b
11547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Actually, if divmod is 2 or 3 a tuple is returned, but errors for
11567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        computing the other value are not raised.
11577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
11587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
11597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
11607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
11617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
11637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
11647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if divmod:
11657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (ans, ans)
11667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
11677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return ans
11687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1169d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger        sign = self._sign ^ other._sign
11707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
11717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if divmod:
11727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(DivisionUndefined, '0 / 0', 1)
11737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(DivisionUndefined, '0 / 0')
11747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity() and other._isinfinity():
11757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not divmod:
11767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
11777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
11787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (context._raise_error(InvalidOperation,
11797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                         '(+-)INF // (+-)INF'),
11807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                        context._raise_error(InvalidOperation,
11817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                         '(+-)INF % (+-)INF'))
11827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not divmod:
11847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if other._isinfinity():
11857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._raise_error(Clamped, 'Division by infinity')
11867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal((sign, (0,), context.Etiny()))
11877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._isinfinity():
11887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
11897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #These two have different precision.
11907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not self:
11917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = self._exp - other._exp
11927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if exp < context.Etiny():
11937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    exp = context.Etiny()
11947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Clamped, '0e-x / y')
11957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if exp > context.Emax:
11967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    exp = context.Emax
11977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Clamped, '0e+x / y')
11987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (sign, (0,), exp) )
11997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not other:
12017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(DivisionByZero, 'x / 0', sign)
12027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if divmod:
12037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if other._isinfinity():
12047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal((sign, (0,), 0)), Decimal(self))
12057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._isinfinity():
12067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if divmod == 1:
12077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return (Infsign[sign],
12087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                            context._raise_error(InvalidOperation, 'INF % x'))
12097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                elif divmod == 2:
12107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return (Infsign[sign], NaN)
12117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                elif divmod == 3:
12127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return (Infsign[sign],
12137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                            context._raise_error(InvalidOperation, 'INF % x'))
12147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not self:
12157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = Decimal(self)
12167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside._exp = min(self._exp, other._exp)
12177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal((sign, (0,), 0)),  otherside)
12187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not other:
12207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(DivisionByZero, 'divmod(x,0)',
12217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                           sign, 1)
12227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #OK, so neither = 0, INF
12247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
12267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #If we're dividing into ints, and self < other, stop.
12287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #self.__abs__(0) does not round.
12297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if divmod and (self.__abs__(0, context) < other.__abs__(0, context)):
12307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if divmod == 1 or divmod == 3:
12327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = min(self._exp, other._exp)
12337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans2 = self._rescale(exp, context=context, watchexp=0)
12347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if shouldround:
12357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    ans2 = ans2._fix(context=context)
12367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal( (sign, (0,), 0) ),
12377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                        ans2)
12387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            elif divmod == 2:
12407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #Don't round the mod part, if we don't need it.
12417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal( (sign, (0,), 0) ), Decimal(self))
12427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign:
12447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = -1
12457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
12467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 1
12477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust = 0
12487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = _WorkRep(self)
12497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = _WorkRep(other)
12507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1, op2, adjust = _adjust_coefficients(op1, op2)
12517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        res = _WorkRep( (sign, [0], (op1.exp - op2.exp)) )
12527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if divmod and res.exp > context.prec + 1:
12537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(DivisionImpossible)
12547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = None
12567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while 1:
12577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            while( (len(op2.int) < len(op1.int) and op1.int[0]) or
12587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                   (len(op2.int) == len(op1.int) and op2.int <= op1.int)):
12597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                   #Meaning, while op2.int < op1.int, when normalized.
12607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                res._increment()
12617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1.subtract(op2.int)
12627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if res.exp == 0 and divmod:
12637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if len(res.int) > context.prec and shouldround:
12647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return context._raise_error(DivisionImpossible)
12657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = Decimal(op1)
12667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                frozen = context._ignore_all_flags()
12677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = min(self._exp, other._exp)
12697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = otherside._rescale(exp, context=context,
12707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                              watchexp=0)
12717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._regard_flags(*frozen)
12727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if shouldround:
12737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    otherside = otherside._fix(context=context)
12747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal(res), otherside)
12757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if op1.int == [0]*len(op1.int) and adjust >= 0 and not divmod:
12777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
12787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if (len(res.int) > context.prec) and shouldround:
12797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if divmod:
12807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return context._raise_error(DivisionImpossible)
12817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                shouldround=1
12827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                # Really, the answer is a bit higher, so adding a one to
12837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                # the end will make sure the rounding is right.
12847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if op1.int != [0]*len(op1.int):
12857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    res.int.append(1)
12867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    res.exp -= 1
12877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
12897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            res.exp -= 1
12907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            adjust += 1
12917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            res.int.append(0)
12927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            op1.int.append(0)
12937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            op1.exp -= 1
12947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if res.exp == 0 and divmod and (len(op2.int) > len(op1.int) or
12967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                            (len(op2.int) == len(op1.int) and
12977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                             op2.int > op1.int)):
12987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #Solves an error in precision.  Same as a previous block.
12997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if len(res.int) > context.prec and shouldround:
13017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return context._raise_error(DivisionImpossible)
13027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = Decimal(op1)
13037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                frozen = context._ignore_all_flags()
13047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = min(self._exp, other._exp)
13067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = otherside._rescale(exp, context=context)
13077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._regard_flags(*frozen)
13097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal(res), otherside)
13117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(res)
13137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
13147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._fix(context=context)
13157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
13167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rdiv__(self, other, context=None):
13187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __div__."""
13197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
13207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__div__(self, context=context)
13217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __rtruediv__ = __rdiv__
13227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __divmod__(self, other, context=None):
13247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (self // other, self % other)
13267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, 1, context)
13287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rdivmod__(self, other, context=None):
13307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __divmod__."""
13317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
13327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__divmod__(self, context=context)
13337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mod__(self, other, context=None):
13357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self % other
13377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
13397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
13407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
13417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
13437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
13447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
13457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self and not other:
13477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x % 0')
13487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, 3, context)[1]
13507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rmod__(self, other, context=None):
13527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __mod__."""
13537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
13547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__mod__(self, context=context)
13557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, other, context=None):
13577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Remainder nearest to 0-  abs(remainder-near) <= other/2
13597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
13617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
13627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
13637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
13657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
13667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
13677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self and not other:
13687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x % 0')
13697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # If DivisionImpossible causes an error, do not leave Rounded/Inexact
13717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # ignored in the calling function.
13729fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
13737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_flags(Rounded, Inexact)
13747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #keep DivisionImpossible flags
13757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (side, r) = self.__divmod__(other, context=context)
13767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r._isnan():
13787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._regard_flags(*flags)
13797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return r
13807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13819fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
13827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
13837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._sign:
13857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            comparison = other.__div__(Decimal(-2), context=context)
13867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
13877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            comparison = other.__div__(Decimal(2), context=context)
13887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
13907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._regard_flags(*flags)
13917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        s1, s2 = r._sign, comparison._sign
13937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        r._sign, comparison._sign = 0, 0
13947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r < comparison:
13967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            r._sign, comparison._sign = s1, s2
13977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Get flags now
13987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.__divmod__(other, context=context)
13997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return r._fix(context=context)
14007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        r._sign, comparison._sign = s1, s2
14017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
14037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (side, r) = self.__divmod__(other, context=context)
14057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
14067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r._isnan():
14077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return r
14087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        decrease = not side._iseven()
14107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
14117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        side = side.__abs__(context=context)
14127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
14137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        s1, s2 = r._sign, comparison._sign
14157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        r._sign, comparison._sign = 0, 0
14167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r > comparison or decrease and r == comparison:
14177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            r._sign, comparison._sign = s1, s2
14187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec += 1
14197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(side.__add__(Decimal(1), context=context)._int) >= context.prec:
14207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context.prec -= 1
14217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(DivisionImpossible)[1]
14227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec -= 1
14237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign == other._sign:
14247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                r = r.__sub__(other, context=context)
14257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
14267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                r = r.__add__(other, context=context)
14277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
14287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            r._sign, comparison._sign = s1, s2
14297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return r._fix(context=context)
14317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __floordiv__(self, other, context=None):
14337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """self // other"""
14347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, 2, context)[0]
14357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rfloordiv__(self, other, context=None):
14377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __floordiv__."""
14387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
14397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__floordiv__(self, context=context)
14407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __float__(self):
14427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Float representation."""
14437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return float(str(self))
14447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __int__(self):
14467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts self to a int, truncating if necessary."""
14477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isnan():
14487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
14497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidContext)
14507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._isinfinity():
14517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            raise OverflowError, "Cannot convert infinity to long"
14527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
14537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
14547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = '-'*self._sign
14557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
14567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            s = sign + ''.join(map(str, self._int)) + '0'*self._exp
14577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return int(s)
14587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        s = sign + ''.join(map(str, self._int))[:self._exp]
14597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(s)
14607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = list(self._int)
14617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp.reverse()
14627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = 0
14637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while tmp:
14647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            val *= 10
14657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            val += tmp.pop()
14667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(((-1) ** self._sign) * val * 10.**int(self._exp))
14677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __long__(self):
14697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts to a long.
14707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Equivalent to long(int(self))
14727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
14737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return long(self.__int__())
14747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _fix(self, prec=None, rounding=None, folddown=None, context=None):
14767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round if it is necessary to keep self within prec precision.
14777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds and fixes the exponent.  Does not raise on a sNaN.
14797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Arguments:
14817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self - Decimal instance
14827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prec - precision to which  to round.  By default, the context decides.
14837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding - Rounding method.  By default, the context decides.
14847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        folddown - Fold down high elements, by default context._clamp
14857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context - context used.
14867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
14877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity() or self._isnan():
14887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
14897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
14907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
14917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec is None:
14927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = context.prec
14937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(self)
14947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = ans._fixexponents(prec, rounding, folddown=folddown,
14957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                               context=context)
14967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(ans._int) > prec:
14977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._round(prec, rounding, context=context)
14987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = ans._fixexponents(prec, rounding, folddown=folddown,
14997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                               context=context)
15007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
15017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _fixexponents(self, prec=None, rounding=None, folddown=None,
15037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                     context=None):
15047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Fix the exponents and return a copy with the exponent in bounds."""
15057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
15067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
15077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
15087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
15097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec is None:
15107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = context.prec
15117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if folddown is None:
15127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            folddown = context._clamp
15137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Emin, Emax = context.Emin, context.Emax
15147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Etop = context.Etop()
15157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(self)
15167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans.adjusted() < Emin:
15177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            Etiny = context.Etiny()
15187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if ans._exp < Etiny:
15197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if not ans:
15207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    ans._exp = Etiny
15217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Clamped)
15227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return ans
15237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._rescale(Etiny, context=context)
15247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #It isn't zero, and exp < Emin => subnormal
15257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._raise_error(Subnormal)
15267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if context.flags[Inexact]:
15277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Underflow)
15287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
15297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if ans:
15307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    #Only raise subnormal if non-zero.
15317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Subnormal)
15327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif folddown and ans._exp > Etop:
15337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Clamped)
15347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._rescale(Etop, context=context)
15357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif ans.adjusted() > Emax:
15367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not ans:
15377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans._exp = Emax
15387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._raise_error(Clamped)
15397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return ans
15407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Inexact)
15417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
15427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(Overflow, 'above Emax', ans._sign)
15437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
15447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round(self, prec=None, rounding=None, context=None):
15467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a rounded version of self.
15477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        You can specify the precision or rounding method.  Otherwise, the
15497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context determines it.
15507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
15517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
15537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
15547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
15557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
15567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
15577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
15597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(self)
15607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if rounding is None:
15627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            rounding = context.rounding
15637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec is None:
15647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = context.prec
15657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
15677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if prec <= 0:
15687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                dig = (0,)
15697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = len(self._int) - prec + self._exp
15707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
15717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                dig = (0,) * prec
15727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = len(self._int) + self._exp - prec
15737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((self._sign, dig, exp))
15747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
15757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
15767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec == 0:
15787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp = Decimal(self)
15797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp._int = (0,)+temp._int
15807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = 1
15817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif prec < 0:
15827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = self._exp + len(self._int) - prec - 1
15837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp = Decimal( (self._sign, (0, 1), exp))
15847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = 1
15857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
15867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp = Decimal(self)
15877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = len(temp._int)
15897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec == numdigits:
15907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return temp
15917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # See if we need to extend precision
15937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        expdiff = prec - numdigits
15947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if expdiff > 0:
15957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = list(temp._int)
15967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.extend([0] * expdiff)
15977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans =  Decimal( (temp._sign, tmp, temp._exp - expdiff))
15987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
15997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #OK, but maybe all the lost digits are 0.
16017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        lostdigits = self._int[expdiff:]
16027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if lostdigits == (0,) * len(lostdigits):
16037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal( (temp._sign, temp._int[:prec], temp._exp - expdiff))
16047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Rounded, but not Inexact
16057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
16067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
16077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Okay, let's round and lose data
16097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        this_function = getattr(temp, self._pick_rounding_function[rounding])
16117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Now we've got the rounding function
16127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec != context.prec:
16149fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context._shallow_copy()
16157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec = prec
16167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = this_function(prec, expdiff, context)
16177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._raise_error(Rounded)
16187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._raise_error(Inexact, 'Changed in rounding')
16197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
16217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    _pick_rounding_function = {}
16237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_down(self, prec, expdiff, context):
16257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Also known as round-towards-0, truncate."""
16267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
16277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_half_up(self, prec, expdiff, context, tmp = None):
16297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds 5 up (away from 0)"""
16307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tmp is None:
16327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = Decimal( (self._sign,self._int[:prec], self._exp - expdiff))
16337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._int[prec] >= 5:
16347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = tmp._increment(round=0, context=context)
16357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(tmp._int) > prec:
16367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
16377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return tmp
16387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_half_even(self, prec, expdiff, context):
16407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round 5 to even, rest to nearest."""
16417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
16437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        half = (self._int[prec] == 5)
16447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
16457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for digit in self._int[prec+1:]:
16467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if digit != 0:
16477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    half = 0
16487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    break
16497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
165061992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            if self._int[prec-1] & 1 == 0:
16517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return tmp
16527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._round_half_up(prec, expdiff, context, tmp)
16537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_half_down(self, prec, expdiff, context):
16557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round 5 down"""
16567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
16587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        half = (self._int[prec] == 5)
16597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
16607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for digit in self._int[prec+1:]:
16617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if digit != 0:
16627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    half = 0
16637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    break
16647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
16657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return tmp
16667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._round_half_up(prec, expdiff, context, tmp)
16677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_up(self, prec, expdiff, context):
16697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds away from 0."""
16707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
16717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for digit in self._int[prec:]:
16727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if digit != 0:
16737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp = tmp._increment(round=1, context=context)
16747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if len(tmp._int) > prec:
16757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
16767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
16777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return tmp
16787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return tmp
16797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_ceiling(self, prec, expdiff, context):
16817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds up (not away from 0 if negative.)"""
16827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if 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 _round_floor(self, prec, expdiff, context):
16887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds down (not towards 0 if negative)"""
16897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self._sign:
16907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._round_down(prec, expdiff, context)
16917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
16927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._round_up(prec, expdiff, context)
16937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __pow__(self, n, modulo = None, context=None):
16957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self ** n (mod modulo)
16967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If modulo is None (default), don't take it mod modulo.
16987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
16997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
17007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
17017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        n = self._convert_other(n)
17027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Because the spot << doesn't work with really big exponents
17047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if n._isinfinity() or n.adjusted() > 8:
17057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x ** INF')
17067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(n, context)
17087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
17097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
17107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not n._isinfinity() and not n._isinteger():
17127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x ** (non-integer)')
17137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not n:
17157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, '0 ** 0')
17167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not n:
17187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(1)
17197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self == Decimal(1):
17217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(1)
17227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = self._sign and not n._iseven()
17247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        n = int(n)
17257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
17277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if modulo:
17287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, 'INF % x')
17297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if n > 0:
17307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
17317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (sign, (0,), 0) )
17327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #with ludicrously large exponent, just raise an overflow and return inf.
17347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not modulo and n > 0 and (self._exp + len(self._int) - 1) * n > context.Emax \
17357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger           and self:
17367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = Decimal('inf')
17387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._sign = sign
17397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
17407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Inexact)
17417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Overflow, 'Big power', sign)
17427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return tmp
17437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elength = len(str(abs(n)))
17457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        firstprec = context.prec
17467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
174799148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        if not modulo and firstprec + elength + 1 > DefaultContext.Emax:
17487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(Overflow, 'Too much precision.', sign)
17497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        mul = Decimal(self)
17517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = Decimal(1)
17529fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
17537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec + elength + 1
17547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context.rounding
17557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if n < 0:
17567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #n is a long now, not Decimal instance
17577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            n = -n
17587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            mul = Decimal(1).__div__(mul, context=context)
17597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
17617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        spot = 1
17637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while spot <= n:
17647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            spot <<= 1
17657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        spot >>= 1
17677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Spot is the highest power of 2 less than n
17687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while spot:
17697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            val = val.__mul__(val, context=context)
17707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if val._isinfinity():
17717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                val = Infsign[sign]
17727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
17737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if spot & n:
17747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                val = val.__mul__(mul, context=context)
17757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if modulo is not None:
17767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                val = val.__mod__(modulo, context=context)
17777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            spot >>= 1
17787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec
17797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
17817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return val._fix(context=context)
17827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return val
17837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rpow__(self, other, context=None):
17857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __pow__."""
17867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
17877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__pow__(self, context=context)
17887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def normalize(self, context=None):
17907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
17917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
17927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
17937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
17957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
17967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
17977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        dup = self._fix(context=context)
17997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if dup._isinfinity():
18007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return dup
18017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not dup:
18037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (dup._sign, (0,), 0) )
18047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        end = len(dup._int)
18057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = dup._exp
18067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while dup._int[end-1] == 0:
18077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp += 1
18087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            end -= 1
18097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal( (dup._sign, dup._int[:end], exp) )
18107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def quantize(self, exp, rounding = None, context=None, watchexp = 1):
18137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Quantize self so its exponent is the same as that of exp.
18147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Similar to self._rescale(exp._exp) but with error checking.
18167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
18177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
18187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
18197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(exp, context)
18217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
18227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
18237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if exp._isinfinity() or self._isinfinity():
18257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp._isinfinity() and self._isinfinity():
18267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return self  #if both are inf, it is OK
18277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation,
18287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                       'quantize with one INF')
18297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._rescale(exp._exp, rounding, context, watchexp)
18307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, other):
18327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Test whether self and other have the same exponent.
18337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        same as self._exp == other._exp, except NaN == sNaN
18357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
18367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isnan() or other._isnan():
18377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._isnan() and other._isnan() and True
18387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity() or other._isinfinity():
18397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._isinfinity() and other._isinfinity() and True
18407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._exp == other._exp
18417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _rescale(self, exp, rounding = None, context=None, watchexp = 1):
18437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rescales so that the exponent is exp.
18447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = exp to scale to (an integer)
18467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = rounding version
18477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        watchexp: if set (default) an error is returned if exp is greater
18487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        than Emax or less than Etiny.
18497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
18507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
18517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
18527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
18547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'rescale with an INF')
18557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
18577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
18587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
18597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        out = 0
18617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if watchexp and (context.Emax  < exp or context.Etiny() > exp):
18637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'rescale(a, INF)')
18647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
18667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal(self)
18677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._int = (0,)
18687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._exp = exp
18697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
18707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        diff = self._exp - exp
18727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        digits = len(self._int)+diff
18737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if watchexp and digits > context.prec:
18757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'Rescale > prec')
18767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(self)
18787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._int = (0,)+tmp._int
18797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        digits += 1
18807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prevexact = context.flags[Inexact]
18827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if digits < 0:
18837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._exp = -digits + tmp._exp
18847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._int = (0,1)
18857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            digits = 1
18867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = tmp._round(digits, rounding, context=context)
18877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tmp._int[0] == 0 and len(tmp._int) > 1:
18897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._int = tmp._int[1:]
18907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._exp = exp
18917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tmp and tmp.adjusted() < context.Emin:
18937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Subnormal)
18947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif tmp and tmp.adjusted() > context.Emax:
18957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'rescale(a, INF)')
18967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return tmp
18977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_integral(self, rounding = None, context=None):
18997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds to the nearest integer, without raising inexact, rounded."""
19007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
19017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
19027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
19037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
19047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
19057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
19067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
19077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_flags(Rounded, Inexact)
19087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._rescale(0, rounding, context=context)
19097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._regard_flags(flags)
19107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
19117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def sqrt(self, context=None):
19137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the square root of self.
19147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Uses a converging algorithm (Xn+1 = 0.5*(Xn + self / Xn))
19167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Should quadratically approach the right answer.
19177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
19187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
19197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
19207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
19227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
19237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
19247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
19267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #exponent = self._exp / 2, using round_down.
19277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #if self._exp < 0:
19287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #    exp = (self._exp+1) // 2
19297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #else:
19307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = (self._exp) // 2
19317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign == 1:
19327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #sqrt(-0) = -0
19337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (1, (0,), exp))
19347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
19357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (0, (0,), exp))
19367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign == 1:
19387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
19397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
19417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(self)
19427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(self)
19447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        expadd = tmp._exp / 2
194661992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger        if tmp._exp & 1:
19477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._int += (0,)
19487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._exp = 0
19497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
19507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._exp = 0
19517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19529fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
19537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_all_flags()
19547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        firstprec = context.prec
19557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = 3
195661992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger        if tmp.adjusted() & 1 == 0:
19577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal( (0, (8,1,9), tmp.adjusted()  - 2) )
19587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans.__add__(tmp.__mul__(Decimal((0, (2,5,9), -2)),
19597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                          context=context), context=context)
19607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._exp -= 1 + tmp.adjusted()/2
19617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
19627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal( (0, (2,5,9), tmp._exp + len(tmp._int)- 3) )
19637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans.__add__(tmp.__mul__(Decimal((0, (8,1,9), -3)),
19647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                          context=context), context=context)
19657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._exp -= 1 + tmp.adjusted()/2
19667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #ans is now a linear approximation.
19687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Emax, Emin = context.Emax, context.Emin
197099148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        context.Emax, context.Emin = DefaultContext.Emax, DefaultContext.Emin
19717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        half = Decimal('0.5')
19737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        count = 1
19757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        maxp = firstprec + 2
19767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_HALF_EVEN)
19777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while 1:
19787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec = min(2*context.prec - 2, maxp)
19797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = half.__mul__(ans.__add__(tmp.__div__(ans, context=context),
19807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                           context=context), context=context)
19817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.prec == maxp:
19827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
19837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #round to the answer's precision-- the only error can be 1 ulp.
19857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec
19867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prevexp = ans.adjusted()
19877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = ans._round(context=context)
19887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Now, check if the other last digits are better.
19907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec + 1
19917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # In case we rounded up another digit and we should actually go lower.
19927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prevexp != ans.adjusted():
19937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._int += (0,)
19947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._exp -= 1
19957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        lower = ans.__sub__(Decimal((0, (5,), ans._exp-1)), context=context)
19987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding(ROUND_UP)
19997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if lower.__mul__(lower, context=context) > (tmp):
20007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans.__sub__(Decimal((0, (1,), ans._exp)), context=context)
20017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
20037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            upper = ans.__add__(Decimal((0, (5,), ans._exp-1)),context=context)
20047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._set_rounding(ROUND_DOWN)
20057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if upper.__mul__(upper, context=context) < tmp:
20067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans.__add__(Decimal((0, (1,), ans._exp)),context=context)
20077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans._exp += expadd
20097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec
20117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.rounding = rounding
20127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = ans._fix(context=context)
20137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
20157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not ans.__mul__(ans, context=context) == self:
20167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # Only rounded/inexact if here.
20177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._regard_flags(flags)
20187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
20197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Inexact)
20207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
20217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Exact answer, so let's set the exponent right.
20227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #if self._exp < 0:
20237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #    exp = (self._exp +1)// 2
20247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #else:
20257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = self._exp // 2
20267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec += ans._exp - exp
20277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._rescale(exp, context=context)
20287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec = firstprec
20297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._regard_flags(flags)
20307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.Emax, context.Emin = Emax, Emin
20317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans._fix(context=context)
20337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, other, context=None):
20357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the larger value.
20367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        like max(self, other) except if one is not a number, returns
20387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
20397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
20407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
20417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
20427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
20437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2044d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        # if one operand is a quiet NaN and the other is number, then the
2045d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        # number is always returned
2046d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        sn = self._isnan()
2047d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        on = other._isnan()
2048d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if sn or on:
2049d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if on == 1 and sn != 2:
2050d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                return self
2051d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if sn == 1 and on != 2:
2052d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                return other
2053d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            return self._check_nans(other, context)
20547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self
2056d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        c = self.__cmp__(other)
2057d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
2058d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if both operands are finite and equal in numerical value
2059d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # then an ordering is applied:
2060d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2061d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs differ then max returns the operand with the
2062d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # positive sign and min returns the operand with the negative sign
2063d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2064d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs are the same then the exponent is used to select
2065d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # the result.
2066d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if self._sign != other._sign:
2067d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                if self._sign:
2068d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                    ans = other
2069d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp < other._exp and not self._sign:
2070d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2071d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp > other._exp and self._sign:
2072d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2073d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        elif c == -1:
20747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2075d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        context._rounding_decision == ALWAYS_ROUND
2076d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        return ans._fix(context=context)
20777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, other, context=None):
20797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the smaller value.
20807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        like min(self, other) except if one is not a number, returns
20827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
20837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
20847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
20857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
20867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
20877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2088d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        # if one operand is a quiet NaN and the other is number, then the
2089d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        # number is always returned
2090d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        sn = self._isnan()
2091d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        on = other._isnan()
2092d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if sn or on:
2093d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if on == 1 and sn != 2:
2094d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                return self
2095d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if sn == 1 and on != 2:
2096d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                return other
2097d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            return self._check_nans(other, context)
20987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self
2100d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        c = self.__cmp__(other)
2101d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
2102d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if both operands are finite and equal in numerical value
2103d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # then an ordering is applied:
2104d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2105d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs differ then max returns the operand with the
2106d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # positive sign and min returns the operand with the negative sign
2107d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2108d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs are the same then the exponent is used to select
2109d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # the result.
2110d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if self._sign != other._sign:
2111d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                if other._sign:
2112d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                    ans = other
2113d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp > other._exp and not self._sign:
2114d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2115d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp < other._exp and self._sign:
2116d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2117d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        elif c == 1:
21187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2119d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        context._rounding_decision == ALWAYS_ROUND
2120d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        return ans._fix(context=context)
21217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinteger(self):
21237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether self is an integer"""
21247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
21257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return True
21267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rest = self._int[self._exp:]
21277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rest == (0,)*len(rest)
21287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _iseven(self):
21307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns 1 if self is even.  Assumes self is an integer."""
21317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp > 0:
21327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
213361992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger        return self._int[-1+self._exp] & 1 == 0
21347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def adjusted(self):
21367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the adjusted exponent of self"""
21377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        try:
21387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._exp + len(self._int) - 1
21397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #If NaN or Infinity, self._exp is string
21407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        except TypeError:
21417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
21427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # support for pickling, copy, and deepcopy
21447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __reduce__(self):
21457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (self.__class__, (str(self),))
21467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __copy__(self):
21487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
21497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self     # I'm immutable; therefore I am my own clone
21507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
21517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __deepcopy__(self, memo):
21537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
21547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self     # My components are also immutable
21557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
21567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2157d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger##### Context class ###########################################
2158d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger
21597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# get rounding method function:
21617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerrounding_functions = [name for name in Decimal.__dict__.keys() if name.startswith('_round_')]
21627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerfor name in rounding_functions:
21637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
21647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    globalname = name[1:].upper()
21657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    val = globals()[globalname]
21667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Decimal._pick_rounding_function[val] = name
21677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettingerdel name, val, globalname, rounding_functions
21697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Context(object):
21717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Contains the context for a Decimal instance.
21727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Contains:
21747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    prec - precision (for use in rounding, division, square roots..)
21757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    rounding - rounding type. (how you round)
21767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round?
2177bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger    traps - If traps[exception] = 1, then the exception is
21787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    raised when it is caused.  Otherwise, a value is
21797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    substituted in.
21807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    flags  - When an exception is caused, flags[exception] is incremented.
21817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             (Whether or not the trap_enabler is set)
21827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             Should be reset by user of Decimal instance.
21830ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emin -   Minimum exponent
21840ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emax -   Maximum exponent
21857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    capitals -      If 1, 1*10^1 is printed as 1E+1.
21867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    If 0, printed as 1e1
2187e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger    _clamp - If 1, change exponents if too high (Default 0)
21887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
21899ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger
21907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, prec=None, rounding=None,
2191bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger                 traps=None, flags=[],
21927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                 _rounding_decision=None,
21930ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                 Emin=None, Emax=None,
2194e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger                 capitals=None, _clamp=0,
21957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                 _ignored_flags=[]):
2196bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not isinstance(flags, dict):
2197fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger            flags = dict([(s,s in flags) for s in _signals])
2198b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
2199bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if traps is not None and not isinstance(traps, dict):
2200fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger            traps = dict([(s,s in traps) for s in _signals])
2201b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
22027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for name, val in locals().items():
22037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if val is None:
22047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                setattr(self, name, copy.copy(getattr(DefaultContext, name)))
22057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
22067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                setattr(self, name, val)
22077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        del self.self
22087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2209b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger    def __repr__(self):
2210bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        """Show the current context."""
2211b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        s = []
2212bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' % vars(self))
2213bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        s.append('flags=[' + ', '.join([f.__name__ for f, v in self.flags.items() if v]) + ']')
2214bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        s.append('traps=[' + ', '.join([t.__name__ for t, v in self.traps.items() if v]) + ']')
2215b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        return ', '.join(s) + ')'
2216b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger
2217d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger    def clear_flags(self):
2218d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        """Reset all flags to zero"""
2219d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        for flag in self.flags:
2220b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger            self.flags[flag] = 0
2221d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger
22229fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def _shallow_copy(self):
22239fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a shallow copy from self."""
2224bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        nc = Context(self.prec, self.rounding, self.traps, self.flags,
22257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                         self._rounding_decision, self.Emin, self.Emax,
22267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                         self.capitals, self._clamp, self._ignored_flags)
22277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return nc
22289fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger
22299fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def copy(self):
22309fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a deep copy from self."""
22319fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        nc = Context(self.prec, self.rounding, self.traps.copy(), self.flags.copy(),
22329fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger                         self._rounding_decision, self.Emin, self.Emax,
22339fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger                         self.capitals, self._clamp, self._ignored_flags)
22349fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        return nc
22359ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    __copy__ = copy
22367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22375aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    def _raise_error(self, condition, explanation = None, *args):
22387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Handles an error
22397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the flag is in _ignored_flags, returns the default response.
22417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, it increments the flag, then, if the corresponding
22427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        trap_enabler is set, it reaises the exception.  Otherwise, it returns
22437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the default value after incrementing the flag.
22447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
22455aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        error = _condition_map.get(condition, condition)
22467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if error in self._ignored_flags:
22477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Don't touch the flag
22487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return error().handle(self, *args)
22497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.flags[error] += 1
2251bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not self.traps[error]:
22527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #The errors define how to handle themselves.
22535aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger            return condition().handle(self, *args)
22547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Errors should only be risked on copies of the context
22567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #self._ignored_flags = []
22577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        raise error, explanation
22587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_all_flags(self):
22607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore all flags, if they are raised"""
2261fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger        return self._ignore_flags(*_signals)
22627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_flags(self, *flags):
22647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore the flags, if they are raised"""
22657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Do not mutate-- This way, copies of a context leave the original
22667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # alone.
22677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self._ignored_flags = (self._ignored_flags + list(flags))
22687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return list(flags)
22697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _regard_flags(self, *flags):
22717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Stop ignoring the flags, if they are raised"""
22727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if flags and isinstance(flags[0], (tuple,list)):
22737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            flags = flags[0]
22747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for flag in flags:
22757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._ignored_flags.remove(flag)
22767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22775aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    def __hash__(self):
22785aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        """A Context cannot be hashed."""
22795aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        # We inherit object.__hash__, so we must deny this explicitly
22805aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        raise TypeError, "Cannot hash a Context."
22815aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger
22827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etiny(self):
22837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns Etiny (= Emin - prec + 1)"""
22847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emin - self.prec + 1)
22857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etop(self):
2287e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """Returns maximum exponent (= Emax - prec + 1)"""
22887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emax - self.prec + 1)
22897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _set_rounding_decision(self, type):
22917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Sets the rounding decision.
22927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Sets the rounding decision, and returns the current (previous)
22947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding decision.  Often used like:
22957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22969fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
22977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # That so you don't change the calling context
22987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # if an error occurs in the middle (say DivisionImpossible is raised).
22997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
23017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        instance = instance / Decimal(2)
23027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
23037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This will make it not round for that operation.
23057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = self._rounding_decision
23087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self._rounding_decision = type
23097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rounding
23107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _set_rounding(self, type):
23127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Sets the rounding type.
23137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Sets the rounding type, and returns the current (previous)
23157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding type.  Often used like:
23167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context = context.copy()
23187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # so you don't change the calling context
23197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # if an error occurs in the middle.
23207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_UP)
23217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = self.__sub__(other, context=context)
23227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding(rounding)
23237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This will make it round up for that operation.
23257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = self.rounding
23277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.rounding= type
23287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rounding
23297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2330fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger    def create_decimal(self, num='0'):
23317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Creates a new Decimal instance but using self as context."""
23327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        d = Decimal(num, context=self)
23337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return d._fix(context=self)
23347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #Methods
23367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def abs(self, a):
23377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of the operand.
23387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the operand is negative, the result is the same as using the minus
23407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation on the operand. Otherwise, the result is the same as using
23417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the plus operation on the operand.
23427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23439ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('2.1'))
23447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.1")
23459ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-100'))
23467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("100")
23479ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('101.5'))
23487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("101.5")
23499ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-101.5'))
23507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("101.5")
23517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__abs__(context=self)
23537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def add(self, a, b):
23557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the sum of the two operands.
23567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
23587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("19.00")
23599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
23607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.02E+4")
23617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__add__(b, context=self)
23637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _apply(self, a):
23657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return str(a._fix(context=self))
23667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, a, b):
23687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares values numerically.
23697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the signs of the operands differ, a value representing each operand
23717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ('-1' if the operand is less than zero, '0' if the operand is zero or
23727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negative zero, or '1' if the operand is greater than zero) is used in
23737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        place of that operand for the comparison instead of the actual
23747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operand.
23757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The comparison is then effected by subtracting the second operand from
23777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the first and then returning a value according to the result of the
23787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        subtraction: '-1' if the result is less than zero, '0' if the result is
23797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        zero or negative zero, or '1' if the result is greater than zero.
23807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23819ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
23827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
23839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
23847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
23859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
23867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
23879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
23887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
23899ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
23907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
23919ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
23927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
23937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.compare(b, context=self)
23957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide(self, a, b):
23977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Decimal division in a specified context.
23987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23999ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
24007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.333333333")
24019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
24027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.666666667")
24039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
24047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.5")
24059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
24067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.1")
24079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
24087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
24099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
24107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("4.00")
24119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
24127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.20")
24139ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
24147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("10")
24159ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
24167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1000")
24179ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
24187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.20E+6")
24197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__div__(b, context=self)
24217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide_int(self, a, b):
24237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Divides two numbers and returns the integer part of the result.
24247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
24267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
24279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
24287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24299ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
24307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__floordiv__(b, context=self)
24337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divmod(self, a, b):
24357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__divmod__(b, context=self)
24367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, a,b):
24387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """max compares two values numerically and returns the maximum.
24397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
24417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, the operands are compared as as though by the compare
24427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation. If they are numerically equal then the left-hand operand
24437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        is chosen as the result. Otherwise the maximum (closer to positive
24447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
24457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24469ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
24477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
24497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
2451d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        Decimal("1")
2452d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
2453d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        Decimal("7")
24547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.max(b, context=self)
24567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, a,b):
24587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """min compares two values numerically and returns the minimum.
24597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
24617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, the operands are compared as as though by the compare
24627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation. If they are numerically equal then the left-hand operand
24637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        is chosen as the result. Otherwise the minimum (closer to negative
24647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
24657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24669ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
24677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2")
24689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
24697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-10")
24709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
24717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
2472d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
2473d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        Decimal("7")
24747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.min(b, context=self)
24767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def minus(self, a):
24787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Minus corresponds to unary prefix minus in Python.
24797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as subtract; the
24817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation minus(a) is calculated as subtract('0', a) where the '0'
24827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
24837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('1.3'))
24857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1.3")
24869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('-1.3'))
24877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.3")
24887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__neg__(context=self)
24907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def multiply(self, a, b):
24927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """multiply multiplies two operands.
24937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a special value then the general rules apply.
24957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, the operands are multiplied together ('long multiplication'),
24967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resulting in a number which may be as long as the sum of the lengths
24977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        of the two operands.
24987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24999ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
25007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.60")
25019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
25027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("21")
25039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
25047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.72")
25059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
25067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.0")
25079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
25087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("4.28135971E+11")
25097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mul__(b, context=self)
25117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def normalize(self, a):
2513e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """normalize reduces an operand to its simplest form.
25147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Essentially a plus operation with all trailing zeros removed from the
25167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.
25177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('2.1'))
25197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.1")
25209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-2.0'))
25217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-2")
25229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('1.200'))
25237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.2")
25249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-120'))
25257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1.2E+2")
25269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('120.00'))
25277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.2E+2")
25289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('0.00'))
25297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
25307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.normalize(context=self)
25327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def plus(self, a):
25347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Plus corresponds to unary prefix plus in Python.
25357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as add; the
25377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation plus(a) is calculated as add('0', a) where the '0'
25387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
25397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('1.3'))
25417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.3")
25429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('-1.3'))
25437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1.3")
25447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pos__(context=self)
25467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def power(self, a, b, modulo=None):
25487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Raises a to the power of b, to modulo if given.
25497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The right-hand operand must be a whole number whose integer part (after
25517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        any exponent has been applied) has no more than 9 digits and whose
25527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        fractional part (if any) is all zeros before any rounding. The operand
25537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        may be positive, negative, or zero; if negative, the absolute value of
25547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the power is used, and the left-hand operand is inverted (divided into
25557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1) before use.
25567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the increased precision needed for the intermediate calculations
25587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exceeds the capabilities of the implementation then an Invalid operation
25597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        condition is raised.
25607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If, when raising to a negative power, an underflow occurs during the
25627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        division into 1, the operation is not halted at that point but
25637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        continues.
25647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('2'), Decimal('3'))
25667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("8")
25679ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('2'), Decimal('-3'))
25687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.125")
25699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('1.7'), Decimal('8'))
25707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("69.7575744")
25719ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-2'))
25727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
25739ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-1'))
25747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
25759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('0'))
25767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
25779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('1'))
25787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("Infinity")
25799ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('2'))
25807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("Infinity")
25819ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-2'))
25827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
25839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-1'))
25847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0")
25859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('0'))
25867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
25879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('1'))
25887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-Infinity")
25899ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('2'))
25907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("Infinity")
25919ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('0'), Decimal('0'))
25927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
25937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pow__(b, modulo, context=self)
25957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def quantize(self, a, b):
25977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a value equal to 'a' (rounded) and having the exponent of 'b'.
25987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The coefficient of the result is derived from that of the left-hand
26007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operand. It may be rounded using the current rounding setting (if the
26017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exponent is being increased), multiplied by a positive power of ten (if
26027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the exponent is being decreased), or is unchanged (if the exponent is
26037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        already equal to that of the right-hand operand).
26047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Unlike other operations, if the length of the coefficient after the
26067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        quantize operation would be greater than precision then an Invalid
26077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation condition is raised. This guarantees that, unless there is an
26087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        error condition, the exponent of the result of a quantize is always
26097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        equal to that of the right-hand operand.
26107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Also unlike other operations, quantize will never raise Underflow, even
26127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if the result is subnormal and inexact.
26137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26149ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
26157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.170")
26169ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
26177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.17")
26189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
26197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.2")
26209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
26217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2")
26229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
26237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0E+1")
26249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
26257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-Infinity")
26269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
26277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
26289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
26297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0")
26309ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
26317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0E+5")
26329ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
26337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
26349ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
26357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
26369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
26377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("217.0")
26389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
26397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("217")
26409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
26417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.2E+2")
26429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
26437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2E+2")
26447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
26457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.quantize(b, context=self)
26467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder(self, a, b):
26487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the remainder from integer division.
26497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is the residue of the dividend after the operation of
26517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        calculating integer division as described for divide-integer, rounded to
26527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        precision digits if necessary. The sign of the result, if non-zero, is
26537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the same as that of the original dividend.
26547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
26567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
26577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
26587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
26607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.1")
26619ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
26627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
26639ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
26647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
26659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
26667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.2")
26679ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
26687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.1")
26699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
26707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
26717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
26727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mod__(b, context=self)
26737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, a, b):
26757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns to be "a - b * n", where n is the integer nearest the exact
26767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        value of "x / b" (if two integers are equally near then the even one
26777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        is chosen). If the result is equal to 0 then its sign will be the
26787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign of a.
26797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
26817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
26827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
26837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
26857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.9")
26869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
26877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-2")
26889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
26897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
26909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
26917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
26929ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
26937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.2")
26949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
26957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.1")
26969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
26977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.3")
26987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
26997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.remainder_near(b, context=self)
27007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, a, b):
27027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns True if the two operands have the same exponent.
27037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is never affected by either the sign or the coefficient of
27057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        either operand.
27067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
27087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
27099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
27107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
27119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
27127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
27139ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
27147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
27157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.same_quantum(b)
27177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def sqrt(self, a):
27197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the square root of a non-negative number to context precision.
27207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the result must be inexact, it is rounded using the round-half-even
27227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        algorithm.
27237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0'))
27257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
27269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('-0'))
27277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0")
27289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0.39'))
27297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.624499800")
27309ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('100'))
27317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("10")
27329ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1'))
27337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
27349ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.0'))
27357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
27369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.00'))
27377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
27389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('7'))
27397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.64575131")
27409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('10'))
27417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.16227766")
27429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.prec
27436ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        9
27447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.sqrt(context=self)
27467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def subtract(self, a, b):
27487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the sum of the two operands.
27497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
27517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.23")
27529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
27537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.00")
27549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
27557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.77")
27567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__sub__(b, context=self)
27587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, a):
27607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
27617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
27637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.to_eng_string(context=self)
27657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_sci_string(self, a):
27677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
27687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
27707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__str__(context=self)
27727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_integral(self, a):
27747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds to an integer.
27757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        When the operand has a negative exponent, the result is the same
27777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        as using the quantize() operation using the given operand as the
27787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
27797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        of the operand as the precision setting, except that no flags will
27807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        be set. The rounding mode is taken from the context.
27817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('2.1'))
27837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2")
27849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('100'))
27857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("100")
27869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('100.0'))
27877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("100")
27889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('101.5'))
27897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("102")
27909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('-101.5'))
27917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-102")
27929ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('10E+5'))
27937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0E+6")
27949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('7.89E+77'))
27957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("7.89E+77")
27969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('-Inf'))
27977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-Infinity")
27987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.to_integral(context=self)
28007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass _WorkRep(object):
28027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __slots__ = ('sign','int','exp')
28037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # sign: -1 None 1
28047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # int:  list
28057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # exp:  None, int, or string
28067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, value=None):
28087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if value is None:
28097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = None
28107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int = []
28117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = None
28127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, Decimal):
28137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if value._sign:
28147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self.sign = -1
28157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
28167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self.sign = 1
28177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int = list(value._int)
28187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value._exp
28197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, tuple):
28207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = value[0]
28217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int = value[1]
28227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value[2]
28237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
28257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
28267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __str__ = __repr__
28287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __neg__(self):
28307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.sign == 1:
28317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return _WorkRep( (-1, self.int, self.exp) )
28327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
28337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return _WorkRep( (1, self.int, self.exp) )
28347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __abs__(self):
28367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.sign == -1:
28377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -self
28387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
28397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
28407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __cmp__(self, other):
28427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.exp != other.exp:
28437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            raise ValueError("Operands not normalized: %r, %r" % (self, other))
28447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.sign != other.sign:
28457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self.sign == -1:
28467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return -1
28477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
28487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return 1
28497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.sign == -1:
28507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            direction = -1
28517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
28527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            direction = 1
28537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        int1 = self.int
28547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        int2 = other.int
28557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(int1) > len(int2):
28567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return direction * 1
28577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(int1) < len(int2):
28587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return direction * -1
28597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for i in xrange(len(int1)):
28607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if int1[i] > int2[i]:
28617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return direction * 1
28627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if int1[i] < int2[i]:
28637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return direction * -1
28647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
28657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _increment(self):
28677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        curspot = len(self.int) - 1
28687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.int[curspot]+= 1
28697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while (self.int[curspot] >= 10):
28707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int[curspot] -= 10
28717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if curspot == 0:
28727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self.int[0:0] = [1]
28737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
28747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int[curspot-1] += 1
28757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            curspot -= 1
28767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def subtract(self, alist):
28787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Subtract a list from the current int (in place).
28797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        It is assured that (len(list) = len(self.int) and list < self.int) or
28817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        len(list) = len(self.int)-1
28827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (i.e. that int(join(list)) < int(join(self.int)))
28837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
28847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        selfint = self.int
28867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        selfint.reverse()
28877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        alist.reverse()
28887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        carry = 0
28907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for x in xrange(len(alist)):
28917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            selfint[x] -= alist[x] + carry
28927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if selfint[x] < 0:
28937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                carry = 1
28947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                selfint[x] += 10
28957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
28964e0e1b6a540e664e89739456db4c706701bf062bTim Peters                carry = 0
28977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if carry:
28987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            selfint[x+1] -= 1
28997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        last = len(selfint)-1
29007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while len(selfint) > 1 and selfint[last] == 0:
29017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            last -= 1
29027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if last == 0:
29037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
29047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        selfint[last+1:]=[]
29057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        selfint.reverse()
29067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        alist.reverse()
29077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return
29087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _normalize(op1, op2, shouldround = 0, prec = 0):
29117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Normalizes op1, op2 to have the same exp and length of coefficient.
29127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Done during addition.
29147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
29157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Yes, the exponent is a long, but the difference between exponents
29167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # must be an int-- otherwise you'd get a big memory problem.
29177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    numdigits = int(op1.exp - op2.exp)
29187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if numdigits < 0:
29197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = -numdigits
29207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op2
29217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op1
29227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
29237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op1
29247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op2
29257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if shouldround and numdigits > len(other.int) + prec + 1 -len(tmp.int):
29277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # If the difference in adjusted exps is > prec+1, we know
29287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # other is insignificant, so might as well put a 1 after the precision.
29297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # (since this is only for addition.)  Also stops MemoryErrors.
29307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        extend = prec + 2 -len(tmp.int)
29327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if extend <= 0:
29337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            extend = 1
29347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp.int.extend([0]*extend)
29357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp.exp -= extend
29367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other.int[:] = [0]*(len(tmp.int)-1)+[1]
29377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other.exp = tmp.exp
29387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return op1, op2
29397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    tmp.int.extend([0] * numdigits)
29417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    tmp.exp = tmp.exp - numdigits
29427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    numdigits = len(op1.int) - len(op2.int)
29437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # numdigits != 0 => They have the same exponent, but not the same length
29447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # of the coefficient.
29457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if numdigits < 0:
29467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = -numdigits
29477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op1
29487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
29497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op2
29507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    tmp.int[0:0] = [0] * numdigits
29517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return op1, op2
29527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _adjust_coefficients(op1, op2):
29547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Adjust op1, op2 so that op2.int+[0] > op1.int >= op2.int.
29557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Returns the adjusted op1, op2 as well as the change in op1.exp-op2.exp.
29577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Used on _WorkRep instances during division.
29597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
29607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    adjust = 0
29617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #If op1 is smaller, get it to same size
29627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if len(op2.int) > len(op1.int):
29637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        diff = len(op2.int) - len(op1.int)
29647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.int.extend([0]*diff)
29657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.exp -= diff
29667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust = diff
29677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #Same length, wrong order
29697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if len(op1.int) == len(op2.int) and op1.int < op2.int:
29707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.int.append(0)
29717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.exp -= 1
29727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust+= 1
29737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return op1, op2, adjust
29747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if len(op1.int) > len(op2.int) + 1:
29767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        diff = len(op1.int) - len(op2.int) - 1
29777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.int.extend([0]*diff)
29787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.exp -= diff
29797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust -= diff
29807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if len(op1.int) == len(op2.int)+1 and op1.int > op2.int:
29827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.int.append(0)
29847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.exp -= 1
29857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust -= 1
29867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return op1, op2, adjust
29877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Helper Functions ########################################
29897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger_infinity_map = {
29917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'inf' : 1,
29927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'infinity' : 1,
29937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '+inf' : 1,
29947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '+infinity' : 1,
29957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '-inf' : -1,
29967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '-infinity' : -1
29977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger}
29987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29990ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerdef _isinfinity(num):
30007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Determines whether a string or float is infinity.
30017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30020ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    +1 for negative infinity; 0 for finite ; +1 for positive infinity
30037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
30047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    num = str(num).lower()
30057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return _infinity_map.get(num, 0)
30067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30070ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerdef _isnan(num):
30087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Determines whether a string or float is NaN
30097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (1, sign, diagnostic info as string) => NaN
30117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (2, sign, diagnostic info as string) => sNaN
30127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    0 => not a NaN
30137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
30147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    num = str(num).lower()
30157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if not num:
30167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
30177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #get the sign, get rid of trailing [+-]
30197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    sign = 0
30207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if num[0] == '+':
30217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        num = num[1:]
30227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    elif num[0] == '-':  #elif avoids '+-nan'
30237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        num = num[1:]
30247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = 1
30257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if num.startswith('nan'):
30277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(num) > 3 and not num[3:].isdigit(): #diagnostic info
30287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
30297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (1, sign, num[3:].lstrip('0'))
30307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if num.startswith('snan'):
30317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(num) > 4 and not num[4:].isdigit():
30327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
30337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (2, sign, num[4:].lstrip('0'))
30347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return 0
30357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Setup Specific Contexts ################################
30387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# The default context prototype used by Context()
3040fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger# Is mutable, so that new contexts can have different default values
30417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDefaultContext = Context(
30436ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=28, rounding=ROUND_HALF_EVEN,
3044bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation],
3045bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
30467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        _rounding_decision=ALWAYS_ROUND,
304799148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emax=999999999,
304899148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emin=-999999999,
3049e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        capitals=1
30507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
30517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Pre-made alternate contexts offered by the specification
30537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Don't change these; the user should be able to select these
30547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# contexts and be able to reproduce results from other implementations
30557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# of the spec.
30567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerBasicContext = Context(
30587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prec=9, rounding=ROUND_HALF_UP,
3059bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
3060bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
30617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
30627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30639ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerExtendedContext = Context(
30646ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=9, rounding=ROUND_HALF_EVEN,
3065bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[],
3066bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
30677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
30687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3070d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger##### Useful Constants (internal use only) ####################
30717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Reusable defaults
30737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInf = Decimal('Inf')
30747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingernegInf = Decimal('-Inf')
30757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Infsign[sign] is infinity w/ that sign
30777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfsign = (Inf, negInf)
30787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN = Decimal('NaN')
30807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### crud for parsing strings #################################
30837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport re
30847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# There's an optional sign at the start, and an optional exponent
30867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# at the end.  The exponent has an optional sign and at least one
30877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# digit.  In between, must have either at least one digit followed
30887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# by an optional fraction, or a decimal point followed by at least
30897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# one digit.  Yuck.
30907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger_parser = re.compile(r"""
30927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
30937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (?P<sign>[-+])?
30947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (
30957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (?P<int>\d+) (\. (?P<frac>\d*))?
30967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    |
30977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        \. (?P<onlyfrac>\d+)
30987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    )
30997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    ([eE](?P<exp>[-+]? \d+))?
31007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
31017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    $
31027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger""", re.VERBOSE).match #Uncomment the \s* to allow leading or trailing spaces.
31037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdel re
31057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# return sign, n, p s.t. float string value == -1**sign * n * 10**p exactly
31077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _string2exact(s):
31097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    m = _parser(s)
31107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if m is None:
31117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        raise ValueError("invalid literal for Decimal: %r" % s)
31127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if m.group('sign') == "-":
31147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = 1
31157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
31167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = 0
31177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    exp = m.group('exp')
31197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if exp is None:
31207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = 0
31217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
31227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = int(exp)
31237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    intpart = m.group('int')
31257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if intpart is None:
31267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        intpart = ""
31277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        fracpart = m.group('onlyfrac')
31287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
31297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        fracpart = m.group('frac')
31307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if fracpart is None:
31317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            fracpart = ""
31327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    exp -= len(fracpart)
31347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    mantissa = intpart + fracpart
31367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    tmp = map(int, mantissa)
31377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    backup = tmp
31387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    while tmp and tmp[0] == 0:
31397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        del tmp[0]
31407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # It's a zero
31427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if not tmp:
31437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if backup:
31447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (sign, tuple(backup), exp)
31457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (sign, (0,), exp)
31467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    mantissa = tuple(tmp)
31477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return (sign, mantissa, exp)
31497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerif __name__ == '__main__':
31527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    import doctest, sys
31537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    doctest.testmod(sys.modules[__name__])
3154