decimal.py revision d6c700a320eacd6f04cbcc60996b84e765766890
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
107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"""
127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThis is a Py2.3 implementation of decimal floating point arithmetic based on
137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerthe General Decimal Arithmetic Specification:
147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    www2.hursley.ibm.com/decimal/decarith.html
167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
170ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerand IEEE standard 854-1987:
187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal floating point has finite precision with arbitrarily large bounds.
227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThe purpose of the module is to support arithmetic using familiar
247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"schoolhouse" rules and to avoid the some of tricky representation
257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerissues associated with binary floating point.  The package is especially
267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingeruseful for financial applications or for contexts where users have
277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerexpectations that are at odds with binary floating point (for instance,
287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerin binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerof the expected Decimal("0.00") returned by decimal floating point).
307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerHere are some examples of using the decimal module:
327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> from decimal import *
34bd7f76dd04780304c397323ae994092ce759d5a2Raymond Hettinger>>> setcontext(ExtendedContext)
357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(0)
367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("0")
377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("1")
387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("1")
397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("-.0123")
407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("-0.0123")
417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(123456)
427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("123456")
437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("123.45e12345678901234567890")
447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("1.2345E+12345678901234567892")
457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("1.33") + Decimal("1.27")
467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("2.60")
477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41")
487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("-2.20")
497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> dig = Decimal(1)
507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3)
517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333
527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> getcontext().prec = 18
537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3)
547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333333333333
557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig.sqrt()
567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3).sqrt()
587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1.73205080756887729
597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3) ** 123
607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger4.85192780976896427E+58
617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> inf = Decimal(1) / Decimal(0)
627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print inf
637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity
647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> neginf = Decimal(-1) / Decimal(0)
657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf
667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity
677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf + inf
687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN
697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf * inf
707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity
717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0
727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity
73bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> getcontext().traps[DivisionByZero] = 1
747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0
757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last):
767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDivisionByZero: x / 0
807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c = Context()
81bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0
825aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0
847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c.divide(Decimal(0), Decimal(0))
857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal("NaN")
86bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 1
875aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
895aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0
905aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0
927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0))
937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last):
947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
975aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond HettingerInvalidOperation: 0 / 0
985aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
1005aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0
101bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0
1027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0))
1037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN
1045aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
1067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>>
1077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"""
1087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger__all__ = [
1107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Two major classes
1117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'Decimal', 'Context',
1127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Contexts
1149ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    'DefaultContext', 'BasicContext', 'ExtendedContext',
1157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Exceptions
117d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger    'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
118d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger    'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
1197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Constants for use in setting up contexts
1217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
1227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN',
1237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Functions for manipulating contexts
1250ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    'setcontext', 'getcontext'
1267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger]
1277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport threading
1297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport copy
1307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport operator
1317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Rounding
1330ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_DOWN = 'ROUND_DOWN'
1340ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_UP = 'ROUND_HALF_UP'
1350ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
1360ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_CEILING = 'ROUND_CEILING'
1370ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_FLOOR = 'ROUND_FLOOR'
1380ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_UP = 'ROUND_UP'
1390ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
1407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1419ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger#Rounding decision (not part of the public API)
1420ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerNEVER_ROUND = 'NEVER_ROUND'    # Round in division (non-divmod), sqrt ONLY
1430ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerALWAYS_ROUND = 'ALWAYS_ROUND'  # Every operation rounds at end.
1447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Errors
1467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DecimalException(ArithmeticError):
1485aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    """Base exception class.
1497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Used exceptions derive from this.
1517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    If an exception derives from another exception besides this (such as
1527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
1537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    called if the others are present.  This isn't actually used for
1547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    anything, though.
1557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    handle  -- Called when context._raise_error is called and the
1577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               trap_enabler is set.  First argument is self, second is the
1587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               context.  More arguments can be given, those being after
1597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               the explanation in _raise_error (For example,
1607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               context._raise_error(NewError, '(-x)!', self._sign) would
1617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger               call NewError().handle(context, self._sign).)
1627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    To define a new exception, it should be sufficient to have it derive
1647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    from DecimalException.
1657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
1677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        pass
1687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Clamped(DecimalException):
1717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent of a 0 changed to fit bounds.
1727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals clamped if the exponent of a result has been
1747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    altered in order to fit the constraints of a specific concrete
1757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    representation. This may occur when the exponent of a zero result would
1767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    be outside the bounds of a representation, or  when a large normal
1777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    number would have an encoded exponent that cannot be represented. In
1787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    this latter case, the exponent is reduced to fit and the corresponding
1797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    number of zero digits are appended to the coefficient ("fold-down").
1807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidOperation(DecimalException):
1847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """An invalid operation was performed.
1857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Various bad things cause this:
1877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Something creates a signaling NaN
1897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -INF + INF
1907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger     0 * (+-)INF
1917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger     (+-)INF / (+-)INF
1927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x % 0
1937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (+-)INF % x
1947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x._rescale( non-integer )
1957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    sqrt(-x) , x > 0
1967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    0 ** 0
1977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (non-integer)
1987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (+-)INF
1997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    An operand is invalid
2007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if args:
2037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if args[0] == 1: #sNaN, must drop 's' but keep diagnostics
2047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (args[1]._sign, args[1]._int, 'n') )
2057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass ConversionSyntax(InvalidOperation):
2087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Trying to convert badly formed string.
2097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an string is being
2117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    converted to a number and it does not conform to the numeric string
2127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    syntax. The result is [0,qNaN].
2137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (0, (0,), 'n') #Passed to something which uses a tuple.
2177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionByZero(DecimalException, ZeroDivisionError):
2197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Division by 0.
2207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals division-by-zero if division of a finite number
2227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero was attempted (during a divide-integer or divide operation, or a
2237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    power operation with negative right-hand operand), and the dividend was
2247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not zero.
2257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result of the operation is [sign,inf], where sign is the exclusive
2277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or of the signs of the operands for divide, or is 1 for an odd power of
2287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -0, for power.
2297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, sign, double = None, *args):
2327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if double is not None:
2337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (Infsign[sign],)*2
2347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Infsign[sign]
2357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionImpossible(InvalidOperation):
2377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Cannot perform the division adequately.
2387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if the integer result of a
2407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    divide-integer or remainder operation had too many digits (would be
2417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    longer than precision). The result is [0,qNaN].
2427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (NaN, NaN)
2467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionUndefined(InvalidOperation, ZeroDivisionError):
2487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Undefined result of division.
2497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if division by zero was
2517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    attempted (during a divide-integer, divide, or remainder operation), and
2527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the dividend is also zero. The result is [0,qNaN].
2537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, tup=None, *args):
2567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tup is not None:
2577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (NaN, NaN) #for 0 %0, 0 // 0
2587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Inexact(DecimalException):
2617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Had to round, losing information.
2627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals inexact whenever the result of an operation is
2647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not exact (that is, it needed to be rounded and any discarded digits
2657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    were non-zero), or if an overflow or underflow condition occurs. The
2667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
2677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The inexact signal may be tested (or trapped) to determine if a given
2697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) was inexact.
2707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2715aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    pass
2727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidContext(InvalidOperation):
2747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Invalid context.  Unknown rounding, for example.
2757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an invalid context was
2777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    detected during an operation. This can occur if contexts are not checked
2787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    on creation and either the precision exceeds the capability of the
2797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    underlying concrete representation or an unknown or unsupported rounding
2807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    was specified. These aspects of the context need only be checked when
2817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the values are required to be used. The result is [0,qNaN].
2827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Rounded(DecimalException):
2887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Number got rounded (not  necessarily changed during rounding).
2897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals rounded whenever the result of an operation is
2917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    rounded (that is, some zero or non-zero digits were discarded from the
2927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    coefficient), or if an overflow or underflow condition occurs. The
2937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
2947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The rounded signal may be tested (or trapped) to determine if a given
2967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) caused a loss of precision.
2977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2985aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    pass
2997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Subnormal(DecimalException):
3017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent < Emin before rounding.
3027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals subnormal whenever the result of a conversion or
3047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation is subnormal (that is, its adjusted exponent is less than
3057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Emin, before any rounding). The result in all cases is unchanged.
3067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The subnormal signal may be tested (or trapped) to determine if a given
3087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or operation (or sequence of operations) yielded a subnormal result.
3097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    pass
3117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Overflow(Inexact, Rounded):
3137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical overflow.
3147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals overflow if the adjusted exponent of a result
3167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (from a conversion or from an operation that is not an attempt to divide
3177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero), after rounding, would be greater than the largest value that
3187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    can be handled by the implementation (the value Emax).
3197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result depends on the rounding mode:
3217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    For round-half-up and round-half-even (and for round-half-down and
3237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-up, if implemented), the result of the operation is [sign,inf],
3247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    where sign is the sign of the intermediate result. For round-down, the
3257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result is the largest finite number that can be represented in the
3267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    current precision, with the sign of the intermediate result. For
3277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-ceiling, the result is the same as for round-down if the sign of
3287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
3297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the result is the same as for round-down if the sign of the intermediate
3307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
3317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    will also be raised.
3327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger   """
3337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, sign, *args):
3357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
3367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                     ROUND_HALF_DOWN, ROUND_UP):
3377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Infsign[sign]
3387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 0:
3397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_CEILING:
3407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
3417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal((sign, (9,)*context.prec,
3427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                            context.Emax-context.prec+1))
3437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 1:
3447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_FLOOR:
3457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
3467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (sign, (9,)*context.prec,
3477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                             context.Emax-context.prec+1))
3487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Underflow(Inexact, Rounded, Subnormal):
3517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical underflow with result rounded to 0.
3527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals underflow if a result is inexact and the
3547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    adjusted exponent of the result would be smaller (more negative) than
3557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the smallest value that can be handled by the implementation (the value
3567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Emin). That is, the result is both inexact and subnormal.
3577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result after an underflow will be a subnormal number rounded, if
3597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    necessary, so that its exponent is not less than Etiny. This may result
3607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    in 0 with the sign of the intermediate result and an exponent of Etiny.
3617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    In all cases, Inexact, Rounded, and Subnormal will also be raised.
3637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3655aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# List of public traps and flags
366fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
3675aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger           Underflow, InvalidOperation, Subnormal]
3687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3695aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# Map conditions (per the spec) to signals
3705aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger_condition_map = {ConversionSyntax:InvalidOperation,
3715aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionImpossible:InvalidOperation,
3725aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionUndefined:InvalidOperation,
3735aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  InvalidContext:InvalidOperation}
3747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Context Functions #######################################
3767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
377ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# The getcontext() and setcontext() function manage access to a thread-local
378ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# current context.  Py2.4 offers direct support for thread locals.  If that
379ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# is not available, use threading.currentThread() which is slower but will
380ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# work for older Pythons.
381ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
382ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingertry:
383ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    threading.local
384ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
385ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerexcept AttributeError:
386ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
387ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    #To fix reloading, force it to create a new context
388ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    #Old contexts have different exceptions in their dicts, making problems.
389ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    if hasattr(threading.currentThread(), '__decimal_context__'):
390ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        del threading.currentThread().__decimal_context__
391ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
392ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context):
393ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
394ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
3959fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
39661992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
3977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        threading.currentThread().__decimal_context__ = context
398ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
399ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext():
400ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
401ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
402ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
403ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
404ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
405ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
406ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
407ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return threading.currentThread().__decimal_context__
408ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
409ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
410ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            threading.currentThread().__decimal_context__ = context
411ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
412ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
413ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerelse:
414ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
415ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    local = threading.local()
4169fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    if hasattr(local, '__decimal_context__'):
4179fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        del local.__decimal_context__
418ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
419ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext(_local=local):
420ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
421ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
422ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
423ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
424ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
425ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
426ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
427ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return _local.__decimal_context__
428ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
429ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
430ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            _local.__decimal_context__ = context
431ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
432ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
433ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context, _local=local):
434ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
435ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4369fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
43761992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
438ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        _local.__decimal_context__ = context
439ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
440ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    del threading, local        # Don't contaminate the namespace
4417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Decimal class ###########################################
4447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Decimal(object):
4467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Floating point class for decimal arithmetic."""
4477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __slots__ = ('_exp','_int','_sign')
4497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, value="0", context=None):
4517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Create a decimal point instance.
4527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal('3.14')              # string input
4547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.14")
4557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal((0, (3, 1, 4), -2))  # tuple input (sign, digit_tuple, exponent)
4567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.14")
4577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(314)                 # int or long
4587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("314")
4597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(Decimal(314))        # another decimal instance
4607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("314")
4617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
4627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
4637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
4647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, (int,long)):
4667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            value = str(value)
4677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # String?
4697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # REs insist on real strings, so we can too.
4707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, basestring):
4710ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger            if _isinfinity(value):
4727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._exp = 'F'
4737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._int = (0,)
4740ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                sign = _isinfinity(value)
4757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if sign == 1:
4767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._sign = 0
4777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
4787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._sign = 1
4797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return
4800ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger            if _isnan(value):
4810ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                sig, sign, diag = _isnan(value)
4827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if len(diag) > context.prec: #Diagnostic info too long
4837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._sign, self._int, self._exp = \
4847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                context._raise_error(ConversionSyntax)
4857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return
4867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if sig == 1:
4877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._exp = 'n' #qNaN
4887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else: #sig == 2
4897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    self._exp = 'N' #sNaN
4907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._sign = sign
4917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._int = tuple(map(int, diag)) #Diagnostic info
4927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return
493d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger            try:
494d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger                self._sign, self._int, self._exp = _string2exact(value)
495d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger            except ValueError:
496d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger                self._sign, self._int, self._exp = context._raise_error(ConversionSyntax)
4977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return
4987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # tuple/list conversion (possibly from as_tuple())
5007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, (list,tuple)):
5017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(value) != 3:
5027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                raise ValueError, 'Invalid arguments'
5037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if value[0] not in [0,1]:
5047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                raise ValueError, 'Invalid sign'
5057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for digit in value[1]:
5067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if not isinstance(digit, (int,long)) or digit < 0:
5077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    raise ValueError, "The second value in the tuple must be composed of non negative integer elements."
5087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._sign = value[0]
5107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._int  = tuple(value[1])
5117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if value[2] in ('F','n','N'):
5127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._exp = value[2]
5137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
5147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._exp  = int(value[2])
5157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return
5167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Turn an intermediate value back to Decimal()
5187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, _WorkRep):
5197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if value.sign == 1:
5207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._sign = 0
5217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
5227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self._sign = 1
5237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._int = tuple(value.int)
5247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._exp = int(value.exp)
5257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return
5267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, Decimal):
5284e0e1b6a540e664e89739456db4c706701bf062bTim Peters            self._exp  = value._exp
5294e0e1b6a540e664e89739456db4c706701bf062bTim Peters            self._sign = value._sign
5304e0e1b6a540e664e89739456db4c706701bf062bTim Peters            self._int  = value._int
5314e0e1b6a540e664e89739456db4c706701bf062bTim Peters            return
5327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
533bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if isinstance(value, float):
534bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger            raise TypeError("Cannot convert float to Decimal.  " +
535bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger                            "First convert the float to a string")
536bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger
537bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        raise TypeError("Cannot convert %r" % value)
5387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _convert_other(self, other):
5407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Convert other to Decimal.
5417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Verifies that it's ok to use in an implicit construction.
5437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(other, Decimal):
5457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return other
5467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(other, (int, long)):
5477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            other = Decimal(other)
5487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return other
5497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        raise TypeError, "You can interact Decimal only with int, long or Decimal data types."
5517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isnan(self):
5537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
5547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if a number
5567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if NaN
5577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        2 if sNaN
5587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 'n':
5607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
5617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._exp == 'N':
5627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 2
5637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
5647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinfinity(self):
5667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is infinite
5677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if finite or not a number
5697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if +INF
5707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 if -INF
5717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 'F':
5737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign:
5747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return -1
5757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
5767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
5777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _check_nans(self, other = None, context=None):
5797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
5807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are sNaN, signal
5827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are NaN return nan
5837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
5847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Done before operations.
5867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
5887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
5897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isnan() == 2:
5917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'sNaN',
5927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                       1, self)
5937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other is not None and other._isnan() == 2:
5947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'sNaN',
5957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                       1, other)
5967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isnan():
5977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
5987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other is not None and other._isnan():
5997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return other
6007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
6017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __nonzero__(self):
6037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Is the number non-zero?
6047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if self == 0
6067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if self != 0
6077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
6087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(self._exp, str):
6097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
6107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._int != (0,)*len(self._int)
6117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __cmp__(self, other, context=None):
6137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
6147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
6157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
6167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
6187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
6197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
6207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
6227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0 #If both 0, sign comparison isn't certain.
6237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #If different signs, neg one is less
6257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._sign < self._sign:
6267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -1
6277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign < other._sign:
6287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
6297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # INF = INF
6317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity() and other._isinfinity():
6327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
6337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
6347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (-1)**self._sign
6357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._isinfinity():
6367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -((-1)**other._sign)
6377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.adjusted() == other.adjusted() and \
6397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger           self._int + (0,)*(self._exp - other._exp) == \
6407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger           other._int + (0,)*(other._exp - self._exp):
6417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0 #equal, except in precision. ([0]*(-x) = [])
6427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self.adjusted() > other.adjusted() and self._int[0] != 0:
6437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (-1)**self._sign
6447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self.adjusted < other.adjusted() and other._int[0] != 0:
6457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -((-1)**self._sign)
6467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6479fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
6487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_UP) #round away from 0
6497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_all_flags()
6517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        res = self.__sub__(other, context=context)
6527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._regard_flags(*flags)
6547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.rounding = rounding
6567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not res:
6587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
6597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif res._sign:
6607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -1
6617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 1
6627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6630aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __eq__(self, other):
6640aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        if not isinstance(other, (Decimal, int, long)):
6650aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger            return False
6660aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        return self.__cmp__(other) == 0
6670aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
6680aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __ne__(self, other):
6690aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        if not isinstance(other, (Decimal, int, long)):
6700aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger            return True
6710aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger        return self.__cmp__(other) != 0
6720aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
6737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, other, context=None):
6747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares one to another.
6757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 => a < b
6777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0  => a = b
6787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1  => a > b
6797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN => one is NaN
6807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Like __cmp__, but returns Decimal instances.
6817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
6827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
6837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
6847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
6857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #compare(NaN, NaN) = NaN
6877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
6887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
6897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
6907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal(self.__cmp__(other, context))
6927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __hash__(self):
6947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """x.__hash__() <==> hash(x)"""
6957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Decimal integers must hash the same as the ints
6967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Non-integer decimals are normalized and hashed as strings
6977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Normalization assures that hast(100E-1) == hash(10)
6987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        i = int(self)
6997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self == Decimal(i):
7007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return hash(i)
7017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        assert self.__nonzero__()   # '-0' handled by integer case
7027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return hash(str(self.normalize()))
7037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def as_tuple(self):
7057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as a triple tuple.
7067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        To show the internals exactly as they are.
7087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
7097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (self._sign, self._int, self._exp)
7107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
7127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as an instance of Decimal."""
7137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Invariant:  eval(repr(d)) == d
7147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 'Decimal("%s")' % str(self)
7157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __str__(self, eng = 0, context=None):
7177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return string representation of the number in scientific notation.
7187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Captures all of the information in the underlying representation.
7207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
7217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isnan():
7237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            minus = '-'*self._sign
7247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._int == (0,):
7257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                info = ''
7267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
7277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                info = ''.join(map(str, self._int))
7287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._isnan() == 2:
7297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return minus + 'sNaN' + info
7307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return minus + 'NaN' + info
7317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
7327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            minus = '-'*self._sign
7337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return minus + 'Infinity'
7347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
7367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
7377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = map(str, self._int)
7397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = len(self._int)
7407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        leftdigits = self._exp + numdigits
7417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if eng and not self: #self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY
7427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._exp < 0 and self._exp >= -6: #short, no need for e/E
7437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s = '-'*self._sign + '0.' + '0'*(abs(self._exp))
7447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return s
7457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #exp is closest mult. of 3 >= self._exp
7467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = ((self._exp - 1)// 3 + 1) * 3
7477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp != self._exp:
7487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s = '0.'+'0'*(exp - self._exp)
7497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
7507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s = '0'
7517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp != 0:
7527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if context.capitals:
7537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    s += 'E'
7547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
7557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    s += 'e'
7567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if exp > 0:
7577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    s += '+' #0.0e+3, not 0.0e3
7587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                s += str(exp)
7597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            s = '-'*self._sign + s
7607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return s
7617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if eng:
7627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            dotplace = (leftdigits-1)%3+1
7637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            adjexp = leftdigits -1 - (leftdigits-1)%3
7647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
7657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            adjexp = leftdigits-1
7667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            dotplace = 1
7677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 0:
7687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            pass
7697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._exp < 0 and adjexp >= 0:
7707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.insert(leftdigits, '.')
7717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._exp < 0 and adjexp >= -6:
7727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp[0:0] = ['0'] * int(-leftdigits)
7737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.insert(0, '0.')
7747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
7757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if numdigits > dotplace:
7767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp.insert(dotplace, '.')
7777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            elif numdigits < dotplace:
7787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp.extend(['0']*(dotplace-numdigits))
7797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if adjexp:
7807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if not context.capitals:
7817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    tmp.append('e')
7827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
7837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    tmp.append('E')
7847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    if adjexp > 0:
7857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                        tmp.append('+')
7867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp.append(str(adjexp))
7877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if eng:
7887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            while tmp[0:1] == ['0']:
7897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp[0:1] = []
7907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(tmp) == 0 or tmp[0] == '.' or tmp[0].lower() == 'e':
7917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp[0:0] = ['0']
7927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
7937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.insert(0, '-')
7947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ''.join(tmp)
7967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, context=None):
7987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Convert to engineering-type string.
7997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Engineering notation has an exponent which is a multiple of 3, so there
8017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        are up to 3 digits left of the decimal place.
8027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Same rules for when in exponential and when as a value as in __str__.
8047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
8067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
8077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__str__(eng=1, context=context)
8087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __neg__(self, context=None):
8107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy with the sign switched.
8117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds, if it has reason.
8137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
8157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
8167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
8177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
8187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
8197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
8217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # -Decimal('0') is Decimal('0'), not Decimal('-0')
8227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 0
8237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._sign:
8247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 0
8257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
8267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 1
8277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context._rounding_decision == ALWAYS_ROUND:
8287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal((sign, self._int, self._exp))._fix(context=context)
8297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal( (sign, self._int, self._exp))
8307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __pos__(self, context=None):
8327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy, unless it is a sNaN.
8337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds the number (if more then precision digits)
8357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
8377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
8387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
8397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
8407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
8417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = self._sign
8437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
8447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # + (-0) = 0
8457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 0
8467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context._rounding_decision == ALWAYS_ROUND:
8487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self._fix(context=context)
8497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
8507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal(self)
8517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans._sign = sign
8527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
8537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __abs__(self, round=1, context=None):
8557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of self.
8567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the second argument is 0, do not round.
8587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
8607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
8617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
8627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
8637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
8647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not round:
8669fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context._shallow_copy()
8677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._set_rounding_decision(NEVER_ROUND)
8687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
8707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__neg__(context=context)
8717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
8727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__pos__(context=context)
8737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
8757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __add__(self, other, context=None):
8777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns self + other.
8787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -INF + INF (or the reverse) cause InvalidOperation errors.
8807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
8817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
8827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
8837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
8847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
8867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
8877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
8887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
8907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #If both INF, same sign => same as both, opposite => error.
8917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign != other._sign and other._isinfinity():
8927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '-INF + INF')
8937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(self)
8947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._isinfinity():
8957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(other)  #Can't both be infinity here
8967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
8987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = min(self._exp, other._exp)
9007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negativezero = 0
9017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding == ROUND_FLOOR and self._sign != other._sign:
9027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #If the answer is 0, the sign should be negative, in this case.
9037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            negativezero = 1
9047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
9067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = min(self._sign, other._sign)
9077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if negativezero:
9087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                sign = 1
9097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (sign, (0,), exp))
9107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
9117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp < other._exp - context.prec-1:
9127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = other._exp - context.prec-1
9137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other._rescale(exp, watchexp=0, context=context)
9147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
9157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._fix(context=context)
9167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
9177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not other:
9187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp < self._exp - context.prec-1:
9197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = self._exp - context.prec-1
9207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self._rescale(exp, watchexp=0, context=context)
9217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
9227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._fix(context=context)
9237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
9247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = _WorkRep(self)
9267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = _WorkRep(other)
9277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1, op2 = _normalize(op1, op2, shouldround, context.prec)
9287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result = _WorkRep()
9307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if op1.sign != op2.sign:
9327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            diff = cmp(abs(op1), abs(op2))
9337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # Equal and opposite
9347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if diff == 0:
9357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if exp < context.Etiny():
9367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    exp = context.Etiny()
9377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Clamped)
9387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal((negativezero, (0,), exp))
9397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if diff < 0:
9407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1, op2 = op2, op1
9417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #OK, now abs(op1) > abs(op2)
9427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if op1.sign == -1:
9437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                result.sign = -1
9447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1.sign, op2.sign = op2.sign, op1.sign
9457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
9467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                result.sign = 1
9477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #So we know the sign, and op1 > 0.
9487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif op1.sign == -1:
9497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.sign = -1
9507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            op1.sign, op2.sign = (1, 1)
9517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
9527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.sign = 1
9537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Now, op1 > abs(op2) > 0
9547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.int.reverse()
9567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.int.reverse()
9577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if op2.sign == 1:
9597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.int = resultint = map(operator.add, op1.int, op2.int)
9607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            carry = 0
9617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for i in xrange(len(op1.int)):
9627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp = resultint[i] + carry
9637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                carry = 0
9647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if tmp > 9:
9657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    carry = 1
9667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    tmp -= 10
9677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                resultint[i] = tmp
9687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if carry:
9697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                resultint.append(1)
9707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
9717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.int = resultint = map(operator.sub, op1.int, op2.int)
9727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            loan = 0
9737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for i in xrange(len(op1.int)):
9747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp = resultint[i] - loan
9757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                loan = 0
9767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if tmp < 0:
9777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    loan = 1
9787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    tmp += 10
9797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                resultint[i] = tmp
9807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            assert not loan
9817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while resultint[-1] == 0:
9837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            resultint.pop()
9847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resultint.reverse()
9857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.exp = op1.exp
9877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(result)
9887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
9897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._fix(context=context)
9907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
9917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __radd__ = __add__
9937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __sub__(self, other, context=None):
9957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self + (-other)"""
9967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
9977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
9987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
9997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context=context)
10017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
10027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # -Decimal(0) = Decimal(0), which we don't want since
10057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # (-0 - 0 = -0 + (-0) = -0, but -0 + 0 = 0.)
10067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # so we change the sign directly to a copy
10077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(other)
10087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._sign = 1-tmp._sign
10097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__add__(tmp, context=context)
10117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rsub__(self, other, context=None):
10137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return other + (-self)"""
10147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
10157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
10167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
10177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(self)
10197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._sign = 1 - tmp._sign
10207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__add__(tmp, context=context)
10217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _increment(self, round=1, context=None):
10237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Special case of add, adding 1eExponent
10247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Since it is common, (rounding, for example) this adds
10267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (sign)*one E self._exp to the number more efficiently than add.
10277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        For example:
10297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal('5.624e10')._increment() == Decimal('5.625e10')
10307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
10317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
10327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
10337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
10347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
10357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        L = list(self._int)
10387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        L[-1] += 1
10397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        spot = len(L)-1
10407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while L[spot] == 10:
10417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            L[spot] = 0
10427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if spot == 0:
10437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                L[0:0] = [1]
10447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
10457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            L[spot-1] += 1
10467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            spot -= 1
10477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal((self._sign, L, self._exp))
10487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if round and context._rounding_decision == ALWAYS_ROUND:
10507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._fix(context=context)
10517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
10527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mul__(self, other, context=None):
10547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self * other.
10557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (+-) INF * 0 (or its reverse) raise InvalidOperation.
10577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
10587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
10597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
10607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
10617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
10637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
10647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1066d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger        resultsign = self._sign ^ other._sign
10677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
10687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not other:
10697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '(+-)INF * 0')
10707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Infsign[resultsign]
10717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._isinfinity():
10737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not self:
10747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '0 * (+-)INF')
10757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Infsign[resultsign]
10767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resultexp = self._exp + other._exp
10787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
10797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by zero
10817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self or not other:
10827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((resultsign, (0,), resultexp))
10837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
10847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #Fixing in case the exponent is out of bounds
10857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._fix(context=context)
10867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by power of 10
10897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._int == (1,):
10907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((resultsign, other._int, resultexp))
10917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
10927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._fix(context=context)
10937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._int == (1,):
10957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((resultsign, self._int, resultexp))
10967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if shouldround:
10977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._fix(context=context)
10987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = list(self._int)
11017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = list(other._int)
11027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.reverse()
11037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.reverse()
11047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Minimize Decimal additions
11057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(op2) > len(op1):
11067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            op1, op2 = op2, op1
11077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        _divmod = divmod
11097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        accumulator = [0]*(len(self._int) + len(other._int))
11107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for i in xrange(len(op2)):
11117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if op2[i] == 0:
11127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                continue
11137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            mult = op2[i]
11147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            carry = 0
11157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for j in xrange(len(op1)):
11167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                carry, accumulator[i+j] = _divmod( mult * op1[j] + carry
11177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                                  + accumulator[i+j], 10)
11187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if carry:
11207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                accumulator[i + j + 1] += carry
11217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while not accumulator[-1]:
11227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            accumulator.pop()
11237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        accumulator.reverse()
11247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal( (resultsign, accumulator, resultexp))
11267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
11277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._fix(context=context)
11287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
11307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __rmul__ = __mul__
11317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __div__(self, other, context=None):
11337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self / other."""
11347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, context=context)
11357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __truediv__ = __div__
11367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _divide(self, other, divmod = 0, context=None):
11387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return a / b, to context.prec precision.
11397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        divmod:
11417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 => true division
11427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 => (a //b, a%b)
11437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        2 => a //b
11447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        3 => a%b
11457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Actually, if divmod is 2 or 3 a tuple is returned, but errors for
11477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        computing the other value are not raised.
11487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
11497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
11507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
11517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
11527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
11547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
11557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if divmod:
11567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (ans, ans)
11577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
11587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return ans
11597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1160d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger        sign = self._sign ^ other._sign
11617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
11627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if divmod:
11637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(DivisionUndefined, '0 / 0', 1)
11647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(DivisionUndefined, '0 / 0')
11657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity() and other._isinfinity():
11667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not divmod:
11677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
11687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
11697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (context._raise_error(InvalidOperation,
11707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                         '(+-)INF // (+-)INF'),
11717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                        context._raise_error(InvalidOperation,
11727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                         '(+-)INF % (+-)INF'))
11737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not divmod:
11757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if other._isinfinity():
11767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._raise_error(Clamped, 'Division by infinity')
11777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal((sign, (0,), context.Etiny()))
11787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._isinfinity():
11797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
11807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #These two have different precision.
11817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not self:
11827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = self._exp - other._exp
11837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if exp < context.Etiny():
11847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    exp = context.Etiny()
11857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Clamped, '0e-x / y')
11867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if exp > context.Emax:
11877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    exp = context.Emax
11887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Clamped, '0e+x / y')
11897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (sign, (0,), exp) )
11907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not other:
11927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(DivisionByZero, 'x / 0', sign)
11937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if divmod:
11947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if other._isinfinity():
11957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal((sign, (0,), 0)), Decimal(self))
11967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._isinfinity():
11977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if divmod == 1:
11987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return (Infsign[sign],
11997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                            context._raise_error(InvalidOperation, 'INF % x'))
12007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                elif divmod == 2:
12017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return (Infsign[sign], NaN)
12027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                elif divmod == 3:
12037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return (Infsign[sign],
12047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                            context._raise_error(InvalidOperation, 'INF % x'))
12057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not self:
12067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = Decimal(self)
12077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside._exp = min(self._exp, other._exp)
12087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal((sign, (0,), 0)),  otherside)
12097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not other:
12117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(DivisionByZero, 'divmod(x,0)',
12127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                           sign, 1)
12137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #OK, so neither = 0, INF
12157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
12177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #If we're dividing into ints, and self < other, stop.
12197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #self.__abs__(0) does not round.
12207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if divmod and (self.__abs__(0, context) < other.__abs__(0, context)):
12217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if divmod == 1 or divmod == 3:
12237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = min(self._exp, other._exp)
12247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans2 = self._rescale(exp, context=context, watchexp=0)
12257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if shouldround:
12267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    ans2 = ans2._fix(context=context)
12277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal( (sign, (0,), 0) ),
12287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                        ans2)
12297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            elif divmod == 2:
12317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #Don't round the mod part, if we don't need it.
12327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal( (sign, (0,), 0) ), Decimal(self))
12337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign:
12357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = -1
12367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
12377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = 1
12387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust = 0
12397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = _WorkRep(self)
12407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = _WorkRep(other)
12417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1, op2, adjust = _adjust_coefficients(op1, op2)
12427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        res = _WorkRep( (sign, [0], (op1.exp - op2.exp)) )
12437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if divmod and res.exp > context.prec + 1:
12447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(DivisionImpossible)
12457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = None
12477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while 1:
12487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            while( (len(op2.int) < len(op1.int) and op1.int[0]) or
12497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                   (len(op2.int) == len(op1.int) and op2.int <= op1.int)):
12507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                   #Meaning, while op2.int < op1.int, when normalized.
12517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                res._increment()
12527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1.subtract(op2.int)
12537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if res.exp == 0 and divmod:
12547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if len(res.int) > context.prec and shouldround:
12557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return context._raise_error(DivisionImpossible)
12567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = Decimal(op1)
12577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                frozen = context._ignore_all_flags()
12587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = min(self._exp, other._exp)
12607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = otherside._rescale(exp, context=context,
12617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                              watchexp=0)
12627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._regard_flags(*frozen)
12637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if shouldround:
12647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    otherside = otherside._fix(context=context)
12657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal(res), otherside)
12667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if op1.int == [0]*len(op1.int) and adjust >= 0 and not divmod:
12687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
12697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if (len(res.int) > context.prec) and shouldround:
12707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if divmod:
12717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return context._raise_error(DivisionImpossible)
12727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                shouldround=1
12737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                # Really, the answer is a bit higher, so adding a one to
12747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                # the end will make sure the rounding is right.
12757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if op1.int != [0]*len(op1.int):
12767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    res.int.append(1)
12777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    res.exp -= 1
12787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
12807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            res.exp -= 1
12817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            adjust += 1
12827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            res.int.append(0)
12837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            op1.int.append(0)
12847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            op1.exp -= 1
12857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if res.exp == 0 and divmod and (len(op2.int) > len(op1.int) or
12877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                            (len(op2.int) == len(op1.int) and
12887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                             op2.int > op1.int)):
12897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #Solves an error in precision.  Same as a previous block.
12907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if len(res.int) > context.prec and shouldround:
12927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return context._raise_error(DivisionImpossible)
12937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = Decimal(op1)
12947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                frozen = context._ignore_all_flags()
12957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = min(self._exp, other._exp)
12977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                otherside = otherside._rescale(exp, context=context)
12987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._regard_flags(*frozen)
13007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return (Decimal(res), otherside)
13027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(res)
13047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
13057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._fix(context=context)
13067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
13077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rdiv__(self, other, context=None):
13097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __div__."""
13107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
13117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__div__(self, context=context)
13127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __rtruediv__ = __rdiv__
13137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __divmod__(self, other, context=None):
13157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (self // other, self % other)
13177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, 1, context)
13197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rdivmod__(self, other, context=None):
13217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __divmod__."""
13227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
13237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__divmod__(self, context=context)
13247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mod__(self, other, context=None):
13267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self % other
13287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
13307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
13317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
13327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
13347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
13357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
13367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self and not other:
13387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x % 0')
13397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, 3, context)[1]
13417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rmod__(self, other, context=None):
13437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __mod__."""
13447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
13457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__mod__(self, context=context)
13467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, other, context=None):
13487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Remainder nearest to 0-  abs(remainder-near) <= other/2
13507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
13527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
13537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
13547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(other, context)
13567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
13577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
13587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self and not other:
13597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x % 0')
13607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # If DivisionImpossible causes an error, do not leave Rounded/Inexact
13627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # ignored in the calling function.
13639fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
13647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_flags(Rounded, Inexact)
13657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #keep DivisionImpossible flags
13667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (side, r) = self.__divmod__(other, context=context)
13677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r._isnan():
13697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._regard_flags(*flags)
13707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return r
13717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13729fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
13737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
13747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._sign:
13767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            comparison = other.__div__(Decimal(-2), context=context)
13777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
13787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            comparison = other.__div__(Decimal(2), context=context)
13797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
13817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._regard_flags(*flags)
13827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        s1, s2 = r._sign, comparison._sign
13847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        r._sign, comparison._sign = 0, 0
13857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r < comparison:
13877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            r._sign, comparison._sign = s1, s2
13887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Get flags now
13897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.__divmod__(other, context=context)
13907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return r._fix(context=context)
13917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        r._sign, comparison._sign = s1, s2
13927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
13947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (side, r) = self.__divmod__(other, context=context)
13967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
13977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r._isnan():
13987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return r
13997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        decrease = not side._iseven()
14017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
14027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        side = side.__abs__(context=context)
14037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
14047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        s1, s2 = r._sign, comparison._sign
14067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        r._sign, comparison._sign = 0, 0
14077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if r > comparison or decrease and r == comparison:
14087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            r._sign, comparison._sign = s1, s2
14097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec += 1
14107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(side.__add__(Decimal(1), context=context)._int) >= context.prec:
14117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context.prec -= 1
14127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(DivisionImpossible)[1]
14137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec -= 1
14147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign == other._sign:
14157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                r = r.__sub__(other, context=context)
14167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
14177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                r = r.__add__(other, context=context)
14187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
14197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            r._sign, comparison._sign = s1, s2
14207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return r._fix(context=context)
14227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __floordiv__(self, other, context=None):
14247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """self // other"""
14257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._divide(other, 2, context)[0]
14267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rfloordiv__(self, other, context=None):
14287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __floordiv__."""
14297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
14307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__floordiv__(self, context=context)
14317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __float__(self):
14337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Float representation."""
14347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return float(str(self))
14357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __int__(self):
14377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts self to a int, truncating if necessary."""
14387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isnan():
14397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
14407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidContext)
14417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif self._isinfinity():
14427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            raise OverflowError, "Cannot convert infinity to long"
14437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
14447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
14457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = '-'*self._sign
14467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
14477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            s = sign + ''.join(map(str, self._int)) + '0'*self._exp
14487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return int(s)
14497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        s = sign + ''.join(map(str, self._int))[:self._exp]
14507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(s)
14517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = list(self._int)
14527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp.reverse()
14537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = 0
14547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while tmp:
14557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            val *= 10
14567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            val += tmp.pop()
14577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(((-1) ** self._sign) * val * 10.**int(self._exp))
14587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __long__(self):
14607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts to a long.
14617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Equivalent to long(int(self))
14637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
14647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return long(self.__int__())
14657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _fix(self, prec=None, rounding=None, folddown=None, context=None):
14677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round if it is necessary to keep self within prec precision.
14687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds and fixes the exponent.  Does not raise on a sNaN.
14707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Arguments:
14727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self - Decimal instance
14737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prec - precision to which  to round.  By default, the context decides.
14747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding - Rounding method.  By default, the context decides.
14757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        folddown - Fold down high elements, by default context._clamp
14767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context - context used.
14777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
14787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity() or self._isnan():
14797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
14807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
14817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
14827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec is None:
14837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = context.prec
14847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(self)
14857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = ans._fixexponents(prec, rounding, folddown=folddown,
14867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                               context=context)
14877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(ans._int) > prec:
14887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._round(prec, rounding, context=context)
14897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = ans._fixexponents(prec, rounding, folddown=folddown,
14907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                               context=context)
14917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
14927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _fixexponents(self, prec=None, rounding=None, folddown=None,
14947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                     context=None):
14957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Fix the exponents and return a copy with the exponent in bounds."""
14967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
14977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
14987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
14997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
15007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec is None:
15017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = context.prec
15027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if folddown is None:
15037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            folddown = context._clamp
15047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Emin, Emax = context.Emin, context.Emax
15057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Etop = context.Etop()
15067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(self)
15077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans.adjusted() < Emin:
15087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            Etiny = context.Etiny()
15097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if ans._exp < Etiny:
15107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if not ans:
15117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    ans._exp = Etiny
15127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Clamped)
15137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return ans
15147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans._rescale(Etiny, context=context)
15157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #It isn't zero, and exp < Emin => subnormal
15167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._raise_error(Subnormal)
15177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if context.flags[Inexact]:
15187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Underflow)
15197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
15207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if ans:
15217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    #Only raise subnormal if non-zero.
15227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    context._raise_error(Subnormal)
15237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif folddown and ans._exp > Etop:
15247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Clamped)
15257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._rescale(Etop, context=context)
15267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif ans.adjusted() > Emax:
15277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if not ans:
15287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans._exp = Emax
15297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                context._raise_error(Clamped)
15307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return ans
15317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Inexact)
15327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
15337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(Overflow, 'above Emax', ans._sign)
15347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
15357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round(self, prec=None, rounding=None, context=None):
15377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a rounded version of self.
15387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        You can specify the precision or rounding method.  Otherwise, the
15407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context determines it.
15417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
15427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
15447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
15457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
15467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
15477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
15487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
15507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(self)
15517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if rounding is None:
15537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            rounding = context.rounding
15547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec is None:
15557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = context.prec
15567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
15587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if prec <= 0:
15597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                dig = (0,)
15607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = len(self._int) - prec + self._exp
15617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
15627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                dig = (0,) * prec
15637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                exp = len(self._int) + self._exp - prec
15647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal((self._sign, dig, exp))
15657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
15667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
15677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec == 0:
15697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp = Decimal(self)
15707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp._int = (0,)+temp._int
15717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = 1
15727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif prec < 0:
15737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = self._exp + len(self._int) - prec - 1
15747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp = Decimal( (self._sign, (0, 1), exp))
15757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            prec = 1
15767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
15777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            temp = Decimal(self)
15787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = len(temp._int)
15807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec == numdigits:
15817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return temp
15827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # See if we need to extend precision
15847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        expdiff = prec - numdigits
15857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if expdiff > 0:
15867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = list(temp._int)
15877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp.extend([0] * expdiff)
15887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans =  Decimal( (temp._sign, tmp, temp._exp - expdiff))
15897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
15907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #OK, but maybe all the lost digits are 0.
15927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        lostdigits = self._int[expdiff:]
15937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if lostdigits == (0,) * len(lostdigits):
15947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal( (temp._sign, temp._int[:prec], temp._exp - expdiff))
15957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Rounded, but not Inexact
15967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
15977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
15987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Okay, let's round and lose data
16007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        this_function = getattr(temp, self._pick_rounding_function[rounding])
16027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Now we've got the rounding function
16037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prec != context.prec:
16059fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context._shallow_copy()
16067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec = prec
16077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = this_function(prec, expdiff, context)
16087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._raise_error(Rounded)
16097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._raise_error(Inexact, 'Changed in rounding')
16107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
16127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    _pick_rounding_function = {}
16147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_down(self, prec, expdiff, context):
16167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Also known as round-towards-0, truncate."""
16177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
16187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_half_up(self, prec, expdiff, context, tmp = None):
16207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds 5 up (away from 0)"""
16217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tmp is None:
16237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = Decimal( (self._sign,self._int[:prec], self._exp - expdiff))
16247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._int[prec] >= 5:
16257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = tmp._increment(round=0, context=context)
16267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if len(tmp._int) > prec:
16277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
16287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return tmp
16297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_half_even(self, prec, expdiff, context):
16317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round 5 to even, rest to nearest."""
16327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
16347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        half = (self._int[prec] == 5)
16357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
16367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for digit in self._int[prec+1:]:
16377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if digit != 0:
16387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    half = 0
16397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    break
16407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
164161992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            if self._int[prec-1] & 1 == 0:
16427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return tmp
16437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._round_half_up(prec, expdiff, context, tmp)
16447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_half_down(self, prec, expdiff, context):
16467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round 5 down"""
16477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
16497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        half = (self._int[prec] == 5)
16507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
16517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            for digit in self._int[prec+1:]:
16527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if digit != 0:
16537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    half = 0
16547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    break
16557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if half:
16567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return tmp
16577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._round_half_up(prec, expdiff, context, tmp)
16587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_up(self, prec, expdiff, context):
16607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds away from 0."""
16617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
16627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for digit in self._int[prec:]:
16637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if digit != 0:
16647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                tmp = tmp._increment(round=1, context=context)
16657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                if len(tmp._int) > prec:
16667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
16677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                else:
16687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    return tmp
16697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return tmp
16707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_ceiling(self, prec, expdiff, context):
16727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds up (not away from 0 if negative.)"""
16737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
16747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._round_down(prec, expdiff, context)
16757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
16767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._round_up(prec, expdiff, context)
16777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _round_floor(self, prec, expdiff, context):
16797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds down (not towards 0 if negative)"""
16807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self._sign:
16817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._round_down(prec, expdiff, context)
16827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
16837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._round_up(prec, expdiff, context)
16847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __pow__(self, n, modulo = None, context=None):
16867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self ** n (mod modulo)
16877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If modulo is None (default), don't take it mod modulo.
16897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
16907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
16917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
16927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        n = self._convert_other(n)
16937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Because the spot << doesn't work with really big exponents
16957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if n._isinfinity() or n.adjusted() > 8:
16967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x ** INF')
16977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(n, context)
16997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
17007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
17017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not n._isinfinity() and not n._isinteger():
17037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'x ** (non-integer)')
17047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not n:
17067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, '0 ** 0')
17077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not n:
17097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(1)
17107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self == Decimal(1):
17127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(1)
17137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = self._sign and not n._iseven()
17157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        n = int(n)
17167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
17187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if modulo:
17197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, 'INF % x')
17207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if n > 0:
17217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
17227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (sign, (0,), 0) )
17237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #with ludicrously large exponent, just raise an overflow and return inf.
17257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not modulo and n > 0 and (self._exp + len(self._int) - 1) * n > context.Emax \
17267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger           and self:
17277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp = Decimal('inf')
17297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._sign = sign
17307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
17317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Inexact)
17327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Overflow, 'Big power', sign)
17337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return tmp
17347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elength = len(str(abs(n)))
17367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        firstprec = context.prec
17377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
173899148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        if not modulo and firstprec + elength + 1 > DefaultContext.Emax:
17397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(Overflow, 'Too much precision.', sign)
17407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        mul = Decimal(self)
17427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = Decimal(1)
17439fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
17447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec + elength + 1
17457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context.rounding
17467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if n < 0:
17477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #n is a long now, not Decimal instance
17487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            n = -n
17497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            mul = Decimal(1).__div__(mul, context=context)
17507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        shouldround = context._rounding_decision == ALWAYS_ROUND
17527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        spot = 1
17547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while spot <= n:
17557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            spot <<= 1
17567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        spot >>= 1
17587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Spot is the highest power of 2 less than n
17597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while spot:
17607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            val = val.__mul__(val, context=context)
17617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if val._isinfinity():
17627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                val = Infsign[sign]
17637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
17647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if spot & n:
17657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                val = val.__mul__(mul, context=context)
17667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if modulo is not None:
17677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                val = val.__mod__(modulo, context=context)
17687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            spot >>= 1
17697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec
17707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if shouldround:
17727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return val._fix(context=context)
17737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return val
17747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rpow__(self, other, context=None):
17767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __pow__."""
17777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
17787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__pow__(self, context=context)
17797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def normalize(self, context=None):
17817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
17827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
17837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
17847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
17867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
17877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
17887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        dup = self._fix(context=context)
17907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if dup._isinfinity():
17917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return dup
17927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
17937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not dup:
17947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal( (dup._sign, (0,), 0) )
17957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        end = len(dup._int)
17967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = dup._exp
17977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while dup._int[end-1] == 0:
17987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp += 1
17997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            end -= 1
18007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Decimal( (dup._sign, dup._int[:end], exp) )
18017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def quantize(self, exp, rounding = None, context=None, watchexp = 1):
18047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Quantize self so its exponent is the same as that of exp.
18057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Similar to self._rescale(exp._exp) but with error checking.
18077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
18087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
18097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
18107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(exp, context)
18127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
18137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
18147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if exp._isinfinity() or self._isinfinity():
18167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if exp._isinfinity() and self._isinfinity():
18177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return self  #if both are inf, it is OK
18187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation,
18197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                       'quantize with one INF')
18207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._rescale(exp._exp, rounding, context, watchexp)
18217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, other):
18237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Test whether self and other have the same exponent.
18247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        same as self._exp == other._exp, except NaN == sNaN
18267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
18277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isnan() or other._isnan():
18287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._isnan() and other._isnan() and True
18297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity() or other._isinfinity():
18307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._isinfinity() and other._isinfinity() and True
18317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._exp == other._exp
18327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _rescale(self, exp, rounding = None, context=None, watchexp = 1):
18347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rescales so that the exponent is exp.
18357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = exp to scale to (an integer)
18377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = rounding version
18387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        watchexp: if set (default) an error is returned if exp is greater
18397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        than Emax or less than Etiny.
18407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
18417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
18427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
18437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
18457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'rescale with an INF')
18467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
18487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
18497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
18507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        out = 0
18527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if watchexp and (context.Emax  < exp or context.Etiny() > exp):
18547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'rescale(a, INF)')
18557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
18577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal(self)
18587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._int = (0,)
18597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._exp = exp
18607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
18617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        diff = self._exp - exp
18637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        digits = len(self._int)+diff
18647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if watchexp and digits > context.prec:
18667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'Rescale > prec')
18677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(self)
18697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._int = (0,)+tmp._int
18707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        digits += 1
18717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prevexact = context.flags[Inexact]
18737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if digits < 0:
18747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._exp = -digits + tmp._exp
18757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._int = (0,1)
18767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            digits = 1
18777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = tmp._round(digits, rounding, context=context)
18787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tmp._int[0] == 0 and len(tmp._int) > 1:
18807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._int = tmp._int[1:]
18817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp._exp = exp
18827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if tmp and tmp.adjusted() < context.Emin:
18847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Subnormal)
18857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        elif tmp and tmp.adjusted() > context.Emax:
18867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'rescale(a, INF)')
18877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return tmp
18887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
18897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_integral(self, rounding = None, context=None):
18907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds to the nearest integer, without raising inexact, rounded."""
18917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
18927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
18937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
18947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
18957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
18967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
18977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
18987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_flags(Rounded, Inexact)
18997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._rescale(0, rounding, context=context)
19007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._regard_flags(flags)
19017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
19027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def sqrt(self, context=None):
19047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the square root of self.
19057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Uses a converging algorithm (Xn+1 = 0.5*(Xn + self / Xn))
19077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Should quadratically approach the right answer.
19087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
19097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
19107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
19117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self._check_nans(context=context)
19137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if ans:
19147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
19157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
19177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #exponent = self._exp / 2, using round_down.
19187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #if self._exp < 0:
19197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #    exp = (self._exp+1) // 2
19207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #else:
19217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = (self._exp) // 2
19227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign == 1:
19237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                #sqrt(-0) = -0
19247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (1, (0,), exp))
19257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
19267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Decimal( (0, (0,), exp))
19277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign == 1:
19297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
19307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._isinfinity():
19327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Decimal(self)
19337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = Decimal(self)
19357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        expadd = tmp._exp / 2
193761992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger        if tmp._exp & 1:
19387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._int += (0,)
19397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._exp = 0
19407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
19417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            tmp._exp = 0
19427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19439fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
19447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        flags = context._ignore_all_flags()
19457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        firstprec = context.prec
19467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = 3
194761992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger        if tmp.adjusted() & 1 == 0:
19487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal( (0, (8,1,9), tmp.adjusted()  - 2) )
19497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans.__add__(tmp.__mul__(Decimal((0, (2,5,9), -2)),
19507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                          context=context), context=context)
19517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._exp -= 1 + tmp.adjusted()/2
19527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
19537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = Decimal( (0, (2,5,9), tmp._exp + len(tmp._int)- 3) )
19547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans.__add__(tmp.__mul__(Decimal((0, (8,1,9), -3)),
19557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                          context=context), context=context)
19567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._exp -= 1 + tmp.adjusted()/2
19577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #ans is now a linear approximation.
19597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Emax, Emin = context.Emax, context.Emin
196199148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        context.Emax, context.Emin = DefaultContext.Emax, DefaultContext.Emin
19627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        half = Decimal('0.5')
19647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        count = 1
19667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        maxp = firstprec + 2
19677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_HALF_EVEN)
19687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while 1:
19697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec = min(2*context.prec - 2, maxp)
19707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = half.__mul__(ans.__add__(tmp.__div__(ans, context=context),
19717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                                           context=context), context=context)
19727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.prec == maxp:
19737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
19747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #round to the answer's precision-- the only error can be 1 ulp.
19767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec
19777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prevexp = ans.adjusted()
19787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = ans._round(context=context)
19797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #Now, check if the other last digits are better.
19817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec + 1
19827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # In case we rounded up another digit and we should actually go lower.
19837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if prevexp != ans.adjusted():
19847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._int += (0,)
19857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans._exp -= 1
19867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        lower = ans.__sub__(Decimal((0, (5,), ans._exp-1)), context=context)
19897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding(ROUND_UP)
19907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if lower.__mul__(lower, context=context) > (tmp):
19917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans.__sub__(Decimal((0, (1,), ans._exp)), context=context)
19927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
19947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            upper = ans.__add__(Decimal((0, (5,), ans._exp-1)),context=context)
19957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._set_rounding(ROUND_DOWN)
19967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if upper.__mul__(upper, context=context) < tmp:
19977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                ans = ans.__add__(Decimal((0, (1,), ans._exp)),context=context)
19987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
19997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans._exp += expadd
20007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.prec = firstprec
20027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.rounding = rounding
20037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = ans._fix(context=context)
20047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
20067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not ans.__mul__(ans, context=context) == self:
20077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # Only rounded/inexact if here.
20087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._regard_flags(flags)
20097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
20107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Inexact)
20117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
20127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Exact answer, so let's set the exponent right.
20137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #if self._exp < 0:
20147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #    exp = (self._exp +1)// 2
20157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #else:
20167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp = self._exp // 2
20177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec += ans._exp - exp
20187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = ans._rescale(exp, context=context)
20197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context.prec = firstprec
20207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._regard_flags(flags)
20217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context.Emax, context.Emin = Emax, Emin
20227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans._fix(context=context)
20247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, other, context=None):
20267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the larger value.
20277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        like max(self, other) except if one is not a number, returns
20297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
20307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
20317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
20327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
20337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
20347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2035d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        # if one operand is a quiet NaN and the other is number, then the
2036d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        # number is always returned
2037d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        sn = self._isnan()
2038d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        on = other._isnan()
2039d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if sn or on:
2040d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if on == 1 and sn != 2:
2041d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                return self
2042d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if sn == 1 and on != 2:
2043d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                return other
2044d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            return self._check_nans(other, context)
20457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self
2047d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        c = self.__cmp__(other)
2048d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
2049d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if both operands are finite and equal in numerical value
2050d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # then an ordering is applied:
2051d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2052d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs differ then max returns the operand with the
2053d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # positive sign and min returns the operand with the negative sign
2054d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2055d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs are the same then the exponent is used to select
2056d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # the result.
2057d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if self._sign != other._sign:
2058d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                if self._sign:
2059d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                    ans = other
2060d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp < other._exp and not self._sign:
2061d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2062d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp > other._exp and self._sign:
2063d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2064d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        elif c == -1:
20657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2066d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        context._rounding_decision == ALWAYS_ROUND
2067d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        return ans._fix(context=context)
20687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, other, context=None):
20707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the smaller value.
20717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        like min(self, other) except if one is not a number, returns
20737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
20747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
20757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
20767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
20777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = self._convert_other(other)
20787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2079d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        # if one operand is a quiet NaN and the other is number, then the
2080d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        # number is always returned
2081d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        sn = self._isnan()
2082d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        on = other._isnan()
2083d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if sn or on:
2084d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if on == 1 and sn != 2:
2085d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                return self
2086d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if sn == 1 and on != 2:
2087d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                return other
2088d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            return self._check_nans(other, context)
20897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
20907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = self
2091d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        c = self.__cmp__(other)
2092d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
2093d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if both operands are finite and equal in numerical value
2094d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # then an ordering is applied:
2095d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2096d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs differ then max returns the operand with the
2097d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # positive sign and min returns the operand with the negative sign
2098d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
2099d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # if the signs are the same then the exponent is used to select
2100d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # the result.
2101d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            if self._sign != other._sign:
2102d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                if other._sign:
2103d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                    ans = other
2104d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp > other._exp and not self._sign:
2105d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2106d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            elif self._exp < other._exp and self._sign:
2107d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger                ans = other
2108d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        elif c == 1:
21097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2110d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        context._rounding_decision == ALWAYS_ROUND
2111d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        return ans._fix(context=context)
21127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinteger(self):
21147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether self is an integer"""
21157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
21167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return True
21177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rest = self._int[self._exp:]
21187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rest == (0,)*len(rest)
21197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _iseven(self):
21217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns 1 if self is even.  Assumes self is an integer."""
21227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp > 0:
21237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
212461992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger        return self._int[-1+self._exp] & 1 == 0
21257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def adjusted(self):
21277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the adjusted exponent of self"""
21287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        try:
21297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._exp + len(self._int) - 1
21307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #If NaN or Infinity, self._exp is string
21317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        except TypeError:
21327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
21337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # support for pickling, copy, and deepcopy
21357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __reduce__(self):
21367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (self.__class__, (str(self),))
21377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __copy__(self):
21397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
21407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self     # I'm immutable; therefore I am my own clone
21417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
21427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __deepcopy__(self, memo):
21447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
21457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self     # My components are also immutable
21467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
21477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2148d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger##### Context class ###########################################
2149d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger
21507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# get rounding method function:
21527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerrounding_functions = [name for name in Decimal.__dict__.keys() if name.startswith('_round_')]
21537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerfor name in rounding_functions:
21547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
21557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    globalname = name[1:].upper()
21567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    val = globals()[globalname]
21577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Decimal._pick_rounding_function[val] = name
21587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettingerdel name, val, globalname, rounding_functions
21607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Context(object):
21627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Contains the context for a Decimal instance.
21637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
21647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Contains:
21657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    prec - precision (for use in rounding, division, square roots..)
21667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    rounding - rounding type. (how you round)
21677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round?
2168bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger    traps - If traps[exception] = 1, then the exception is
21697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    raised when it is caused.  Otherwise, a value is
21707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    substituted in.
21717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    flags  - When an exception is caused, flags[exception] is incremented.
21727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             (Whether or not the trap_enabler is set)
21737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             Should be reset by user of Decimal instance.
21740ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emin -   Minimum exponent
21750ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emax -   Maximum exponent
21767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    capitals -      If 1, 1*10^1 is printed as 1E+1.
21777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    If 0, printed as 1e1
2178e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger    _clamp - If 1, change exponents if too high (Default 0)
21797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
21809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger
21817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, prec=None, rounding=None,
2182bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger                 traps=None, flags=[],
21837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                 _rounding_decision=None,
21840ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                 Emin=None, Emax=None,
2185e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger                 capitals=None, _clamp=0,
21867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                 _ignored_flags=[]):
2187bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not isinstance(flags, dict):
2188fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger            flags = dict([(s,s in flags) for s in _signals])
2189b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
2190bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if traps is not None and not isinstance(traps, dict):
2191fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger            traps = dict([(s,s in traps) for s in _signals])
2192b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
21937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for name, val in locals().items():
21947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if val is None:
21957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                setattr(self, name, copy.copy(getattr(DefaultContext, name)))
21967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
21977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                setattr(self, name, val)
21987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        del self.self
21997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2200b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger    def __repr__(self):
2201bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        """Show the current context."""
2202b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        s = []
2203bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' % vars(self))
2204bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        s.append('flags=[' + ', '.join([f.__name__ for f, v in self.flags.items() if v]) + ']')
2205bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        s.append('traps=[' + ', '.join([t.__name__ for t, v in self.traps.items() if v]) + ']')
2206b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        return ', '.join(s) + ')'
2207b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger
2208d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger    def clear_flags(self):
2209d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        """Reset all flags to zero"""
2210d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        for flag in self.flags:
2211b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger            self.flags[flag] = 0
2212d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger
22139fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def _shallow_copy(self):
22149fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a shallow copy from self."""
2215bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        nc = Context(self.prec, self.rounding, self.traps, self.flags,
22167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                         self._rounding_decision, self.Emin, self.Emax,
22177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                         self.capitals, self._clamp, self._ignored_flags)
22187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return nc
22199fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger
22209fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def copy(self):
22219fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a deep copy from self."""
22229fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        nc = Context(self.prec, self.rounding, self.traps.copy(), self.flags.copy(),
22239fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger                         self._rounding_decision, self.Emin, self.Emax,
22249fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger                         self.capitals, self._clamp, self._ignored_flags)
22259fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        return nc
22269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    __copy__ = copy
22277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22285aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    def _raise_error(self, condition, explanation = None, *args):
22297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Handles an error
22307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the flag is in _ignored_flags, returns the default response.
22327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, it increments the flag, then, if the corresponding
22337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        trap_enabler is set, it reaises the exception.  Otherwise, it returns
22347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the default value after incrementing the flag.
22357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
22365aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        error = _condition_map.get(condition, condition)
22377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if error in self._ignored_flags:
22387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #Don't touch the flag
22397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return error().handle(self, *args)
22407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.flags[error] += 1
2242bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not self.traps[error]:
22437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            #The errors define how to handle themselves.
22445aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger            return condition().handle(self, *args)
22457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Errors should only be risked on copies of the context
22477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        #self._ignored_flags = []
22487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        raise error, explanation
22497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_all_flags(self):
22517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore all flags, if they are raised"""
2252fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger        return self._ignore_flags(*_signals)
22537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_flags(self, *flags):
22557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore the flags, if they are raised"""
22567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Do not mutate-- This way, copies of a context leave the original
22577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # alone.
22587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self._ignored_flags = (self._ignored_flags + list(flags))
22597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return list(flags)
22607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _regard_flags(self, *flags):
22627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Stop ignoring the flags, if they are raised"""
22637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if flags and isinstance(flags[0], (tuple,list)):
22647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            flags = flags[0]
22657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for flag in flags:
22667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._ignored_flags.remove(flag)
22677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22685aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    def __hash__(self):
22695aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        """A Context cannot be hashed."""
22705aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        # We inherit object.__hash__, so we must deny this explicitly
22715aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        raise TypeError, "Cannot hash a Context."
22725aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger
22737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etiny(self):
22747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns Etiny (= Emin - prec + 1)"""
22757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emin - self.prec + 1)
22767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etop(self):
2278e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """Returns maximum exponent (= Emax - prec + 1)"""
22797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emax - self.prec + 1)
22807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _set_rounding_decision(self, type):
22827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Sets the rounding decision.
22837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Sets the rounding decision, and returns the current (previous)
22857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding decision.  Often used like:
22867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22879fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        context = context._shallow_copy()
22887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # That so you don't change the calling context
22897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # if an error occurs in the middle (say DivisionImpossible is raised).
22907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding_decision(NEVER_ROUND)
22927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        instance = instance / Decimal(2)
22937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding_decision(rounding)
22947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This will make it not round for that operation.
22967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
22977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = self._rounding_decision
22997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self._rounding_decision = type
23007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rounding
23017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _set_rounding(self, type):
23037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Sets the rounding type.
23047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Sets the rounding type, and returns the current (previous)
23067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding type.  Often used like:
23077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context = context.copy()
23097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # so you don't change the calling context
23107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # if an error occurs in the middle.
23117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_UP)
23127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = self.__sub__(other, context=context)
23137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding(rounding)
23147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This will make it round up for that operation.
23167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = self.rounding
23187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.rounding= type
23197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rounding
23207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2321fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger    def create_decimal(self, num='0'):
23227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Creates a new Decimal instance but using self as context."""
23237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        d = Decimal(num, context=self)
23247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return d._fix(context=self)
23257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #Methods
23277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def abs(self, a):
23287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of the operand.
23297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the operand is negative, the result is the same as using the minus
23317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation on the operand. Otherwise, the result is the same as using
23327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the plus operation on the operand.
23337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23349ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('2.1'))
23357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.1")
23369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-100'))
23377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("100")
23389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('101.5'))
23397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("101.5")
23409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-101.5'))
23417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("101.5")
23427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__abs__(context=self)
23447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def add(self, a, b):
23467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the sum of the two operands.
23477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
23497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("19.00")
23509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
23517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.02E+4")
23527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__add__(b, context=self)
23547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _apply(self, a):
23567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return str(a._fix(context=self))
23577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, a, b):
23597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares values numerically.
23607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the signs of the operands differ, a value representing each operand
23627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ('-1' if the operand is less than zero, '0' if the operand is zero or
23637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negative zero, or '1' if the operand is greater than zero) is used in
23647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        place of that operand for the comparison instead of the actual
23657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operand.
23667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The comparison is then effected by subtracting the second operand from
23687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the first and then returning a value according to the result of the
23697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        subtraction: '-1' if the result is less than zero, '0' if the result is
23707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        zero or negative zero, or '1' if the result is greater than zero.
23717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
23737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
23749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
23757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
23769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
23777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
23789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
23797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
23809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
23817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
23829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
23837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
23847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.compare(b, context=self)
23867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide(self, a, b):
23887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Decimal division in a specified context.
23897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
23917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.333333333")
23929ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
23937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.666666667")
23949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
23957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.5")
23969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
23977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.1")
23989ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
23997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
24009ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
24017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("4.00")
24029ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
24037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.20")
24049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
24057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("10")
24069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
24077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1000")
24089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
24097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.20E+6")
24107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__div__(b, context=self)
24127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide_int(self, a, b):
24147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Divides two numbers and returns the integer part of the result.
24157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24169ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
24177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
24189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
24197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
24217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__floordiv__(b, context=self)
24247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divmod(self, a, b):
24267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__divmod__(b, context=self)
24277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, a,b):
24297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """max compares two values numerically and returns the maximum.
24307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
24327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, the operands are compared as as though by the compare
24337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation. If they are numerically equal then the left-hand operand
24347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        is chosen as the result. Otherwise the maximum (closer to positive
24357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
24367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24379ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
24387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24399ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
24407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3")
24419ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
2442d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        Decimal("1")
2443d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
2444d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        Decimal("7")
24457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.max(b, context=self)
24477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, a,b):
24497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """min compares two values numerically and returns the minimum.
24507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
24527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, the operands are compared as as though by the compare
24537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation. If they are numerically equal then the left-hand operand
24547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        is chosen as the result. Otherwise the minimum (closer to negative
24557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
24567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
24587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2")
24599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
24607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-10")
24619ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
24627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
2463d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
2464d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        Decimal("7")
24657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.min(b, context=self)
24677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def minus(self, a):
24697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Minus corresponds to unary prefix minus in Python.
24707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as subtract; the
24727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation minus(a) is calculated as subtract('0', a) where the '0'
24737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
24747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('1.3'))
24767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1.3")
24779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('-1.3'))
24787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.3")
24797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
24807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__neg__(context=self)
24817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def multiply(self, a, b):
24837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """multiply multiplies two operands.
24847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a special value then the general rules apply.
24867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Otherwise, the operands are multiplied together ('long multiplication'),
24877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resulting in a number which may be as long as the sum of the lengths
24887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        of the two operands.
24897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
24917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.60")
24929ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
24937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("21")
24949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
24957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.72")
24969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
24977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.0")
24989ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
24997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("4.28135971E+11")
25007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mul__(b, context=self)
25027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def normalize(self, a):
2504e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """normalize reduces an operand to its simplest form.
25057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Essentially a plus operation with all trailing zeros removed from the
25077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.
25087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('2.1'))
25107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.1")
25119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-2.0'))
25127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-2")
25139ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('1.200'))
25147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.2")
25159ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-120'))
25167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1.2E+2")
25179ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('120.00'))
25187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.2E+2")
25199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('0.00'))
25207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
25217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.normalize(context=self)
25237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def plus(self, a):
25257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Plus corresponds to unary prefix plus in Python.
25267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as add; the
25287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation plus(a) is calculated as add('0', a) where the '0'
25297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
25307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25319ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('1.3'))
25327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.3")
25339ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('-1.3'))
25347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1.3")
25357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pos__(context=self)
25377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def power(self, a, b, modulo=None):
25397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Raises a to the power of b, to modulo if given.
25407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The right-hand operand must be a whole number whose integer part (after
25427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        any exponent has been applied) has no more than 9 digits and whose
25437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        fractional part (if any) is all zeros before any rounding. The operand
25447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        may be positive, negative, or zero; if negative, the absolute value of
25457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the power is used, and the left-hand operand is inverted (divided into
25467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1) before use.
25477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the increased precision needed for the intermediate calculations
25497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exceeds the capabilities of the implementation then an Invalid operation
25507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        condition is raised.
25517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If, when raising to a negative power, an underflow occurs during the
25537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        division into 1, the operation is not halted at that point but
25547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        continues.
25557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('2'), Decimal('3'))
25577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("8")
25589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('2'), Decimal('-3'))
25597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.125")
25609ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('1.7'), Decimal('8'))
25617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("69.7575744")
25629ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-2'))
25637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
25649ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-1'))
25657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
25669ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('0'))
25677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
25689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('1'))
25697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("Infinity")
25709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('2'))
25717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("Infinity")
25729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-2'))
25737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
25749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-1'))
25757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0")
25769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('0'))
25777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
25789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('1'))
25797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-Infinity")
25809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('2'))
25817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("Infinity")
25829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.power(Decimal('0'), Decimal('0'))
25837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
25847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
25857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pow__(b, modulo, context=self)
25867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def quantize(self, a, b):
25887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a value equal to 'a' (rounded) and having the exponent of 'b'.
25897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The coefficient of the result is derived from that of the left-hand
25917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operand. It may be rounded using the current rounding setting (if the
25927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exponent is being increased), multiplied by a positive power of ten (if
25937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the exponent is being decreased), or is unchanged (if the exponent is
25947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        already equal to that of the right-hand operand).
25957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Unlike other operations, if the length of the coefficient after the
25977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        quantize operation would be greater than precision then an Invalid
25987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation condition is raised. This guarantees that, unless there is an
25997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        error condition, the exponent of the result of a quantize is always
26007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        equal to that of the right-hand operand.
26017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Also unlike other operations, quantize will never raise Underflow, even
26037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if the result is subnormal and inexact.
26047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
26067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.170")
26079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
26087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.17")
26099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
26107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.2")
26119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
26127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2")
26139ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
26147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0E+1")
26159ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
26167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-Infinity")
26179ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
26187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
26199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
26207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0")
26219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
26227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0E+5")
26239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
26247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
26259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
26267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("NaN")
26279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
26287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("217.0")
26299ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
26307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("217")
26319ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
26327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.2E+2")
26339ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
26347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2E+2")
26357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
26367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.quantize(b, context=self)
26377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder(self, a, b):
26397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the remainder from integer division.
26407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is the residue of the dividend after the operation of
26427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        calculating integer division as described for divide-integer, rounded to
26437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        precision digits if necessary. The sign of the result, if non-zero, is
26447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the same as that of the original dividend.
26457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
26477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
26487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
26497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
26517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.1")
26529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
26537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
26549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
26557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
26569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
26577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.2")
26589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
26597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.1")
26609ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
26617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
26627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
26637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mod__(b, context=self)
26647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, a, b):
26667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns to be "a - b * n", where n is the integer nearest the exact
26677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        value of "x / b" (if two integers are equally near then the even one
26687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        is chosen). If the result is equal to 0 then its sign will be the
26697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign of a.
26707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
26727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
26737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
26747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
26767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.9")
26779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
26787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-2")
26799ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
26807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
26819ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
26827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-1")
26839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
26847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.2")
26859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
26867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.1")
26879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
26887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.3")
26897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
26907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.remainder_near(b, context=self)
26917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, a, b):
26937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns True if the two operands have the same exponent.
26947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is never affected by either the sign or the coefficient of
26967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        either operand.
26977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26989ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
26997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
27009ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
27017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
27029ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
27037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
27049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
27057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
27067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.same_quantum(b)
27087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def sqrt(self, a):
27107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the square root of a non-negative number to context precision.
27117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the result must be inexact, it is rounded using the round-half-even
27137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        algorithm.
27147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27159ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0'))
27167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0")
27179ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('-0'))
27187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0")
27199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0.39'))
27207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.624499800")
27219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('100'))
27227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("10")
27239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1'))
27247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1")
27259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.0'))
27267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
27279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.00'))
27287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0")
27299ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('7'))
27307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2.64575131")
27319ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('10'))
27327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("3.16227766")
27339ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.prec
27346ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        9
27357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.sqrt(context=self)
27377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def subtract(self, a, b):
27397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the sum of the two operands.
27407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27419ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
27427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.23")
27439ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
27447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("0.00")
27459ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
27467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-0.77")
27477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__sub__(b, context=self)
27497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, a):
27517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
27527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
27547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.to_eng_string(context=self)
27567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_sci_string(self, a):
27587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
27597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
27617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__str__(context=self)
27637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_integral(self, a):
27657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds to an integer.
27667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        When the operand has a negative exponent, the result is the same
27687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        as using the quantize() operation using the given operand as the
27697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
27707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        of the operand as the precision setting, except that no flags will
27717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        be set. The rounding mode is taken from the context.
27727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27739ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('2.1'))
27747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("2")
27759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('100'))
27767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("100")
27779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('100.0'))
27787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("100")
27799ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('101.5'))
27807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("102")
27819ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('-101.5'))
27827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-102")
27839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('10E+5'))
27847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("1.0E+6")
27859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('7.89E+77'))
27867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("7.89E+77")
27879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.to_integral(Decimal('-Inf'))
27887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Decimal("-Infinity")
27897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
27907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.to_integral(context=self)
27917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass _WorkRep(object):
27937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __slots__ = ('sign','int','exp')
27947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # sign: -1 None 1
27957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # int:  list
27967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # exp:  None, int, or string
27977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
27987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, value=None):
27997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if value is None:
28007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = None
28017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int = []
28027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = None
28037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, Decimal):
28047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if value._sign:
28057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self.sign = -1
28067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
28077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self.sign = 1
28087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int = list(value._int)
28097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value._exp
28107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, tuple):
28117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = value[0]
28127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int = value[1]
28137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value[2]
28147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
28167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
28177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __str__ = __repr__
28197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __neg__(self):
28217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.sign == 1:
28227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return _WorkRep( (-1, self.int, self.exp) )
28237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
28247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return _WorkRep( (1, self.int, self.exp) )
28257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __abs__(self):
28277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.sign == -1:
28287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -self
28297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
28307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self
28317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __cmp__(self, other):
28337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.exp != other.exp:
28347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            raise ValueError("Operands not normalized: %r, %r" % (self, other))
28357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.sign != other.sign:
28367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self.sign == -1:
28377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return -1
28387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
28397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return 1
28407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self.sign == -1:
28417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            direction = -1
28427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
28437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            direction = 1
28447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        int1 = self.int
28457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        int2 = other.int
28467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(int1) > len(int2):
28477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return direction * 1
28487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(int1) < len(int2):
28497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return direction * -1
28507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for i in xrange(len(int1)):
28517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if int1[i] > int2[i]:
28527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return direction * 1
28537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if int1[i] < int2[i]:
28547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return direction * -1
28557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
28567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _increment(self):
28587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        curspot = len(self.int) - 1
28597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.int[curspot]+= 1
28607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while (self.int[curspot] >= 10):
28617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int[curspot] -= 10
28627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if curspot == 0:
28637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                self.int[0:0] = [1]
28647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
28657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int[curspot-1] += 1
28667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            curspot -= 1
28677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def subtract(self, alist):
28697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Subtract a list from the current int (in place).
28707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        It is assured that (len(list) = len(self.int) and list < self.int) or
28727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        len(list) = len(self.int)-1
28737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (i.e. that int(join(list)) < int(join(self.int)))
28747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
28757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        selfint = self.int
28777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        selfint.reverse()
28787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        alist.reverse()
28797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
28807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        carry = 0
28817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for x in xrange(len(alist)):
28827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            selfint[x] -= alist[x] + carry
28837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if selfint[x] < 0:
28847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                carry = 1
28857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                selfint[x] += 10
28867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
28874e0e1b6a540e664e89739456db4c706701bf062bTim Peters                carry = 0
28887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if carry:
28897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            selfint[x+1] -= 1
28907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        last = len(selfint)-1
28917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        while len(selfint) > 1 and selfint[last] == 0:
28927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            last -= 1
28937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if last == 0:
28947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
28957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        selfint[last+1:]=[]
28967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        selfint.reverse()
28977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        alist.reverse()
28987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return
28997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _normalize(op1, op2, shouldround = 0, prec = 0):
29027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Normalizes op1, op2 to have the same exp and length of coefficient.
29037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Done during addition.
29057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
29067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Yes, the exponent is a long, but the difference between exponents
29077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # must be an int-- otherwise you'd get a big memory problem.
29087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    numdigits = int(op1.exp - op2.exp)
29097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if numdigits < 0:
29107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = -numdigits
29117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op2
29127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op1
29137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
29147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op1
29157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op2
29167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if shouldround and numdigits > len(other.int) + prec + 1 -len(tmp.int):
29187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # If the difference in adjusted exps is > prec+1, we know
29197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # other is insignificant, so might as well put a 1 after the precision.
29207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # (since this is only for addition.)  Also stops MemoryErrors.
29217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        extend = prec + 2 -len(tmp.int)
29237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if extend <= 0:
29247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            extend = 1
29257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp.int.extend([0]*extend)
29267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp.exp -= extend
29277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other.int[:] = [0]*(len(tmp.int)-1)+[1]
29287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other.exp = tmp.exp
29297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return op1, op2
29307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    tmp.int.extend([0] * numdigits)
29327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    tmp.exp = tmp.exp - numdigits
29337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    numdigits = len(op1.int) - len(op2.int)
29347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # numdigits != 0 => They have the same exponent, but not the same length
29357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # of the coefficient.
29367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if numdigits < 0:
29377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        numdigits = -numdigits
29387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op1
29397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
29407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op2
29417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    tmp.int[0:0] = [0] * numdigits
29427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return op1, op2
29437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _adjust_coefficients(op1, op2):
29457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Adjust op1, op2 so that op2.int+[0] > op1.int >= op2.int.
29467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Returns the adjusted op1, op2 as well as the change in op1.exp-op2.exp.
29487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Used on _WorkRep instances during division.
29507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
29517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    adjust = 0
29527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #If op1 is smaller, get it to same size
29537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if len(op2.int) > len(op1.int):
29547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        diff = len(op2.int) - len(op1.int)
29557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.int.extend([0]*diff)
29567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.exp -= diff
29577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust = diff
29587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #Same length, wrong order
29607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if len(op1.int) == len(op2.int) and op1.int < op2.int:
29617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.int.append(0)
29627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1.exp -= 1
29637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust+= 1
29647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return op1, op2, adjust
29657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if len(op1.int) > len(op2.int) + 1:
29677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        diff = len(op1.int) - len(op2.int) - 1
29687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.int.extend([0]*diff)
29697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.exp -= diff
29707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust -= diff
29717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if len(op1.int) == len(op2.int)+1 and op1.int > op2.int:
29737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.int.append(0)
29757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2.exp -= 1
29767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        adjust -= 1
29777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return op1, op2, adjust
29787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Helper Functions ########################################
29807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger_infinity_map = {
29827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'inf' : 1,
29837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'infinity' : 1,
29847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '+inf' : 1,
29857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '+infinity' : 1,
29867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '-inf' : -1,
29877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    '-infinity' : -1
29887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger}
29897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29900ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerdef _isinfinity(num):
29917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Determines whether a string or float is infinity.
29927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29930ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    +1 for negative infinity; 0 for finite ; +1 for positive infinity
29947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
29957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    num = str(num).lower()
29967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return _infinity_map.get(num, 0)
29977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
29980ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerdef _isnan(num):
29997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Determines whether a string or float is NaN
30007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (1, sign, diagnostic info as string) => NaN
30027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (2, sign, diagnostic info as string) => sNaN
30037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    0 => not a NaN
30047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
30057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    num = str(num).lower()
30067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if not num:
30077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
30087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    #get the sign, get rid of trailing [+-]
30107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    sign = 0
30117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if num[0] == '+':
30127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        num = num[1:]
30137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    elif num[0] == '-':  #elif avoids '+-nan'
30147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        num = num[1:]
30157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = 1
30167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if num.startswith('nan'):
30187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(num) > 3 and not num[3:].isdigit(): #diagnostic info
30197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
30207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (1, sign, num[3:].lstrip('0'))
30217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if num.startswith('snan'):
30227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if len(num) > 4 and not num[4:].isdigit():
30237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
30247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (2, sign, num[4:].lstrip('0'))
30257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return 0
30267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### Setup Specific Contexts ################################
30297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# The default context prototype used by Context()
3031fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger# Is mutable, so that new contexts can have different default values
30327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDefaultContext = Context(
30346ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=28, rounding=ROUND_HALF_EVEN,
3035bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation],
3036bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
30377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        _rounding_decision=ALWAYS_ROUND,
303899148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emax=999999999,
303999148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emin=-999999999,
3040e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        capitals=1
30417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
30427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Pre-made alternate contexts offered by the specification
30447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Don't change these; the user should be able to select these
30457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# contexts and be able to reproduce results from other implementations
30467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# of the spec.
30477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerBasicContext = Context(
30497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prec=9, rounding=ROUND_HALF_UP,
3050bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
3051bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
30527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
30537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerExtendedContext = Context(
30556ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=9, rounding=ROUND_HALF_EVEN,
3056bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[],
3057bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
30587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
30597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3061d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger##### Useful Constants (internal use only) ####################
30627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Reusable defaults
30647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInf = Decimal('Inf')
30657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingernegInf = Decimal('-Inf')
30667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#Infsign[sign] is infinity w/ that sign
30687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfsign = (Inf, negInf)
30697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN = Decimal('NaN')
30717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger##### crud for parsing strings #################################
30747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerimport re
30757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# There's an optional sign at the start, and an optional exponent
30777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# at the end.  The exponent has an optional sign and at least one
30787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# digit.  In between, must have either at least one digit followed
30797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# by an optional fraction, or a decimal point followed by at least
30807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# one digit.  Yuck.
30817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger_parser = re.compile(r"""
30837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
30847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (?P<sign>[-+])?
30857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (
30867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (?P<int>\d+) (\. (?P<frac>\d*))?
30877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    |
30887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        \. (?P<onlyfrac>\d+)
30897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    )
30907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    ([eE](?P<exp>[-+]? \d+))?
30917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
30927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    $
30937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger""", re.VERBOSE).match #Uncomment the \s* to allow leading or trailing spaces.
30947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdel re
30967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# return sign, n, p s.t. float string value == -1**sign * n * 10**p exactly
30987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
30997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdef _string2exact(s):
31007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    m = _parser(s)
31017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if m is None:
31027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        raise ValueError("invalid literal for Decimal: %r" % s)
31037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if m.group('sign') == "-":
31057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = 1
31067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
31077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign = 0
31087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    exp = m.group('exp')
31107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if exp is None:
31117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = 0
31127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
31137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = int(exp)
31147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    intpart = m.group('int')
31167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if intpart is None:
31177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        intpart = ""
31187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        fracpart = m.group('onlyfrac')
31197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
31207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        fracpart = m.group('frac')
31217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if fracpart is None:
31227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            fracpart = ""
31237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    exp -= len(fracpart)
31257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    mantissa = intpart + fracpart
31277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    tmp = map(int, mantissa)
31287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    backup = tmp
31297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    while tmp and tmp[0] == 0:
31307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        del tmp[0]
31317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # It's a zero
31337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    if not tmp:
31347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if backup:
31357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (sign, tuple(backup), exp)
31367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (sign, (0,), exp)
31377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    mantissa = tuple(tmp)
31387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return (sign, mantissa, exp)
31407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
31427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerif __name__ == '__main__':
31437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    import doctest, sys
31447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    doctest.testmod(sys.modules[__name__])
3145