decimal.py revision 4326ad8f72053140aa658a0392a509c9da382670
17c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Copyright (c) 2004 Python Software Foundation.
27c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# All rights reserved.
37c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Written by Eric Price <eprice at tjhsst.edu>
57c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Facundo Batista <facundo at taniquetil.com.ar>
67c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Raymond Hettinger <python at rcn.com>
71f34eb17b501687c1251678bcffab9accd432591Fred Drake#    and Aahz <aahz at pobox.com>
87c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Tim Peters
97c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1027dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# This module is currently Py2.3 compatible and should be kept that way
1127dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# unless a major compelling advantage arises.  IOW, 2.3 compatibility is
1227dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# strongly preferred, but not guaranteed.
1327dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger
1427dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# Also, this module should be kept in sync with the latest updates of
1527dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# the IBM specification as it evolves.  Those updates will be treated
1627dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# as bug fixes (deviation from the spec is a compatibility, usability
1727dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# bug) and will be backported.  At this point the spec is stabilizing
1827dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# and the updates are becoming fewer, smaller, and less significant.
197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"""
217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThis is a Py2.3 implementation of decimal floating point arithmetic based on
227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerthe General Decimal Arithmetic Specification:
237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    www2.hursley.ibm.com/decimal/decarith.html
257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
260ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerand IEEE standard 854-1987:
277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal floating point has finite precision with arbitrarily large bounds.
317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo BatistaThe purpose of this module is to support arithmetic using familiar
3359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista"schoolhouse" rules and to avoid some of the tricky representation
347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerissues associated with binary floating point.  The package is especially
357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingeruseful for financial applications or for contexts where users have
367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerexpectations that are at odds with binary floating point (for instance,
377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerin binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
38abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettingerof the expected Decimal('0.00') returned by decimal floating point).
397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerHere are some examples of using the decimal module:
417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> from decimal import *
43bd7f76dd04780304c397323ae994092ce759d5a2Raymond Hettinger>>> setcontext(ExtendedContext)
447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(0)
45abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('0')
46abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('1')
47abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('1')
48abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('-.0123')
49abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('-0.0123')
507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(123456)
51abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('123456')
52abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('123.45e12345678901234567890')
53abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('1.2345E+12345678901234567892')
54abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('1.33') + Decimal('1.27')
55abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('2.60')
56abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41')
57abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('-2.20')
587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> dig = Decimal(1)
597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3)
607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333
617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> getcontext().prec = 18
627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3)
637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333333333333
647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig.sqrt()
657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3).sqrt()
677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1.73205080756887729
687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3) ** 123
697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger4.85192780976896427E+58
707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> inf = Decimal(1) / Decimal(0)
717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print inf
727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity
737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> neginf = Decimal(-1) / Decimal(0)
747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf
757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity
767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf + inf
777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN
787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf * inf
797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity
807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0
817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity
82bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> getcontext().traps[DivisionByZero] = 1
837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0
847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last):
857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDivisionByZero: x / 0
897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c = Context()
90bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0
915aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0
937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c.divide(Decimal(0), Decimal(0))
94abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('NaN')
95bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 1
965aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
985aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0
995aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0
1017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0))
1027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last):
1037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1065aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond HettingerInvalidOperation: 0 / 0
1075aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
1095aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0
110bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0
1117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0))
1127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN
1135aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
1157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>>
1167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"""
1177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger__all__ = [
1197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Two major classes
1207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'Decimal', 'Context',
1217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Contexts
1239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    'DefaultContext', 'BasicContext', 'ExtendedContext',
1247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Exceptions
126d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger    'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
127d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger    'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
1287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Constants for use in setting up contexts
1307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP',
1327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Functions for manipulating contexts
1348b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    'setcontext', 'getcontext', 'localcontext'
1357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger]
1367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
137a016debad07f11c3b85131b4205305d190ac9ecaRaymond Hettinger__version__ = '1.70'    # Highest version of the spec this complies with
138daeceb2de80047f25aedbf16bf40dc5d619e64ddRaymond Hettinger
139eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettingerimport copy as _copy
140f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettingerimport math as _math
1412c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettingerimport numbers as _numbers
1427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
143097a1903035f9ee2efb1953306123f183124125dRaymond Hettingertry:
144097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger    from collections import namedtuple as _namedtuple
145097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger    DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
146097a1903035f9ee2efb1953306123f183124125dRaymond Hettingerexcept ImportError:
147097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger    DecimalTuple = lambda *args: args
148097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger
14959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista# Rounding
1500ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_DOWN = 'ROUND_DOWN'
1510ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_UP = 'ROUND_HALF_UP'
1520ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
1530ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_CEILING = 'ROUND_CEILING'
1540ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_FLOOR = 'ROUND_FLOOR'
1550ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_UP = 'ROUND_UP'
1560ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo BatistaROUND_05UP = 'ROUND_05UP'
1587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista# Errors
1607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DecimalException(ArithmeticError):
1625aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    """Base exception class.
1637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Used exceptions derive from this.
1657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    If an exception derives from another exception besides this (such as
1667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
1677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    called if the others are present.  This isn't actually used for
1687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    anything, though.
1697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
170cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis    handle  -- Called when context._raise_error is called and the
171cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               trap_enabler is set.  First argument is self, second is the
172cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               context.  More arguments can be given, those being after
173cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               the explanation in _raise_error (For example,
174cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               context._raise_error(NewError, '(-x)!', self._sign) would
175cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               call NewError().handle(context, self._sign).)
176cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
1777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    To define a new exception, it should be sufficient to have it derive
1787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    from DecimalException.
1797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
1817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        pass
1827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Clamped(DecimalException):
1857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent of a 0 changed to fit bounds.
1867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals clamped if the exponent of a result has been
1887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    altered in order to fit the constraints of a specific concrete
18959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    representation.  This may occur when the exponent of a zero result would
19059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    be outside the bounds of a representation, or when a large normal
19159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    number would have an encoded exponent that cannot be represented.  In
1927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    this latter case, the exponent is reduced to fit and the corresponding
1937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    number of zero digits are appended to the coefficient ("fold-down").
1947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidOperation(DecimalException):
1977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """An invalid operation was performed.
1987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Various bad things cause this:
2007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Something creates a signaling NaN
2027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -INF + INF
20359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    0 * (+-)INF
20459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    (+-)INF / (+-)INF
2057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x % 0
2067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (+-)INF % x
2077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x._rescale( non-integer )
2087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    sqrt(-x) , x > 0
2097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    0 ** 0
2107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (non-integer)
2117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (+-)INF
2127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    An operand is invalid
213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    The result of the operation after these is a quiet positive NaN,
215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    except when the cause is a signaling NaN, in which case the result is
216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    also a quiet NaN, but with the original sign, and an optional
217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    diagnostic information.
2187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if args:
2210f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
2220f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            return ans._fix_nan(context)
223c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson        return _NaN
2247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass ConversionSyntax(InvalidOperation):
2267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Trying to convert badly formed string.
2277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an string is being
2297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    converted to a number and it does not conform to the numeric string
23059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    syntax.  The result is [0,qNaN].
2317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
232cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis    def handle(self, context, *args):
233c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson        return _NaN
2347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionByZero(DecimalException, ZeroDivisionError):
2367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Division by 0.
2377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals division-by-zero if division of a finite number
2397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero was attempted (during a divide-integer or divide operation, or a
2407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    power operation with negative right-hand operand), and the dividend was
2417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not zero.
2427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result of the operation is [sign,inf], where sign is the exclusive
2447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or of the signs of the operands for divide, or is 1 for an odd power of
2457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -0, for power.
2467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
247cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
248cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista    def handle(self, context, sign, *args):
249b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger        return _SignedInfinity[sign]
2507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionImpossible(InvalidOperation):
2527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Cannot perform the division adequately.
2537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if the integer result of a
2557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    divide-integer or remainder operation had too many digits (would be
25659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    longer than precision).  The result is [0,qNaN].
2577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
258cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
2597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
260c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson        return _NaN
2617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionUndefined(InvalidOperation, ZeroDivisionError):
2637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Undefined result of division.
2647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if division by zero was
2667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    attempted (during a divide-integer, divide, or remainder operation), and
26759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    the dividend is also zero.  The result is [0,qNaN].
2687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
269cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
270cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista    def handle(self, context, *args):
271c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson        return _NaN
2727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Inexact(DecimalException):
2747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Had to round, losing information.
2757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals inexact whenever the result of an operation is
2777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not exact (that is, it needed to be rounded and any discarded digits
27859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    were non-zero), or if an overflow or underflow condition occurs.  The
2797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
2807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The inexact signal may be tested (or trapped) to determine if a given
2827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) was inexact.
2837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidContext(InvalidOperation):
2867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Invalid context.  Unknown rounding, for example.
2877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an invalid context was
28959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    detected during an operation.  This can occur if contexts are not checked
2907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    on creation and either the precision exceeds the capability of the
2917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    underlying concrete representation or an unknown or unsupported rounding
29259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    was specified.  These aspects of the context need only be checked when
29359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    the values are required to be used.  The result is [0,qNaN].
2947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
295cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
2967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
297c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson        return _NaN
2987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Rounded(DecimalException):
3007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Number got rounded (not  necessarily changed during rounding).
3017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals rounded whenever the result of an operation is
3037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    rounded (that is, some zero or non-zero digits were discarded from the
30459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    coefficient), or if an overflow or underflow condition occurs.  The
3057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
3067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The rounded signal may be tested (or trapped) to determine if a given
3087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) caused a loss of precision.
3097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Subnormal(DecimalException):
3127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent < Emin before rounding.
3137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals subnormal whenever the result of a conversion or
3157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation is subnormal (that is, its adjusted exponent is less than
31659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    Emin, before any rounding).  The result in all cases is unchanged.
3177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The subnormal signal may be tested (or trapped) to determine if a given
3197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or operation (or sequence of operations) yielded a subnormal result.
3207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Overflow(Inexact, Rounded):
3237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical overflow.
3247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals overflow if the adjusted exponent of a result
3267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (from a conversion or from an operation that is not an attempt to divide
3277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero), after rounding, would be greater than the largest value that
3287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    can be handled by the implementation (the value Emax).
3297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result depends on the rounding mode:
3317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    For round-half-up and round-half-even (and for round-half-down and
3337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-up, if implemented), the result of the operation is [sign,inf],
33459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    where sign is the sign of the intermediate result.  For round-down, the
3357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result is the largest finite number that can be represented in the
33659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    current precision, with the sign of the intermediate result.  For
3377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-ceiling, the result is the same as for round-down if the sign of
33859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    the intermediate result is 1, or is [0,inf] otherwise.  For round-floor,
3397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the result is the same as for round-down if the sign of the intermediate
34059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    result is 0, or is [1,inf] otherwise.  In all cases, Inexact and Rounded
3417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    will also be raised.
3420f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista    """
343cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
3447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, sign, *args):
3457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                ROUND_HALF_DOWN, ROUND_UP):
347b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _SignedInfinity[sign]
3487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 0:
3497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_CEILING:
350b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[sign]
35172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(sign, '9'*context.prec,
35272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                            context.Emax-context.prec+1)
3537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 1:
3547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_FLOOR:
355b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[sign]
35672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(sign, '9'*context.prec,
35772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                             context.Emax-context.prec+1)
3587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Underflow(Inexact, Rounded, Subnormal):
3617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical underflow with result rounded to 0.
3627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals underflow if a result is inexact and the
3647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    adjusted exponent of the result would be smaller (more negative) than
3657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the smallest value that can be handled by the implementation (the value
36659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    Emin).  That is, the result is both inexact and subnormal.
3677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result after an underflow will be a subnormal number rounded, if
36959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    necessary, so that its exponent is not less than Etiny.  This may result
3707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    in 0 with the sign of the intermediate result and an exponent of Etiny.
3717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    In all cases, Inexact, Rounded, and Subnormal will also be raised.
3737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3755aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# List of public traps and flags
376fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
377cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis           Underflow, InvalidOperation, Subnormal]
3787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3795aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# Map conditions (per the spec) to signals
3805aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger_condition_map = {ConversionSyntax:InvalidOperation,
3815aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionImpossible:InvalidOperation,
3825aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionUndefined:InvalidOperation,
3835aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  InvalidContext:InvalidOperation}
3847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Context Functions ##################################################
3867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
387ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# The getcontext() and setcontext() function manage access to a thread-local
388ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# current context.  Py2.4 offers direct support for thread locals.  If that
389ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# is not available, use threading.currentThread() which is slower but will
3907e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger# work for older Pythons.  If threads are not part of the build, create a
391cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis# mock threading object with threading.local() returning the module namespace.
3927e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger
3937e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingertry:
3947e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    import threading
3957e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingerexcept ImportError:
3967e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    # Python was compiled without threads; create a mock object instead
3977e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    import sys
39859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    class MockThreading(object):
3997e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger        def local(self, sys=sys):
4007e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger            return sys.modules[__name__]
4017e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    threading = MockThreading()
4027e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    del sys, MockThreading
403ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
404ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingertry:
405ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    threading.local
406ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
407ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerexcept AttributeError:
408ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
40959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # To fix reloading, force it to create a new context
41059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # Old contexts have different exceptions in their dicts, making problems.
411ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    if hasattr(threading.currentThread(), '__decimal_context__'):
412ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        del threading.currentThread().__decimal_context__
413ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
414ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context):
415ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
416ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4179fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
41861992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
4197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        threading.currentThread().__decimal_context__ = context
420ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
421ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext():
422ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
423ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
424ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
425ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
426ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
427ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
428ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
429ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return threading.currentThread().__decimal_context__
430ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
431ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
432ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            threading.currentThread().__decimal_context__ = context
433ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
434ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
435ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerelse:
436ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
437ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    local = threading.local()
4389fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    if hasattr(local, '__decimal_context__'):
4399fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        del local.__decimal_context__
440ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
441ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext(_local=local):
442ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
443ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
444ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
445ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
446ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
447ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
448ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
449ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return _local.__decimal_context__
450ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
451ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
452ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            _local.__decimal_context__ = context
453ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
454ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
455ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context, _local=local):
456ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
457ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4589fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
45961992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
460ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        _local.__decimal_context__ = context
461ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
462cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis    del threading, local        # Don't contaminate the namespace
4637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4648b6999b4c5fab174090be263ba90f193bdede141Nick Coghlandef localcontext(ctx=None):
4658b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """Return a context manager for a copy of the supplied context
4668b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
4678b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    Uses a copy of the current context if no context is specified
4688b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    The returned context manager creates a local decimal context
4698b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    in a with statement:
4708b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan        def sin(x):
4718b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan             with localcontext() as ctx:
4728b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 ctx.prec += 2
4738b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # Rest of sin calculation algorithm
4748b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # uses a precision 2 greater than normal
47559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista             return +s  # Convert result to normal precision
4768b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
4778b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan         def sin(x):
4788b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan             with localcontext(ExtendedContext):
4798b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # Rest of sin calculation algorithm
4808b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # uses the Extended Context from the
4818b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # General Decimal Arithmetic Specification
48259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista             return +s  # Convert result to normal context
4838b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
484ee340e501d2a59d70a91748ebd948787bfac8044Facundo Batista    >>> setcontext(DefaultContext)
4858b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> print getcontext().prec
4868b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    28
4878b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> with localcontext():
4888b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...     ctx = getcontext()
489495df4716fce4156c1eb110f9342297164eecbb6Raymond Hettinger    ...     ctx.prec += 2
4908b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...     print ctx.prec
4918b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...
4928b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    30
4938b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> with localcontext(ExtendedContext):
4948b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...     print getcontext().prec
4958b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...
4968b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    9
4978b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> print getcontext().prec
4988b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    28
4998b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """
500ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan    if ctx is None: ctx = getcontext()
501ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan    return _ContextManager(ctx)
5028b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
5037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
50459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Decimal class #######################################################
5057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Decimal(object):
5077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Floating point class for decimal arithmetic."""
5087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
509636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    __slots__ = ('_exp','_int','_sign', '_is_special')
510636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # Generally, the value of the Decimal instance is given by
511636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    #  (-1)**_sign * _int * 10**_exp
512636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # Special values are signified by _is_special == True
5137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
514dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    # We're immutable, so use __new__ not __init__
515636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    def __new__(cls, value="0", context=None):
5167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Create a decimal point instance.
5177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal('3.14')              # string input
519abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.14')
52059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        >>> Decimal((0, (3, 1, 4), -2))  # tuple (sign, digit_tuple, exponent)
521abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.14')
5227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(314)                 # int or long
523abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('314')
5247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(Decimal(314))        # another decimal instance
525abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('314')
52659bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        >>> Decimal('  3.14  \\n')        # leading and trailing whitespace okay
527abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.14')
5287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # Note that the coefficient, self._int, is actually stored as
53172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # a string rather than as a tuple of digits.  This speeds up
53272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # the "digits to integer" and "integer to digits" conversions
53372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # that are used in almost every arithmetic operation on
53472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # Decimals.  This is an internal detail: the as_tuple function
53572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # and the Decimal constructor still deal with tuples of
53672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # digits.
53772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
538636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self = object.__new__(cls)
539636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
5400d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # From a string
5410d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # REs insist on real strings, so we can too.
5420d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        if isinstance(value, basestring):
54359bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson            m = _parser(value.strip())
5440d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            if m is None:
5450d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                if context is None:
5460d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    context = getcontext()
5470d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                return context._raise_error(ConversionSyntax,
5480d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                                "Invalid literal for Decimal: %r" % value)
549636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
5500d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            if m.group('sign') == "-":
5510d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._sign = 1
5520d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            else:
5530d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._sign = 0
5540d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            intpart = m.group('int')
5550d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            if intpart is not None:
5560d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                # finite number
5574326ad8f72053140aa658a0392a509c9da382670Mark Dickinson                fracpart = m.group('frac') or ''
5580d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                exp = int(m.group('exp') or '0')
5594326ad8f72053140aa658a0392a509c9da382670Mark Dickinson                self._int = str(int(intpart+fracpart))
5604326ad8f72053140aa658a0392a509c9da382670Mark Dickinson                self._exp = exp - len(fracpart)
5610d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._is_special = False
5620d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            else:
5630d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                diag = m.group('diag')
5640d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                if diag is not None:
5650d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    # NaN
5664326ad8f72053140aa658a0392a509c9da382670Mark Dickinson                    self._int = str(int(diag or '0')).lstrip('0')
5670d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    if m.group('signal'):
5680d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                        self._exp = 'N'
5690d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    else:
5700d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                        self._exp = 'n'
5710d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                else:
5720d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    # infinity
5730d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    self._int = '0'
5740d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    self._exp = 'F'
5750d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._is_special = True
576636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
577636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
578636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # From an integer
5797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, (int,long)):
580636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if value >= 0:
581636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._sign = 0
582636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            else:
583636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._sign = 1
584636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._exp = 0
58572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self._int = str(abs(value))
5860d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._is_special = False
5870d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            return self
5880d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista
5890d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # From another decimal
5900d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        if isinstance(value, Decimal):
5910d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._exp  = value._exp
5920d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._sign = value._sign
5930d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._int  = value._int
5940d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._is_special  = value._is_special
5950d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            return self
5960d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista
5970d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # From an internal working value
5980d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        if isinstance(value, _WorkRep):
5990d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._sign = value.sign
6000d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._int = str(value.int)
6010d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._exp = int(value.exp)
6020d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._is_special = False
603636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
604636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
605636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # tuple/list conversion (possibly from as_tuple())
606636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if isinstance(value, (list,tuple)):
607636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if len(value) != 3:
6089b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                raise ValueError('Invalid tuple size in creation of Decimal '
6099b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 'from list or tuple.  The list or tuple '
6109b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 'should have exactly three elements.')
6119b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista            # process sign.  The isinstance test rejects floats
6129b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista            if not (isinstance(value[0], (int, long)) and value[0] in (0,1)):
6139b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                raise ValueError("Invalid sign.  The first value in the tuple "
6149b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 "should be an integer; either 0 for a "
6159b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 "positive number or 1 for a negative number.")
616636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._sign = value[0]
6179b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista            if value[2] == 'F':
6189b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                # infinity: value[1] is ignored
61972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                self._int = '0'
620636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._exp = value[2]
621636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._is_special = True
622636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            else:
6239b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                # process and validate the digits in value[1]
6249b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                digits = []
6259b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                for digit in value[1]:
6269b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    if isinstance(digit, (int, long)) and 0 <= digit <= 9:
6279b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                        # skip leading zeros
6289b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                        if digits or digit != 0:
6299b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                            digits.append(digit)
6309b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    else:
6319b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                        raise ValueError("The second value in the tuple must "
6329b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                         "be composed of integers in the range "
6339b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                         "0 through 9.")
6349b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                if value[2] in ('n', 'N'):
6359b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    # NaN: digits form the diagnostic
63672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                    self._int = ''.join(map(str, digits))
6379b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._exp = value[2]
6389b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._is_special = True
6399b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                elif isinstance(value[2], (int, long)):
6409b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    # finite number: digits give the coefficient
64172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                    self._int = ''.join(map(str, digits or [0]))
6429b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._exp = value[2]
6439b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._is_special = False
6449b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                else:
6459b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    raise ValueError("The third value in the tuple must "
6469b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                     "be an integer, or one of the "
6479b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                     "strings 'F', 'n', 'N'.")
648636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
649636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
650636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if isinstance(value, float):
651636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            raise TypeError("Cannot convert float to Decimal.  " +
652636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                            "First convert the float to a string")
6537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
654636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        raise TypeError("Cannot convert %r to Decimal" % value)
6557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6566a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson    # @classmethod, but @decorator is not valid Python 2.3 syntax, so
6576a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson    # don't use it (see notes on Py2.3 compatibility at top of file)
658f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger    def from_float(cls, f):
659f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        """Converts a float to a decimal number, exactly.
660f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
661f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Note that Decimal.from_float(0.1) is not the same as Decimal('0.1').
662f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Since 0.1 is not exactly representable in binary floating point, the
663f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        value is stored as the nearest representable value which is
664f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        0x1.999999999999ap-4.  The exact equivalent of the value in decimal
665f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        is 0.1000000000000000055511151231257827021181583404541015625.
666f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
667f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> Decimal.from_float(0.1)
668f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Decimal('0.1000000000000000055511151231257827021181583404541015625')
669f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> Decimal.from_float(float('nan'))
670f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Decimal('NaN')
671f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> Decimal.from_float(float('inf'))
672f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Decimal('Infinity')
673f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> Decimal.from_float(-float('inf'))
674f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Decimal('-Infinity')
675f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> Decimal.from_float(-0.0)
676f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Decimal('-0')
677f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
678f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        """
679f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        if isinstance(f, (int, long)):        # handle integer inputs
680f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger            return cls(f)
681f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        if _math.isinf(f) or _math.isnan(f):  # raises TypeError if not a float
682f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger            return cls(repr(f))
6836a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson        if _math.copysign(1.0, f) == 1.0:
6846a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson            sign = 0
6856a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson        else:
6866a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson            sign = 1
687f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        n, d = abs(f).as_integer_ratio()
688f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        k = d.bit_length() - 1
689f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        result = _dec_from_triple(sign, str(n*5**k), -k)
6906a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson        if cls is Decimal:
6916a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson            return result
6926a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson        else:
6936a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson            return cls(result)
6946a961637a826ab6293293866a43d5924cf1a77e7Mark Dickinson    from_float = classmethod(from_float)
695f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
6967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isnan(self):
6977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
6987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if a number
7000f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista        1 if NaN
7017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        2 if sNaN
7027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
703636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
704636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            exp = self._exp
705636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if exp == 'n':
706636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return 1
707636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            elif exp == 'N':
708636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return 2
7097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
7107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinfinity(self):
7127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is infinite
7137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if finite or not a number
7157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if +INF
7167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 if -INF
7177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
7187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 'F':
7197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign:
7207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return -1
7217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
7227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
7237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
724353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _check_nans(self, other=None, context=None):
7257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
7267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are sNaN, signal
7287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are NaN return nan
7297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
7307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Done before operations.
7327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
7337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
734636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self_is_nan = self._isnan()
735636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if other is None:
736636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            other_is_nan = False
737636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        else:
738636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            other_is_nan = other._isnan()
739636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
740636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self_is_nan or other_is_nan:
741636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if context is None:
742636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context = getcontext()
743636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
744636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self_is_nan == 2:
745636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation, 'sNaN',
7460f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        self)
747636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other_is_nan == 2:
748636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation, 'sNaN',
7490f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        other)
750636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self_is_nan:
751353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._fix_nan(context)
752636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return other._fix_nan(context)
7547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
7557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7562fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def _compare_check_nans(self, other, context):
7572fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        """Version of _check_nans used for the signaling comparisons
7582fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        compare_signal, __le__, __lt__, __ge__, __gt__.
7592fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7602fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        Signal InvalidOperation if either self or other is a (quiet
7612fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        or signaling) NaN.  Signaling NaNs take precedence over quiet
7622fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        NaNs.
7632fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7642fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        Return 0 if neither operand is a NaN.
7652fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7662fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        """
7672fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if context is None:
7682fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            context = getcontext()
7692fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7702fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self._is_special or other._is_special:
7712fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            if self.is_snan():
7722fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7732fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving sNaN',
7742fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            self)
7752fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            elif other.is_snan():
7762fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7772fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving sNaN',
7782fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            other)
7792fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            elif self.is_qnan():
7802fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7812fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving NaN',
7822fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            self)
7832fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            elif other.is_qnan():
7842fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7852fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving NaN',
7862fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            other)
7872fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return 0
7882fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __nonzero__(self):
7901a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is nonzero; otherwise return False.
7917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7921a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        NaNs and infinities are considered nonzero.
7937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
79472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self._is_special or self._int != '0'
7957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7962fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def _cmp(self, other):
7972fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        """Compare the two non-NaN decimal instances self and other.
7987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7992fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        Returns -1 if self < other, 0 if self == other and 1
8002fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self > other.  This routine is for internal use only."""
801636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
8022fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self._is_special or other._is_special:
803e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson            self_inf = self._isinfinity()
804e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson            other_inf = other._isinfinity()
805e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson            if self_inf == other_inf:
806e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson                return 0
807e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson            elif self_inf < other_inf:
808e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson                return -1
809e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson            else:
810e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson                return 1
8117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
812e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson        # check for zeros;  Decimal('0') == Decimal('-0')
813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not other:
815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return 0
816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return -((-1)**other._sign)
818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other:
819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return (-1)**self._sign
8207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
82159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # If different signs, neg one is less
8227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._sign < self._sign:
8237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -1
8247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign < other._sign:
8257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
8267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
827636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self_adjusted = self.adjusted()
828636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other_adjusted = other.adjusted()
829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_adjusted == other_adjusted:
83072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self_padded = self._int + '0'*(self._exp - other._exp)
83172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            other_padded = other._int + '0'*(other._exp - self._exp)
832e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson            if self_padded == other_padded:
833e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson                return 0
834e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson            elif self_padded < other_padded:
835e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson                return -(-1)**self._sign
836e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson            else:
837e52c31450dfbe649b559b3fa96630d348b838c19Mark Dickinson                return (-1)**self._sign
838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self_adjusted > other_adjusted:
8397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (-1)**self._sign
840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else: # self_adjusted < other_adjusted
8417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -((-1)**self._sign)
8427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8432fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # Note: The Decimal standard doesn't cover rich comparisons for
8442fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # Decimals.  In particular, the specification is silent on the
8452fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # subject of what should happen for a comparison involving a NaN.
8462fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # We take the following approach:
8472fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #
8482fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #   == comparisons involving a NaN always return False
8492fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #   != comparisons involving a NaN always return True
8502fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #   <, >, <= and >= comparisons involving a (quiet or signaling)
8512fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #      NaN signal InvalidOperation, and return False if the
8523a94ee05f77d0200cfb7988d02f3fdf292932a94Mark Dickinson    #      InvalidOperation is not trapped.
8532fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #
8542fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # This behavior is designed to conform as closely as possible to
8552fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # that specified by IEEE 754.
8562fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8570aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __eq__(self, other):
8582fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8592fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8602fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8612fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self.is_nan() or other.is_nan():
8622fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8632fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) == 0
8640aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
8650aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __ne__(self, other):
8662fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8672fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8682fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8692fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self.is_nan() or other.is_nan():
8702fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return True
8712fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) != 0
8722fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8732fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __lt__(self, other, context=None):
8742fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8752fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8762fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8772fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8782fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8792fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8802fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) < 0
8812fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8822fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __le__(self, other, context=None):
8832fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8842fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8852fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8862fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8872fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8882fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8892fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) <= 0
8902fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8912fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __gt__(self, other, context=None):
8922fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8932fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8942fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8952fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8962fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8972fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8982fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) > 0
8992fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
9002fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __ge__(self, other, context=None):
9012fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
9022fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
9032fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
9042fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
9052fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
9062fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
9072fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) >= 0
9080aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
9097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, other, context=None):
9107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares one to another.
9117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 => a < b
9137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0  => a = b
9147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1  => a > b
9157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN => one is NaN
9167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Like __cmp__, but returns Decimal instances.
9177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
9197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
92059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # Compare(NaN, NaN) = NaN
921636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if (self._is_special or other and other._is_special):
922636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
923636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
924636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
9257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9262fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return Decimal(self._cmp(other))
9277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __hash__(self):
9297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """x.__hash__() <==> hash(x)"""
9307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Decimal integers must hash the same as the ints
93152b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        #
93252b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # The hash of a nonspecial noninteger Decimal must depend only
93352b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # on the value of that Decimal, and not on its representation.
934abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        # For example: hash(Decimal('100E-1')) == hash(Decimal('10')).
935bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger        if self._is_special:
936bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger            if self._isnan():
937bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger                raise TypeError('Cannot hash a NaN value.')
938bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger            return hash(str(self))
9398c202440699cef19602acc24822366d0d7c32083Facundo Batista        if not self:
9408c202440699cef19602acc24822366d0d7c32083Facundo Batista            return 0
9418c202440699cef19602acc24822366d0d7c32083Facundo Batista        if self._isinteger():
9428c202440699cef19602acc24822366d0d7c32083Facundo Batista            op = _WorkRep(self.to_integral_value())
9438c202440699cef19602acc24822366d0d7c32083Facundo Batista            # to make computation feasible for Decimals with large
9448c202440699cef19602acc24822366d0d7c32083Facundo Batista            # exponent, we use the fact that hash(n) == hash(m) for
9458c202440699cef19602acc24822366d0d7c32083Facundo Batista            # any two nonzero integers n and m such that (i) n and m
9468c202440699cef19602acc24822366d0d7c32083Facundo Batista            # have the same sign, and (ii) n is congruent to m modulo
9478c202440699cef19602acc24822366d0d7c32083Facundo Batista            # 2**64-1.  So we can replace hash((-1)**s*c*10**e) with
9488c202440699cef19602acc24822366d0d7c32083Facundo Batista            # hash((-1)**s*c*pow(10, e, 2**64-1).
9498c202440699cef19602acc24822366d0d7c32083Facundo Batista            return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1))
95052b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # The value of a nonzero nonspecial Decimal instance is
95152b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # faithfully represented by the triple consisting of its sign,
95252b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # its adjusted exponent, and its coefficient with trailing
95352b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # zeros removed.
95452b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        return hash((self._sign,
95552b25795c02442fc40f8932d05e5d728266339a4Facundo Batista                     self._exp+len(self._int),
95652b25795c02442fc40f8932d05e5d728266339a4Facundo Batista                     self._int.rstrip('0')))
9577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def as_tuple(self):
9597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as a triple tuple.
9607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        To show the internals exactly as they are.
9627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
963097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger        return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
9647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
9667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as an instance of Decimal."""
9677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Invariant:  eval(repr(d)) == d
968abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        return "Decimal('%s')" % str(self)
9697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def __str__(self, eng=False, context=None):
9717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return string representation of the number in scientific notation.
9727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Captures all of the information in the underlying representation.
9747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
9757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
97662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        sign = ['', '-'][self._sign]
977e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger        if self._is_special:
97862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            if self._exp == 'F':
97962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                return sign + 'Infinity'
98062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            elif self._exp == 'n':
98162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                return sign + 'NaN' + self._int
98262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            else: # self._exp == 'N'
98362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                return sign + 'sNaN' + self._int
98462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
98562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # number of digits of self._int to left of decimal point
98662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        leftdigits = self._exp + len(self._int)
98762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
98862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # dotplace is number of digits of self._int to the left of the
98962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # decimal point in the mantissa of the output string (that is,
99062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # after adjusting the exponent)
99162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        if self._exp <= 0 and leftdigits > -6:
99262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # no exponent required
99362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            dotplace = leftdigits
99462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        elif not eng:
99562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # usual scientific notation: 1 digit on left of the point
9967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            dotplace = 1
99762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        elif self._int == '0':
99862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # engineering notation, zero
99962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            dotplace = (leftdigits + 1) % 3 - 1
10007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
100162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # engineering notation, nonzero
100262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            dotplace = (leftdigits - 1) % 3 + 1
100362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
100462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        if dotplace <= 0:
100562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            intpart = '0'
100662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            fracpart = '.' + '0'*(-dotplace) + self._int
100762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        elif dotplace >= len(self._int):
100862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            intpart = self._int+'0'*(dotplace-len(self._int))
100962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            fracpart = ''
101062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        else:
101162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            intpart = self._int[:dotplace]
101262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            fracpart = '.' + self._int[dotplace:]
101362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        if leftdigits == dotplace:
101462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            exp = ''
101562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        else:
101662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            if context is None:
101762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                context = getcontext()
101862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
101962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
102062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        return sign + intpart + fracpart + exp
10217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, context=None):
10237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Convert to engineering-type string.
10247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Engineering notation has an exponent which is a multiple of 3, so there
10267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        are up to 3 digits left of the decimal place.
10277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Same rules for when in exponential and when as a value as in __str__.
10297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self.__str__(eng=True, context=context)
10317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __neg__(self, context=None):
10337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy with the sign switched.
10347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds, if it has reason.
10367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1037636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1038636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1039636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1040636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
10437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # -Decimal('0') is Decimal('0'), not Decimal('-0')
10440f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            ans = self.copy_abs()
10457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
1046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self.copy_negate()
1047636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1048636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1049636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
1050e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
10517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __pos__(self, context=None):
10537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy, unless it is a sNaN.
10547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds the number (if more then precision digits)
10567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1057636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1058636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1059636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1060636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
10637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # + (-0) = 0
10640f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            ans = self.copy_abs()
1065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
1066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = Decimal(self)
10677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1068636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1069636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
1070e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
10717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1072e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    def __abs__(self, round=True, context=None):
10737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of self.
10747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1075e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        If the keyword argument 'round' is false, do not round.  The
1076e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        expression self.__abs__(round=False) is equivalent to
1077e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        self.copy_abs().
10787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1079e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        if not round:
1080e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            return self.copy_abs()
1081e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista
1082636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1083636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1084636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1085636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
10887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__neg__(context=context)
10897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
10907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__pos__(context=context)
10917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
10937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __add__(self, other, context=None):
10957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns self + other.
10967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -INF + INF (or the reverse) cause InvalidOperation errors.
10987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1099636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1100267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1101267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
1102636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
11037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
11047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
11057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1106636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1107636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1108636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1109636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
11107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1111636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity():
111259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                # If both INF, same sign => same as both, opposite => error.
1113636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if self._sign != other._sign and other._isinfinity():
1114636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '-INF + INF')
1115636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal(self)
1116636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
111759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                return Decimal(other)  # Can't both be infinity here
11187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = min(self._exp, other._exp)
11207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negativezero = 0
11217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding == ROUND_FLOOR and self._sign != other._sign:
112259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If the answer is 0, the sign should be negative, in this case.
11237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            negativezero = 1
11247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
11267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = min(self._sign, other._sign)
11277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if negativezero:
11287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                sign = 1
112972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(sign, '0', exp)
1130e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
1131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
11327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
113399b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista            exp = max(exp, other._exp - context.prec-1)
1134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = other._rescale(exp, context.rounding)
1135e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
11367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not other:
113899b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista            exp = max(exp, self._exp - context.prec-1)
1139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._rescale(exp, context.rounding)
1140e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
11417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = _WorkRep(self)
11447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = _WorkRep(other)
1145e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        op1, op2 = _normalize(op1, op2, context.prec)
11467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result = _WorkRep()
11487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if op1.sign != op2.sign:
11497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # Equal and opposite
115017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.int == op2.int:
115172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(negativezero, '0', exp)
1152e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                ans = ans._fix(context)
1153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return ans
115417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.int < op2.int:
11557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1, op2 = op2, op1
115659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                # OK, now abs(op1) > abs(op2)
115717931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.sign == 1:
115817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger                result.sign = 1
11597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1.sign, op2.sign = op2.sign, op1.sign
11607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
116117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger                result.sign = 0
116259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                # So we know the sign, and op1 > 0.
116317931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        elif op1.sign == 1:
11647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.sign = 1
116517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            op1.sign, op2.sign = (0, 0)
116617931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        else:
116717931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            result.sign = 0
116859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # Now, op1 > abs(op2) > 0
11697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
117017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        if op2.sign == 0:
1171636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            result.int = op1.int + op2.int
11727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
1173636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            result.int = op1.int - op2.int
11747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.exp = op1.exp
11767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(result)
1177e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        ans = ans._fix(context)
11787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
11797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __radd__ = __add__
11817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __sub__(self, other, context=None):
1183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return self - other"""
1184636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1185267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1186267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
11877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1188636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1189636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context=context)
1190636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1191636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
11927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self - other is computed as self + other.copy_negate()
1194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self.__add__(other.copy_negate(), context=context)
11957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rsub__(self, other, context=None):
1197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return other - self"""
1198636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1199267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1200267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
12017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return other.__sub__(self, context=context)
12037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mul__(self, other, context=None):
12057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self * other.
12067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (+-) INF * 0 (or its reverse) raise InvalidOperation.
12087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1209636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1210267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1211267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
1212636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
12137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
12147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
12157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1216d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger        resultsign = self._sign ^ other._sign
12177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1218636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1219636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1220636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1221636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
1222636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1223636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity():
1224636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if not other:
1225636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '(+-)INF * 0')
1226b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[resultsign]
1227636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1228636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
1229636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if not self:
1230636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '0 * (+-)INF')
1231b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[resultsign]
12327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resultexp = self._exp + other._exp
12347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by zero
12367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self or not other:
123772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(resultsign, '0', resultexp)
1238e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            # Fixing in case the exponent is out of bounds
1239e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
12407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
12417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by power of 10
124372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if self._int == '1':
124472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(resultsign, other._int, resultexp)
1245e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
12467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
124772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if other._int == '1':
124872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(resultsign, self._int, resultexp)
1249e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
12507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
12517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1252636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        op1 = _WorkRep(self)
1253636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        op2 = _WorkRep(other)
1254636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
125572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
1256e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        ans = ans._fix(context)
12577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
12597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __rmul__ = __mul__
12607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12618aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    def __truediv__(self, other, context=None):
12627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self / other."""
1263636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1264267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1265cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return NotImplemented
1266636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
12677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
12687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
12697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1270636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        sign = self._sign ^ other._sign
1271636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1272636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1273636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1274636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
12757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return ans
12767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1277636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity() and other._isinfinity():
12787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
12797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._isinfinity():
1281b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[sign]
1282636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1283636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
1284636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context._raise_error(Clamped, 'Division by infinity')
128572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(sign, '0', context.Etiny())
1286636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1287636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # Special cases for zeroes
1288636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if not other:
1289cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if not self:
1290cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionUndefined, '0 / 0')
1291636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return context._raise_error(DivisionByZero, 'x / 0', sign)
12927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1293cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not self:
1294cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            exp = self._exp - other._exp
1295cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            coeff = 0
1296cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        else:
1297cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            # OK, so neither = 0, INF or NaN
1298cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            shift = len(other._int) - len(self._int) + context.prec + 1
1299cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            exp = self._exp - other._exp - shift
1300cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op1 = _WorkRep(self)
1301cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op2 = _WorkRep(other)
1302cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if shift >= 0:
1303cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                coeff, remainder = divmod(op1.int * 10**shift, op2.int)
1304cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1305cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
1306cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if remainder:
1307cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                # result is not exact; adjust to ensure correct rounding
1308cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                if coeff % 5 == 0:
1309cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    coeff += 1
1310cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1311cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                # result is exact; get as close to ideal exponent as possible
1312cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                ideal_exp = self._exp - other._exp
1313cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                while exp < ideal_exp and coeff % 10 == 0:
1314cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    coeff //= 10
1315cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    exp += 1
13167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
131772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(sign, str(coeff), exp)
1318cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return ans._fix(context)
13197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1320cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista    def _divide(self, other, context):
1321cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        """Return (self // other, self % other), to context.prec precision.
13227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1323cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        Assumes that neither self nor other is a NaN, that self is not
1324cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        infinite and that other is nonzero.
1325cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        """
1326cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        sign = self._sign ^ other._sign
1327cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if other._isinfinity():
1328cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            ideal_exp = self._exp
1329cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        else:
1330cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            ideal_exp = min(self._exp, other._exp)
13317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1332cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        expdiff = self.adjusted() - other.adjusted()
1333cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not self or other._isinfinity() or expdiff <= -2:
133472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return (_dec_from_triple(sign, '0', 0),
1335cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    self._rescale(ideal_exp, context.rounding))
1336cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if expdiff <= context.prec:
1337cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op1 = _WorkRep(self)
1338cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op2 = _WorkRep(other)
1339cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if op1.exp >= op2.exp:
1340cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                op1.int *= 10**(op1.exp - op2.exp)
1341cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1342cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                op2.int *= 10**(op2.exp - op1.exp)
1343cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            q, r = divmod(op1.int, op2.int)
1344cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if q < 10**context.prec:
134572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return (_dec_from_triple(sign, str(q), 0),
134672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                        _dec_from_triple(self._sign, str(r), ideal_exp))
13477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1348cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        # Here the quotient is too large to be representable
1349cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = context._raise_error(DivisionImpossible,
1350cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                                   'quotient too large in //, % or divmod')
1351cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return ans, ans
13527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13538aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    def __rtruediv__(self, other, context=None):
13548aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson        """Swaps self/other and returns __truediv__."""
1355636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1356267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1357267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13588aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson        return other.__truediv__(self, context=context)
13598aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson
13608aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    __div__ = __truediv__
13618aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    __rdiv__ = __rtruediv__
13627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __divmod__(self, other, context=None):
13647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1365cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        Return (self // other, self % other)
13667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1367cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        other = _convert_other(other)
1368cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if other is NotImplemented:
1369cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return other
1370cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1371cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if context is None:
1372cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            context = getcontext()
1373cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1374cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = self._check_nans(other, context)
1375cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if ans:
1376cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return (ans, ans)
1377cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1378cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        sign = self._sign ^ other._sign
1379cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if self._isinfinity():
1380cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if other._isinfinity():
1381cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
1382cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return ans, ans
1383cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1384b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return (_SignedInfinity[sign],
1385cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                        context._raise_error(InvalidOperation, 'INF % x'))
1386cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1387cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not other:
1388cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if not self:
1389cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
1390cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return ans, ans
1391cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1392cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return (context._raise_error(DivisionByZero, 'x // 0', sign),
1393cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                        context._raise_error(InvalidOperation, 'x % 0'))
1394cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1395cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        quotient, remainder = self._divide(other, context)
1396e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        remainder = remainder._fix(context)
1397cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return quotient, remainder
13987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rdivmod__(self, other, context=None):
14007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __divmod__."""
1401636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1402267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1403267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
14047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__divmod__(self, context=context)
14057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mod__(self, other, context=None):
14077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
14087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self % other
14097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1410636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1411267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1412267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
14137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1414cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if context is None:
1415cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            context = getcontext()
14167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1417cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = self._check_nans(other, context)
1418cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if ans:
1419cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return ans
14207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1421cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if self._isinfinity():
1422cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(InvalidOperation, 'INF % x')
1423cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        elif not other:
1424cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if self:
1425cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(InvalidOperation, 'x % 0')
1426cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1427cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionUndefined, '0 % 0')
1428cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1429cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        remainder = self._divide(other, context)[1]
1430e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        remainder = remainder._fix(context)
1431cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return remainder
14327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rmod__(self, other, context=None):
14347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __mod__."""
1435636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1436267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1437267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
14387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__mod__(self, context=context)
14397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, other, context=None):
14417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
14427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Remainder nearest to 0-  abs(remainder-near) <= other/2
14437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1444636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1445636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
14467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
14487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
1450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
1451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
14527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self == +/-infinity -> InvalidOperation
1454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
1455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'remainder_near(infinity, x)')
14577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # other == 0 -> either InvalidOperation or DivisionUndefined
1459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other:
1460353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self:
1461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation,
1462353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                            'remainder_near(x, 0)')
1463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(DivisionUndefined,
1465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                            'remainder_near(0, 0)')
14667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # other = +/-infinity -> remainder = self
1468353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._isinfinity():
1469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = Decimal(self)
1470353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
14717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self = 0 -> remainder = self, with ideal exponent
1473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ideal_exponent = min(self._exp, other._exp)
1474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
147572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(self._sign, '0', ideal_exponent)
1476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
14777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # catch most cases of large or small quotient
1479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        expdiff = self.adjusted() - other.adjusted()
1480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if expdiff >= context.prec + 1:
1481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # expdiff >= prec+1 => abs(self/other) > 10**prec
1482cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(DivisionImpossible)
1483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if expdiff <= -2:
1484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # expdiff <= -2 => abs(self/other) < 0.1
1485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._rescale(ideal_exponent, context.rounding)
1486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
14877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1488353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adjust both arguments to have the same exponent, then divide
1489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op1 = _WorkRep(self)
1490353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op2 = _WorkRep(other)
1491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if op1.exp >= op2.exp:
1492353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op1.int *= 10**(op1.exp - op2.exp)
14937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
1494353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op2.int *= 10**(op2.exp - op1.exp)
1495353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        q, r = divmod(op1.int, op2.int)
1496353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # remainder is r*10**ideal_exponent; other is +/-op2.int *
1497353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 10**ideal_exponent.   Apply correction to ensure that
1498353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # abs(remainder) <= abs(other)/2
1499353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if 2*r + (q&1) > op2.int:
1500353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            r -= op2.int
1501353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            q += 1
1502353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1503353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if q >= 10**context.prec:
1504cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(DivisionImpossible)
1505353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1506353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # result has same sign as self unless r is negative
1507353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        sign = self._sign
1508353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if r < 0:
1509353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sign = 1-sign
1510353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            r = -r
15117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
151272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(sign, str(r), ideal_exponent)
1513353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans._fix(context)
15147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __floordiv__(self, other, context=None):
15167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """self // other"""
1517cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        other = _convert_other(other)
1518cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if other is NotImplemented:
1519cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return other
1520cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1521cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if context is None:
1522cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            context = getcontext()
1523cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1524cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = self._check_nans(other, context)
1525cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if ans:
1526cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return ans
1527cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1528cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if self._isinfinity():
1529cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if other._isinfinity():
1530cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(InvalidOperation, 'INF // INF')
1531cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1532b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[self._sign ^ other._sign]
1533cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1534cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not other:
1535cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if self:
1536cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionByZero, 'x // 0',
1537cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                                            self._sign ^ other._sign)
1538cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1539cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionUndefined, '0 // 0')
1540cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1541cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return self._divide(other, context)[0]
15427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rfloordiv__(self, other, context=None):
15447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __floordiv__."""
1545636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1546267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1547267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
15487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__floordiv__(self, context=context)
15497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __float__(self):
15517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Float representation."""
15527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return float(str(self))
15537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __int__(self):
155546b0802ccd9a9c47b27a285526fbb2a8bee5b8cbBrett Cannon        """Converts self to an int, truncating if necessary."""
1556636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1557636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isnan():
1558636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context = getcontext()
1559636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidContext)
1560636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            elif self._isinfinity():
15618aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson                raise OverflowError("Cannot convert infinity to int")
1562353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        s = (-1)**self._sign
15637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
156472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return s*int(self._int)*10**self._exp
1565605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger        else:
156672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return s*int(self._int[:self._exp] or '0')
15677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15685a05364049a7b0c3eeee94fb7b77e6b41036b3aeRaymond Hettinger    __trunc__ = __int__
15695a05364049a7b0c3eeee94fb7b77e6b41036b3aeRaymond Hettinger
1570116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def real(self):
1571116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return self
157265808ff0c08e60572cf81ebe5dc24794a706f390Mark Dickinson    real = property(real)
1573116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
1574116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def imag(self):
1575116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return Decimal(0)
157665808ff0c08e60572cf81ebe5dc24794a706f390Mark Dickinson    imag = property(imag)
1577116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
1578116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def conjugate(self):
1579116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return self
1580116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
1581116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def __complex__(self):
1582116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return complex(float(self))
1583116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
15847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __long__(self):
15857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts to a long.
15867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Equivalent to long(int(self))
15887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
15897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return long(self.__int__())
15907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1591353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _fix_nan(self, context):
1592353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Decapitate the payload of a NaN to fit the context"""
1593353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        payload = self._int
1594353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1595353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # maximum length of payload is precision if _clamp=0,
1596353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # precision-1 if _clamp=1.
1597353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        max_payload_len = context.prec - context._clamp
1598353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if len(payload) > max_payload_len:
159972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            payload = payload[len(payload)-max_payload_len:].lstrip('0')
160072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, payload, self._exp, True)
16016c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        return Decimal(self)
1602353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1603dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    def _fix(self, context):
16047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round if it is necessary to keep self within prec precision.
16057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds and fixes the exponent.  Does not raise on a sNaN.
16077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Arguments:
16097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self - Decimal instance
16107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context - context used.
16117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1612636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1613353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
1614353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self._isnan():
1615353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # decapitate payload if necessary
1616353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._fix_nan(context)
1617353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1618353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # self is +/-Infinity; return unaltered
16196c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return Decimal(self)
16207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1621353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if self is zero then exponent should be between Etiny and
1622353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.
1623353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Etiny = context.Etiny()
1624353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Etop = context.Etop()
16257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
1626353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exp_max = [context.Emax, Etop][context._clamp]
1627353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            new_exp = min(max(self._exp, Etiny), exp_max)
1628353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if new_exp != self._exp:
1629353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Clamped)
163072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(self._sign, '0', new_exp)
16317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
16326c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return Decimal(self)
16337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1634353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp_min is the smallest allowable exponent of the result,
1635353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # equal to max(self.adjusted()-context.prec+1, Etiny)
1636353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exp_min = len(self._int) + self._exp - context.prec
1637353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if exp_min > Etop:
1638353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # overflow: exp_min > Etop iff self.adjusted() > Emax
1639353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
1640353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
1641353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(Overflow, 'above Emax', self._sign)
1642353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_is_subnormal = exp_min < Etiny
1643353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_is_subnormal:
1644353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Subnormal)
1645353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exp_min = Etiny
16467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1647353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # round if self has too many digits
1648353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp < exp_min:
16497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
16502ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            digits = len(self._int) + self._exp - exp_min
16512ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            if digits < 0:
16522ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                self = _dec_from_triple(self._sign, '1', exp_min-1)
16532ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                digits = 0
16542ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            this_function = getattr(self, self._pick_rounding_function[context.rounding])
16552ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            changed = this_function(digits)
16562ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            coeff = self._int[:digits] or '0'
16572ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            if changed == 1:
16582ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                coeff = str(int(coeff)+1)
16592ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            ans = _dec_from_triple(self._sign, coeff, exp_min)
16602ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista
16612ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            if changed:
1662353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Inexact)
1663353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_is_subnormal:
1664353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    context._raise_error(Underflow)
1665353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if not ans:
1666353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        # raise Clamped on underflow to 0
1667353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        context._raise_error(Clamped)
1668353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                elif len(ans._int) == context.prec+1:
1669353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    # we get here only if rescaling rounds the
1670353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    # cofficient up to exactly 10**context.prec
1671353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if ans._exp < Etop:
167272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                        ans = _dec_from_triple(ans._sign,
167372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                                   ans._int[:-1], ans._exp+1)
1674353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    else:
1675353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        # Inexact and Rounded have already been raised
1676353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        ans = context._raise_error(Overflow, 'above Emax',
1677353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                                   self._sign)
16787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
16797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1680353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fold down if _clamp == 1 and self has too few digits
1681353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context._clamp == 1 and self._exp > Etop:
1682353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Clamped)
168372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self_padded = self._int + '0'*(self._exp - Etop)
168472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, self_padded, Etop)
16857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1686353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # here self was representable to begin with; return unchanged
16876c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        return Decimal(self)
16887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    _pick_rounding_function = {}
16907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1691353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # for each of the rounding functions below:
1692353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   self is a finite, nonzero Decimal
1693353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   prec is an integer satisfying 0 <= prec < len(self._int)
16942ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #
16952ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    # each function returns either -1, 0, or 1, as follows:
16962ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #   1 indicates that self should be rounded up (away from zero)
16972ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #   0 indicates that self should be truncated, and that all the
16982ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #     digits to be truncated are zeros (so the value is unchanged)
16992ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #  -1 indicates that there are nonzero digits to be truncated
17007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_down(self, prec):
1702353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Also known as round-towards-0, truncate."""
17032ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if _all_zeros(self._int, prec):
17042ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return 0
17052ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        else:
17062ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
17077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1708353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_up(self, prec):
1709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds away from 0."""
17102ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        return -self._round_down(prec)
17117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1712353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_half_up(self, prec):
1713353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds 5 up (away from 0)"""
171472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if self._int[prec] in '56789':
17152ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return 1
17162ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        elif _all_zeros(self._int, prec):
17172ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return 0
1718353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
17192ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
17207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1721353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_half_down(self, prec):
17227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round 5 down"""
17232ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if _exact_half(self._int, prec):
17242ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
17252ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        else:
17262ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return self._round_half_up(prec)
17277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1728353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_half_even(self, prec):
1729353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Round 5 to even, rest to nearest."""
17302ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if _exact_half(self._int, prec) and \
17312ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                (prec == 0 or self._int[prec-1] in '02468'):
17322ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
1733353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
17342ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return self._round_half_up(prec)
17357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1736353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_ceiling(self, prec):
17377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds up (not away from 0 if negative.)"""
17387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
1739353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._round_down(prec)
17407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
17412ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -self._round_down(prec)
17427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1743353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_floor(self, prec):
17447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds down (not towards 0 if negative)"""
17457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self._sign:
1746353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._round_down(prec)
17477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
17482ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -self._round_down(prec)
17497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1750353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_05up(self, prec):
1751353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Round down unless digit prec-1 is 0 or 5."""
17522ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if prec and self._int[prec-1] not in '05':
1753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._round_down(prec)
17542ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        else:
17552ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -self._round_down(prec)
1756353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1757353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def fma(self, other, third, context=None):
1758353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Fused multiply-add.
17597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1760353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Returns self*other+third with no rounding of the intermediate
1761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        product self*other.
1762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self and other are multiplied together, with no rounding of
1764353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the result.  The third operand is then added to the result,
1765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        and a single final rounding is performed.
17667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1768353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
17697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
177058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        # compute product; raise InvalidOperation if either operand is
177158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        # a signaling NaN or if the product is zero times infinity.
177258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        if self._is_special or other._is_special:
177358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if context is None:
177458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                context = getcontext()
177558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if self._exp == 'N':
17760f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                return context._raise_error(InvalidOperation, 'sNaN', self)
177758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if other._exp == 'N':
17780f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                return context._raise_error(InvalidOperation, 'sNaN', other)
177958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if self._exp == 'n':
178058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                product = self
178158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            elif other._exp == 'n':
178258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                product = other
178358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            elif self._exp == 'F':
178458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                if not other:
178558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                    return context._raise_error(InvalidOperation,
178658f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                                'INF * 0 in fma')
1787b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                product = _SignedInfinity[self._sign ^ other._sign]
178858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            elif other._exp == 'F':
178958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                if not self:
179058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                    return context._raise_error(InvalidOperation,
179158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                                '0 * INF in fma')
1792b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                product = _SignedInfinity[self._sign ^ other._sign]
179358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        else:
179458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            product = _dec_from_triple(self._sign ^ other._sign,
179558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                       str(int(self._int) * int(other._int)),
179658f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                       self._exp + other._exp)
17977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
179858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        third = _convert_other(third, raiseit=True)
179958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        return product.__add__(third, context)
18007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1801353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _power_modulo(self, other, modulo, context=None):
1802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Three argument version of __pow__"""
18037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1804353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if can't convert other and modulo to Decimal, raise
1805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # TypeError; there's no point returning NotImplemented (no
1806353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # equivalent of __rpow__ for three argument pow)
1807353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
1808353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo = _convert_other(modulo, raiseit=True)
18097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1810353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
1811353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
18127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # deal with NaNs: if there are any sNaNs then first one wins,
1814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (i.e. behaviour for NaNs is identical to that of fma)
1815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_is_nan = self._isnan()
1816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other_is_nan = other._isnan()
1817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo_is_nan = modulo._isnan()
1818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_is_nan or other_is_nan or modulo_is_nan:
1819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self_is_nan == 2:
1820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, 'sNaN',
18210f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        self)
1822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other_is_nan == 2:
1823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, 'sNaN',
18240f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        other)
1825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if modulo_is_nan == 2:
1826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, 'sNaN',
18270f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        modulo)
1828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self_is_nan:
18296c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return self._fix_nan(context)
1830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other_is_nan:
18316c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return other._fix_nan(context)
18326c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return modulo._fix_nan(context)
1833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1834353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # check inputs: we apply same restrictions as Python's pow()
1835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (self._isinteger() and
1836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                other._isinteger() and
1837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                modulo._isinteger()):
1838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'pow() 3rd argument not allowed '
1840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'unless all arguments are integers')
1841353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other < 0:
1842353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'pow() 2nd argument cannot be '
1844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'negative when 3rd argument specified')
1845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not modulo:
1846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'pow() 3rd argument cannot be 0')
1848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # additional restriction for decimal: the modulus must be less
1850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # than 10**prec in absolute value
1851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if modulo.adjusted() >= context.prec:
1852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'insufficient precision: pow() 3rd '
1854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'argument must not have more than '
1855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'precision digits')
1856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # define 0**0 == NaN, for consistency with two-argument pow
1858353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (even though it hurts!)
1859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other and not self:
1860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1861353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'at least one of pow() 1st argument '
1862353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'and 2nd argument must be nonzero ;'
1863353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        '0**0 is not defined')
1864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute sign of result
1866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._iseven():
1867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sign = 0
1868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
1869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sign = self._sign
1870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # convert modulo to a Python integer, and self and other to
1872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Decimal integers (i.e. force their exponents to be >= 0)
1873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo = abs(int(modulo))
1874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        base = _WorkRep(self.to_integral_value())
1875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exponent = _WorkRep(other.to_integral_value())
1876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute result using integer pow()
1878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
1879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        for i in xrange(exponent.exp):
1880353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            base = pow(base, 10, modulo)
1881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        base = pow(base, exponent.int, modulo)
1882353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
188372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(sign, str(base), 0)
1884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _power_exact(self, other, p):
1886353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Attempt to compute self**other exactly.
1887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Given Decimals self and other and an integer p, attempt to
1889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        compute an exact result for the power self**other, with p
1890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        digits of precision.  Return None if self**other is not
1891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exactly representable in p digits.
1892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Assumes that elimination of special cases has already been
1894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        performed: self and other must both be nonspecial; self must
1895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        be positive and not numerically equal to 1; other must be
1896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        nonzero.  For efficiency, other._exp should not be too large,
1897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        so that 10**abs(other._exp) is a feasible calculation."""
1898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # In the comments below, we write x for the value of self and
1900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # y for the value of other.  Write x = xc*10**xe and y =
1901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # yc*10**ye.
1902353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # The main purpose of this method is to identify the *failure*
1904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # of x**y to be exactly representable with as little effort as
1905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # possible.  So we look for cheap and easy tests that
1906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # eliminate the possibility of x**y being exact.  Only if all
1907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # these tests are passed do we go on to actually compute x**y.
1908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Here's the main idea.  First normalize both x and y.  We
1910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # express y as a rational m/n, with m and n relatively prime
1911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # and n>0.  Then for x**y to be exactly representable (at
1912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # *any* precision), xc must be the nth power of a positive
1913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # integer and xe must be divisible by n.  If m is negative
1914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # then additionally xc must be a power of either 2 or 5, hence
1915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # a power of 2**n or 5**n.
1916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # There's a limit to how small |y| can be: if y=m/n as above
1918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # then:
1919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #  (1) if xc != 1 then for the result to be representable we
1921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      need xc**(1/n) >= 2, and hence also xc**|y| >= 2.  So
1922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
1923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      2**(1/|y|), hence xc**|y| < 2 and the result is not
1924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      representable.
1925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #  (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1.  Hence if
1927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      |y| < 1/|xe| then the result is not representable.
1928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Note that since x is not equal to 1, at least one of (1) and
1930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (2) must apply.  Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
1931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
1932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # There's also a limit to how large y can be, at least if it's
1934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # positive: the normalized result will have coefficient xc**y,
1935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # so if it's representable then xc**y < 10**p, and y <
1936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # p/log10(xc).  Hence if y*log10(xc) >= p then the result is
1937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # not exactly representable.
1938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
1940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # so |y| < 1/xe and the result is not representable.
1941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
1942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # < 1/nbits(xc).
1943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        x = _WorkRep(self)
1945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        xc, xe = x.int, x.exp
1946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while xc % 10 == 0:
1947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc //= 10
1948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xe += 1
1949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _WorkRep(other)
1951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        yc, ye = y.int, y.exp
1952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while yc % 10 == 0:
1953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            yc //= 10
1954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ye += 1
1955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # case where xc == 1: result is 10**(xe*y), with xe*y
1957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # required to be an integer
1958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if xc == 1:
1959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ye >= 0:
1960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exponent = xe*yc*10**ye
1961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exponent, remainder = divmod(xe*yc, 10**-ye)
1963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if remainder:
1964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if y.sign == 1:
1966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exponent = -exponent
1967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # if other is a nonnegative integer, use ideal exponent
1968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._isinteger() and other._sign == 0:
1969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                ideal_exponent = self._exp*int(other)
1970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                zeros = min(exponent-ideal_exponent, p-1)
1971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                zeros = 0
197372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
1974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # case where y is negative: xc must be either a power
1976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # of 2 or a power of 5.
1977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if y.sign == 1:
1978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            last_digit = xc % 10
1979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if last_digit in (2,4,6,8):
1980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # quick test for power of 2
1981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if xc & -xc != xc:
1982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # now xc is a power of 2; e is its exponent
1984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                e = _nbits(xc)-1
1985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # find e*y and xe*y; both must be integers
1986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if ye >= 0:
1987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    y_as_int = yc*10**ye
1988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e = e*y_as_int
1989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe = xe*y_as_int
1990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
1991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    ten_pow = 10**-ye
1992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e, remainder = divmod(e*yc, ten_pow)
1993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
1994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
1995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe, remainder = divmod(xe*yc, ten_pow)
1996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
1997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
1998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if e*65 >= p*93: # 93/65 > log(10)/log(5)
2000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
2001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                xc = 5**e
2002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            elif last_digit == 5:
2004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # e >= log_5(xc) if xc is a power of 5; we have
2005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # equality all the way up to xc=5**2658
2006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                e = _nbits(xc)*28//65
2007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                xc, remainder = divmod(5**e, xc)
2008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if remainder:
2009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
2010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                while xc % 5 == 0:
2011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xc //= 5
2012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e -= 1
2013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if ye >= 0:
2014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    y_as_integer = yc*10**ye
2015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e = e*y_as_integer
2016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe = xe*y_as_integer
2017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
2018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    ten_pow = 10**-ye
2019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e, remainder = divmod(e*yc, ten_pow)
2020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
2021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
2022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe, remainder = divmod(xe*yc, ten_pow)
2023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
2024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
2025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if e*3 >= p*10: # 10/3 > log(10)/log(2)
2026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
2027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                xc = 2**e
2028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
20307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xc >= 10**p:
2032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xe = -e-xe
203472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, str(xc), xe)
20357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # now y is positive; find m and n such that y = m/n
2037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ye >= 0:
2038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            m, n = yc*10**ye, 1
2039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xe != 0 and len(str(abs(yc*xe))) <= -ye:
2041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc_bits = _nbits(xc)
2043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
2044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            m, n = yc, 10**(-ye)
2046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while m % 2 == n % 2 == 0:
2047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                m //= 2
2048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n //= 2
2049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while m % 5 == n % 5 == 0:
2050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                m //= 5
2051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n //= 5
2052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute nth root of xc*10**xe
2054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if n > 1:
2055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # if 1 < xc < 2**n then xc isn't an nth power
2056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xc != 1 and xc_bits <= n:
2057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xe, rem = divmod(xe, n)
2060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if rem != 0:
2061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # compute nth root of xc using Newton's method
2064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            a = 1L << -(-_nbits(xc)//n) # initial estimate
2065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
2066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                q, r = divmod(xc, a**(n-1))
2067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if a <= q:
2068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
2069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
2070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    a = (a*(n-1) + q)//n
2071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not (a == q and r == 0):
2072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc = a
2074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # now xc*10**xe is the nth root of the original xc*10**xe
2076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute mth power of xc*10**xe
2077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
2079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 10**p and the result is not representable.
2080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if xc > 1 and m > p*100//_log10_lb(xc):
2081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return None
2082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        xc = xc**m
2083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        xe *= m
2084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if xc > 10**p:
2085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return None
2086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # by this point the result *is* exactly representable
2088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adjust the exponent to get as close as possible to the ideal
2089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exponent, if necessary
2090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        str_xc = str(xc)
2091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._isinteger() and other._sign == 0:
2092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ideal_exponent = self._exp*int(other)
2093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            zeros = min(xe-ideal_exponent, p-len(str_xc))
2094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            zeros = 0
209672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
2097cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
2098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def __pow__(self, other, modulo=None, context=None):
2099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return self ** other [ % modulo].
21007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With two arguments, compute self**other.
21027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With three arguments, compute (self**other) % modulo.  For the
2104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        three argument form, the following restrictions on the
2105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        arguments hold:
21067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - all three arguments must be integral
2108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - other must be nonnegative
2109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - either self or other (or both) must be nonzero
2110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - modulo must be nonzero and must have at most p digits,
2111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista           where p is the context precision.
21127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        If any of these restrictions is violated the InvalidOperation
2114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        flag is raised.
2115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result of pow(self, other, modulo) is identical to the
2117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        result that would be obtained by computing (self**other) %
2118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo with unbounded precision, but is computed more
2119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        efficiently.  It is always exact.
2120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if modulo is not None:
2123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._power_modulo(other, modulo, context)
21247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2125636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
2126267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
2127267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
21287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
21317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # either argument is a NaN => result is NaN
2133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
2134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
2135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
21367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
2138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other:
2139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not self:
2140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, '0 ** 0')
2141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2142b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _One
21437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # result has sign 1 iff self._sign is 1 and other is an odd integer
2145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        result_sign = 0
2146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 1:
2147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._isinteger():
2148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if not other._iseven():
2149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    result_sign = 1
2150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # -ve**noninteger = NaN
2152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # (-0)**noninteger = 0**noninteger
2153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self:
2154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return context._raise_error(InvalidOperation,
2155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        'x ** y with x negative and y not an integer')
2156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # negate self, without doing any unwanted rounding
215772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self = self.copy_negate()
2158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
2160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
2161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._sign == 0:
216272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(result_sign, '0', 0)
2163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2164b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[result_sign]
2165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
2167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
2168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._sign == 0:
2169b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[result_sign]
2170353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
217172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(result_sign, '0', 0)
2172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 1**other = 1, but the choice of exponent and the flags
2174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # depend on the exponent of self, and on whether other is a
2175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # positive integer, a negative integer, or neither
2176b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger        if self == _One:
2177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._isinteger():
2178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # exp = max(self._exp*max(int(other), 0),
2179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # 1-context.prec) but evaluating int(other) directly
2180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # is dangerous until we know other is small (other
2181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # could be 1e999999999)
2182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other._sign == 1:
2183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    multiplier = 0
2184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                elif other > context.prec:
2185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    multiplier = context.prec
2186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
2187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    multiplier = int(other)
2188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exp = self._exp * multiplier
2190353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if exp < 1-context.prec:
2191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    exp = 1-context.prec
2192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    context._raise_error(Rounded)
2193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Inexact)
2195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Rounded)
2196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exp = 1-context.prec
2197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
219872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
2199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute adjusted exponent of self
2201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_adj = self.adjusted()
2202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self ** infinity is infinity if self > 1, 0 if self < 1
2204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self ** -infinity is infinity if self < 1, 0 if self > 1
2205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._isinfinity():
2206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if (other._sign == 0) == (self_adj < 0):
220772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(result_sign, '0', 0)
2208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2209b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[result_sign]
2210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # from here on, the result always goes through the call
2212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # to _fix at the end of this function.
2213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = None
2214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # crude test to catch cases of extreme overflow/underflow.  If
2216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(self)*other >= 10**bound and bound >= len(str(Emax))
2217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
2218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self**other >= 10**(Emax+1), so overflow occurs.  The test
2219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # for underflow is similar.
2220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        bound = self._log10_exp_bound() + other.adjusted()
2221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if (self_adj >= 0) == (other._sign == 0):
2222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self > 1 and other +ve, or self < 1 and other -ve
2223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # possibility of overflow
2224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if bound >= len(str(context.Emax)):
222572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(result_sign, '1', context.Emax+1)
2226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self > 1 and other -ve, or self < 1 and other +ve
2228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # possibility of underflow to 0
2229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            Etiny = context.Etiny()
2230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if bound >= len(str(-Etiny)):
223172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(result_sign, '1', Etiny-1)
2232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # try for an exact result with precision +1
2234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans is None:
2235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._power_exact(other, context.prec + 1)
2236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans is not None and result_sign == 1:
223772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(1, ans._int, ans._exp)
2238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # usual case: inexact result, x**y computed directly as exp(y*log(x))
2240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans is None:
2241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            p = context.prec
2242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            x = _WorkRep(self)
2243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc, xe = x.int, x.exp
2244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            y = _WorkRep(other)
2245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            yc, ye = y.int, y.exp
2246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if y.sign == 1:
2247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                yc = -yc
2248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # compute correctly rounded result:  start with precision +3,
2250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # then increase precision until result is unambiguously roundable
2251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            extra = 3
2252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
2253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
2254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if coeff % (5*10**(len(str(coeff))-p-1)):
2255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
2256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                extra += 3
2257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
225872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(result_sign, str(coeff), exp)
2259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the specification says that for non-integer other we need to
2261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # raise Inexact, even when the result is actually exact.  In
2262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the same way, we need to raise Underflow here if the result
2263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # is subnormal.  (The call to _fix will take care of raising
2264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Rounded and Subnormal, as usual.)
2265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other._isinteger():
2266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
2267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # pad with zeros up to length context.prec+1 if necessary
2268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if len(ans._int) <= context.prec:
2269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                expdiff = context.prec+1 - len(ans._int)
227072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
227172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                       ans._exp-expdiff)
2272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans.adjusted() < context.Emin:
2273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Underflow)
2274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # unlike exp, ln and log10, the power function respects the
2276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # rounding mode; no need to use ROUND_HALF_EVEN here
2277353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
2279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def __rpow__(self, other, context=None):
2281353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Swaps self/other and returns __pow__."""
2282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other)
2283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other is NotImplemented:
2284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return other
2285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return other.__pow__(self, context=context)
2286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2287353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def normalize(self, context=None):
2288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
2289353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
2294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._check_nans(context=context)
2295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans:
2296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return ans
2297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        dup = self._fix(context)
2299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if dup._isinfinity():
2300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return dup
2301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not dup:
230372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(dup._sign, '0', 0)
2304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exp_max = [context.Emax, context.Etop()][context._clamp]
2305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        end = len(dup._int)
23067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = dup._exp
230772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        while dup._int[end-1] == '0' and exp < exp_max:
23087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp += 1
23097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            end -= 1
231072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(dup._sign, dup._int[:end], exp)
23117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2312bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista    def quantize(self, exp, rounding=None, context=None, watchexp=True):
23137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Quantize self so its exponent is the same as that of exp.
23147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Similar to self._rescale(exp._exp) but with error checking.
23167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2317bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista        exp = _convert_other(exp, raiseit=True)
2318bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista
2319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if rounding is None:
2322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rounding = context.rounding
2323353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2324636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or exp._is_special:
2325636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(exp, context)
2326636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
2327636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
23287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2329636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if exp._isinfinity() or self._isinfinity():
2330636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if exp._isinfinity() and self._isinfinity():
23316c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return Decimal(self)  # if both are inf, it is OK
2332636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation,
2333636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                                        'quantize with one INF')
2334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2335bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista        # if we're not watching exponents, do a simple rescale
2336bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista        if not watchexp:
2337bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            ans = self._rescale(exp._exp, rounding)
2338bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            # raise Inexact and Rounded where appropriate
2339bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            if ans._exp > self._exp:
2340bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista                context._raise_error(Rounded)
2341bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista                if ans != self:
2342bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista                    context._raise_error(Inexact)
2343bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            return ans
2344bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista
2345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp._exp should be between Etiny and Emax
2346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (context.Etiny() <= exp._exp <= context.Emax):
2347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                   'target exponent out of bounds in quantize')
2349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2350353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
235172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(self._sign, '0', exp._exp)
2352353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
2353353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_adjusted = self.adjusted()
2355353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_adjusted > context.Emax:
2356353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2357353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'exponent of quantize result too large for current context')
2358353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_adjusted - exp._exp + 1 > context.prec:
2359353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2360353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'quantize result has too many digits for current context')
2361353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2362353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._rescale(exp._exp, rounding)
2363353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans.adjusted() > context.Emax:
2364353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2365353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'exponent of quantize result too large for current context')
2366353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if len(ans._int) > context.prec:
2367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'quantize result has too many digits for current context')
2369353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2370353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # raise appropriate flags
2371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans._exp > self._exp:
2372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
2373353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans != self:
2374353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Inexact)
2375353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans and ans.adjusted() < context.Emin:
2376353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Subnormal)
2377353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2378353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # call to fix takes care of any necessary folddown
2379353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2380353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
23817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, other):
23831a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self and other have the same exponent; otherwise
23841a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return False.
23857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23861a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        If either operand is a special value, the following rules are used:
23871a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista           * return True if both operands are infinities
23881a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista           * return True if both operands are NaNs
23891a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista           * otherwise, return False.
23907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23911a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        other = _convert_other(other, raiseit=True)
2392636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
23931a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista            return (self.is_nan() and other.is_nan() or
23941a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista                    self.is_infinite() and other.is_infinite())
23957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._exp == other._exp
23967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2397353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _rescale(self, exp, rounding):
2398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rescale self so that the exponent is exp, either by padding with zeros
2399353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        or by truncating digits, using the given rounding mode.
2400353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Specials are returned without change.  This operation is
2402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        quiet: it raises no flags, and uses no information from the
2403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.
24047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = exp to scale to (an integer)
2406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = rounding mode
24077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2408636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
24096c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
24107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
241172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, '0', exp)
24127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp >= exp:
2414353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # pad answer with zeros if necessary
241572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign,
241672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                        self._int + '0'*(self._exp - exp), exp)
24177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2418353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # too many digits; round and lose data.  If self.adjusted() <
2419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp-1, replace self by 10**(exp-1) before rounding
2420353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        digits = len(self._int) + self._exp - exp
24217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if digits < 0:
242272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self = _dec_from_triple(self._sign, '1', exp-1)
2423353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            digits = 0
2424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        this_function = getattr(self, self._pick_rounding_function[rounding])
24252ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        changed = this_function(digits)
24262ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        coeff = self._int[:digits] or '0'
24272ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if changed == 1:
24282ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            coeff = str(int(coeff)+1)
24292ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        return _dec_from_triple(self._sign, coeff, exp)
24307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    def _round(self, places, rounding):
24321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        """Round a nonzero, nonspecial Decimal to a fixed number of
24331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        significant figures, using the given rounding mode.
24341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
24351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        Infinities, NaNs and zeros are returned unaltered.
24361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
24371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        This operation is quiet: it raises no flags, and uses no
24381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        information from the context.
24391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
24401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        """
24411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if places <= 0:
24421ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            raise ValueError("argument should be at least 1 in _round")
24431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if self._is_special or not self:
24441ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            return Decimal(self)
24451ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        ans = self._rescale(self.adjusted()+1-places, rounding)
24461ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # it can happen that the rescale alters the adjusted exponent;
24471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # for example when rounding 99.97 to 3 significant figures.
24481ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # When this happens we end up with an extra 0 at the end of
24491ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # the number; a second rescale fixes this.
24501ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if ans.adjusted() != self.adjusted():
24511ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            ans = ans._rescale(ans.adjusted()+1-places, rounding)
24521ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        return ans
24531ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
2454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_exact(self, rounding=None, context=None):
2455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds to a nearby integer.
24567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        If no rounding mode is specified, take the rounding mode from
2458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the context.  This method raises the Rounded and Inexact flags
2459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        when appropriate.
24607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        See also: to_integral_value, which does exactly the same as
2462353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        this method except that it doesn't raise Inexact or Rounded.
2463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2464636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
2465636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
2466636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
2467636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
24686c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
24697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
24706c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
2471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
247272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, '0', 0)
2473636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
2474636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
2475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if rounding is None:
2476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rounding = context.rounding
2477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._raise_error(Rounded)
2478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._rescale(0, rounding)
2479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans != self:
2480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
24817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
24827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_value(self, rounding=None, context=None):
2484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds to the nearest integer, without raising inexact, rounded."""
2485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2487353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if rounding is None:
2488353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rounding = context.rounding
2489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
2490353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._check_nans(context=context)
2491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans:
2492353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return ans
24936c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
2494353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp >= 0:
24956c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
2496353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2497353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._rescale(0, rounding)
24987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2499353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # the method name changed, but we provide also the old one, for compatibility
2500353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    to_integral = to_integral_value
2501353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2502353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def sqrt(self, context=None):
2503353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return the square root of self."""
25043b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson        if context is None:
25053b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson            context = getcontext()
25063b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson
2507636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
2508636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
2509636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
2510636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
25117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2512636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity() and self._sign == 0:
2513636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal(self)
25147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
2516353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # exponent = self._exp // 2.  sqrt(-0) = -0
251772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(self._sign, '0', self._exp // 2)
2518353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
25197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign == 1:
25217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
25227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2523353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # At this point self represents a positive number.  Let p be
2524353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the desired precision and express self in the form c*100**e
2525353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # with c a positive real number and e an integer, c and e
2526353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # being chosen so that 100**(p-1) <= c < 100**p.  Then the
2527353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
2528353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # <= sqrt(c) < 10**p, so the closest representable Decimal at
2529353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # precision p is n*10**e where n = round_half_even(sqrt(c)),
2530353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the closest integer to sqrt(c) with the even integer chosen
2531353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # in the case of a tie.
2532353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
2533353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # To ensure correct rounding in all cases, we use the
2534353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # following trick: we compute the square root to an extra
2535353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # place (precision p+1 instead of precision p), rounding down.
2536353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Then, if the result is inexact and its last digit is 0 or 5,
2537353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # we increase the last digit to 1 or 6 respectively; if it's
2538353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exact we leave the last digit alone.  Now the final round to
2539353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # p places (or fewer in the case of underflow) will round
2540353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # correctly and raise the appropriate flags.
2541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2542353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # use an extra digit of precision
2543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        prec = context.prec+1
2544353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # write argument in the form c*100**e where e = self._exp//2
2546353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # is the 'ideal' exponent, to be used if the square root is
2547353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exactly representable.  l is the number of 'digits' of c in
2548353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # base 100, so that 100**(l-1) <= c < 100**l.
2549353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
2550353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        e = op.exp >> 1
2551353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if op.exp & 1:
2552353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = op.int * 10
2553353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            l = (len(self._int) >> 1) + 1
25547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
2555353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = op.int
2556353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            l = len(self._int)+1 >> 1
2557353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2558353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # rescale so that c has exactly prec base 100 'digits'
2559353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        shift = prec-l
2560353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if shift >= 0:
2561353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c *= 100**shift
2562353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exact = True
25637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
2564353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c, remainder = divmod(c, 100**-shift)
2565353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exact = not remainder
2566353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        e -= shift
2567353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2568353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # find n = floor(sqrt(c)) using Newton's method
2569353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        n = 10**prec
2570353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while True:
2571353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            q = c//n
2572353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if n <= q:
25737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
2574353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2575353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n = n + q >> 1
2576353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exact = exact and n*n == c
2577353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2578353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if exact:
2579353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result is exact; rescale to use ideal exponent e
2580353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if shift >= 0:
2581353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # assert n % 10**shift == 0
2582353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n //= 10**shift
2583353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2584353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n *= 10**-shift
2585353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            e += shift
25867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
2587353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result is not exact; fix last digit as described above
2588353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if n % 5 == 0:
2589353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n += 1
25907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
259172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(0, str(n), e)
25927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2593353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # round, and fit to current context
2594353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
2595353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
2596dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        ans = ans._fix(context)
2597353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
25987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2599353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
26007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, other, context=None):
26027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the larger value.
26037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2604353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Like max(self, other) except if one is not a number, returns
26057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
26067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2607353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
2608636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
26096c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
26106c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
26116c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
2612636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
261359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
2614636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # number is always returned
2615636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            sn = self._isnan()
2616636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            on = other._isnan()
2617636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if sn or on:
2618e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if on == 1 and sn == 0:
2619e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return self._fix(context)
2620e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if sn == 1 and on == 0:
2621e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return other._fix(context)
2622636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self._check_nans(other, context)
26237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26242fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self._cmp(other)
2625d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
262659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If both operands are finite and equal in numerical value
2627d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # then an ordering is applied:
2628d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
262959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If the signs differ then max returns the operand with the
2630d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # positive sign and min returns the operand with the negative sign
2631d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
263259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If the signs are the same then the exponent is used to select
2633353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # the result.  This is exactly the ordering used in compare_total.
2634353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
2635353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2636353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
26377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2638353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2639353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
2640636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2641e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
26427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, other, context=None):
26447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the smaller value.
26457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
264659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        Like min(self, other) except if one is not a number, returns
26477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
26487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2649353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
2650636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
26516c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
26526c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
26536c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
2654636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
265559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
2656636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # number is always returned
2657636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            sn = self._isnan()
2658636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            on = other._isnan()
2659636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if sn or on:
2660e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if on == 1 and sn == 0:
2661e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return self._fix(context)
2662e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if sn == 1 and on == 0:
2663e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return other._fix(context)
2664636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self._check_nans(other, context)
26657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26662fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self._cmp(other)
2667d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
2668353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
2669353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2670353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
2671353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
2672353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
26737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2674636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2675e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
26767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinteger(self):
26787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether self is an integer"""
2679353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
2680353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return False
26817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
26827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return True
26837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rest = self._int[self._exp:]
268472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return rest == '0'*len(rest)
26857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _iseven(self):
2687353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns True if self is even.  Assumes self is an integer."""
2688353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self or self._exp > 0:
2689353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return True
269072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self._int[-1+self._exp] in '02468'
26917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def adjusted(self):
26937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the adjusted exponent of self"""
26947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        try:
26957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._exp + len(self._int) - 1
269659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # If NaN or Infinity, self._exp is string
26977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        except TypeError:
26987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
26997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2700353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def canonical(self, context=None):
2701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the same Decimal object.
2702353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2703353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        As we do not have different encodings for the same number, the
2704353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        received object already is in its canonical form.
2705353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2706353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self
2707353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2708353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_signal(self, other, context=None):
2709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares self to the other operand numerically.
2710353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        It's pretty much like compare(), but all NaNs signal, with signaling
2712353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        NaNs taking precedence over quiet NaNs.
2713353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
27142fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other, raiseit = True)
27152fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
27162fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
27172fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return ans
2718353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self.compare(other, context=context)
2719353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2720353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total(self, other):
2721353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares self to other using the abstract representations.
2722353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2723353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        This is not like the standard compare, which use their numerical
2724353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value. Note that a total ordering is defined for all possible abstract
2725353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        representations.
2726353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2727353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if one is negative and the other is positive, it's easy
2728353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign and not other._sign:
2729b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _NegativeOne
2730353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._sign and other._sign:
2731b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _One
2732353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        sign = self._sign
2733353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2734353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # let's handle both NaN types
2735353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_nan = self._isnan()
2736353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other_nan = other._isnan()
2737353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_nan or other_nan:
2738353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self_nan == other_nan:
2739353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self._int < other._int:
2740353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if sign:
2741b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                        return _One
2742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    else:
2743b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                        return _NegativeOne
2744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self._int > other._int:
2745353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if sign:
2746b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                        return _NegativeOne
2747353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    else:
2748b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                        return _One
2749b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _Zero
2750353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2751353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sign:
2752353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 1:
2753b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _NegativeOne
2754353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 1:
2755b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _One
2756353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 2:
2757b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _NegativeOne
2758353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 2:
2759b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _One
2760353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 1:
2762b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _One
2763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 1:
2764b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _NegativeOne
2765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 2:
2766b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _One
2767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 2:
2768b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _NegativeOne
2769353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2770353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self < other:
2771b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _NegativeOne
2772353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self > other:
2773b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _One
2774353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2775353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp < other._exp:
2776353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sign:
2777b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _One
2778353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2779b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _NegativeOne
2780353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp > other._exp:
2781353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sign:
2782b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _NegativeOne
2783353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2784b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _One
2785b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger        return _Zero
2786353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2787353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total_mag(self, other):
2789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares self to other using abstract repr., ignoring sign.
2790353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2791353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Like compare_total, but with operand's sign ignored and assumed to be 0.
2792353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2793353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        s = self.copy_abs()
2794353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        o = other.copy_abs()
2795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return s.compare_total(o)
2796353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_abs(self):
2798353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy with the sign set to 0. """
279972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, self._int, self._exp, self._is_special)
2800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2801353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_negate(self):
2802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy with the sign inverted."""
2803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign:
280472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, self._int, self._exp, self._is_special)
2805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
280672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(1, self._int, self._exp, self._is_special)
2807353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2808353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_sign(self, other):
2809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns self with the sign of other."""
281072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(other._sign, self._int,
281172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                self._exp, self._is_special)
2812353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def exp(self, context=None):
2814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns e ** self."""
2815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(NaN) = NaN
2820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
2821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
2822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
2823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(-Infinity) = 0
2825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == -1:
2826b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Zero
2827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(0) = 1
2829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
2830b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _One
2831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(Infinity) = Infinity
2833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
2834353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Decimal(self)
2835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the result is now guaranteed to be inexact (the true
2837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # mathematical result is transcendental). There's no need to
2838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # raise Rounded and Inexact here---they'll always be raised as
2839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # a result of the call to _fix.
2840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        p = context.prec
2841353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        adj = self.adjusted()
2842353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # we only need to do any computation for quite a small range
2844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # of adjusted exponents---for example, -29 <= adj <= 10 for
2845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the default context.  For smaller exponent the result is
2846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # indistinguishable from 1 at the given precision, while for
2847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # larger exponent the result either overflows or underflows.
2848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
2849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # overflow
285072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '1', context.Emax+1)
2851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
2852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # underflow to 0
285372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '1', context.Etiny()-1)
2854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self._sign == 0 and adj < -p:
2855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # p+1 digits; final round will raise correct flags
285672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
2857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self._sign == 1 and adj < -p-1:
2858353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # p+1 digits; final round will raise correct flags
285972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '9'*(p+1), -p-1)
2860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # general case
2861353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2862353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op = _WorkRep(self)
2863353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c, e = op.int, op.exp
2864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if op.sign == 1:
2865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                c = -c
2866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # compute correctly rounded result: increase precision by
2868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # 3 digits at a time until we get an unambiguously
2869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # roundable result
2870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            extra = 3
2871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
2872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                coeff, exp = _dexp(c, e, p+extra)
2873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if coeff % (5*10**(len(str(coeff))-p-1)):
2874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
2875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                extra += 3
2876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
287772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, str(coeff), exp)
2878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # at this stage, ans should round correctly with *any*
2880353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # rounding mode, not just with ROUND_HALF_EVEN
2881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
2882353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
2883353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
2885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2886353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
2887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_canonical(self):
28891a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is canonical; otherwise return False.
28901a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista
28911a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        Currently, the encoding of a Decimal instance is always
28921a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        canonical, so this method returns True for any Decimal.
28931a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """
28941a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return True
2895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_finite(self):
28971a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is finite; otherwise return False.
2898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
28991a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        A Decimal instance is considered finite if it is neither
29001a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        infinite nor a NaN.
2901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
29021a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return not self._is_special
2903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_infinite(self):
29051a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is infinite; otherwise return False."""
29061a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp == 'F'
2907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_nan(self):
29091a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a qNaN or sNaN; otherwise return False."""
29101a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp in ('n', 'N')
2911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_normal(self, context=None):
29131a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a normal number; otherwise return False."""
29141a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        if self._is_special or not self:
29151a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista            return False
2916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
29181a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return context.Emin <= self.adjusted() <= context.Emax
2919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_qnan(self):
29211a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a quiet NaN; otherwise return False."""
29221a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp == 'n'
2923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_signed(self):
29251a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is negative; otherwise return False."""
29261a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._sign == 1
2927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_snan(self):
29291a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a signaling NaN; otherwise return False."""
29301a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp == 'N'
2931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_subnormal(self, context=None):
29331a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is subnormal; otherwise return False."""
29341a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        if self._is_special or not self:
29351a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista            return False
2936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
29381a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self.adjusted() < context.Emin
2939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_zero(self):
29411a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a zero; otherwise return False."""
294272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return not self._is_special and self._int == '0'
2943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _ln_exp_bound(self):
2945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compute a lower bound for the adjusted exponent of self.ln().
2946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        In other words, compute r such that self.ln() >= 10**r.  Assumes
2947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        that self is finite and positive and that self != 1.
2948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
2951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        adj = self._exp + len(self._int) - 1
2952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj >= 1:
2953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
2954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str(adj*23//10)) - 1
2955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj <= -2:
2956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # argument <= 0.1
2957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str((-1-adj)*23//10)) - 1
2958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
2959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        c, e = op.int, op.exp
2960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj == 0:
2961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # 1 < self < 10
2962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            num = str(c-10**-e)
2963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            den = str(c)
2964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(num) - len(den) - (num < den)
2965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adj == -1, 0.1 <= self < 1
2966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return e + len(str(10**-e - c)) - 1
2967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def ln(self, context=None):
2970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the natural (base e) logarithm of self."""
2971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(NaN) = NaN
2976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
2977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
2978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
2979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(0.0) == -Infinity
2981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
2982b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _NegativeInfinity
2983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(Infinity) = Infinity
2985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
2986b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Infinity
2987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(1.0) == 0.0
2989b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger        if self == _One:
2990b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Zero
2991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(negative) raises InvalidOperation
2993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 1:
2994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'ln of a negative value')
2996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # result is irrational, so necessarily inexact
2998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
2999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        c, e = op.int, op.exp
3000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        p = context.prec
3001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # correctly rounded result: repeatedly increase precision by 3
3003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # until we get an unambiguously roundable result
3004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        places = p - self._ln_exp_bound() + 2 # at least p+3 places
3005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while True:
3006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            coeff = _dlog(c, e, places)
3007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # assert len(str(abs(coeff)))-p >= 1
3008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                break
3010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            places += 3
301172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
3012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
3014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
3015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
3016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
3017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
3018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _log10_exp_bound(self):
3020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compute a lower bound for the adjusted exponent of self.log10().
3021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        In other words, find r such that self.log10() >= 10**r.
3022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Assumes that self is finite and positive and that self != 1.
3023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # For x >= 10 or x < 0.1 we only need a bound on the integer
3026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # part of log10(self), and this comes directly from the
3027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exponent of x.  For 0.1 <= x <= 10 we use the inequalities
3028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
3029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (1-1/x)/2.31 > 0.  If x < 1 then |log10(x)| > (1-x)/2.31 > 0
3030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        adj = self._exp + len(self._int) - 1
3032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj >= 1:
3033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self >= 10
3034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str(adj))-1
3035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj <= -2:
3036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self < 0.1
3037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str(-1-adj))-1
3038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
3039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        c, e = op.int, op.exp
3040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj == 0:
3041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # 1 < self < 10
3042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            num = str(c-10**-e)
3043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            den = str(231*c)
3044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(num) - len(den) - (num < den) + 2
3045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adj == -1, 0.1 <= self < 1
3046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        num = str(10**-e-c)
3047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return len(num) + e - (num < "231") - 1
3048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def log10(self, context=None):
3050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the base 10 logarithm of self."""
3051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(NaN) = NaN
3056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(0.0) == -Infinity
3061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
3062b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _NegativeInfinity
3063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(Infinity) = Infinity
3065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
3066b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Infinity
3067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(negative or -Infinity) raises InvalidOperation
3069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 1:
3070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
3071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'log10 of a negative value')
3072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(10**n) = n
307472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
3075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # answer may need rounding
3076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = Decimal(self._exp + len(self._int) - 1)
3077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result is irrational, so necessarily inexact
3079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op = _WorkRep(self)
3080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c, e = op.int, op.exp
3081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            p = context.prec
3082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # correctly rounded result: repeatedly increase precision
3084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # until result is unambiguously roundable
3085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            places = p-self._log10_exp_bound()+2
3086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
3087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                coeff = _dlog10(c, e, places)
3088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # assert len(str(abs(coeff)))-p >= 1
3089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
3091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                places += 3
309272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
3093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
3095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
3096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
3097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
3098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
3099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logb(self, context=None):
3101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """ Returns the exponent of the magnitude of self's MSD.
3102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the integer which is the exponent of the magnitude
3104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        of the most significant digit of self (as though it were truncated
3105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        to a single digit while maintaining the value of that digit and
3106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        without limiting the resulting exponent).
3107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # logb(NaN) = NaN
3109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # logb(+/-Inf) = +Inf
3117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
3118b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Infinity
3119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # logb(0) = -Inf, DivisionByZero
3121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
3122cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(DivisionByZero, 'logb(0)', 1)
3123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # otherwise, simply return the adjusted exponent of self, as a
3125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Decimal.  Note that no attempt is made to fit the result
3126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # into the current context.
3127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return Decimal(self.adjusted())
3128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _islogical(self):
3130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return True if self is a logical operand.
3131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3132c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling        For being logical, it must be a finite number with a sign of 0,
3133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        an exponent of 0, and a coefficient whose digits must all be
3134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        either 0 or 1.
3135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign != 0 or self._exp != 0:
3137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return False
3138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        for dig in self._int:
313972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            if dig not in '01':
3140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return False
3141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return True
3142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _fill_logical(self, context, opa, opb):
3144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        dif = context.prec - len(opa)
3145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if dif > 0:
314672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            opa = '0'*dif + opa
3147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif dif < 0:
3148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            opa = opa[-context.prec:]
3149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        dif = context.prec - len(opb)
3150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if dif > 0:
315172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            opb = '0'*dif + opb
3152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif dif < 0:
3153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            opb = opb[-context.prec:]
3154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return opa, opb
3155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_and(self, other, context=None):
3157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies an 'and' operation between self and other's digits."""
3158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._islogical() or not other._islogical():
3161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fill to context.prec
3164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (opa, opb) = self._fill_logical(context, self._int, other._int)
3165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # make the operation, and clean starting zeroes
316772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
316872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
3169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3170353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_invert(self, context=None):
3171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Invert all its digits."""
3172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
317472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
317572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                context)
3176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_or(self, other, context=None):
3178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies an 'or' operation between self and other's digits."""
3179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._islogical() or not other._islogical():
3182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fill to context.prec
3185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (opa, opb) = self._fill_logical(context, self._int, other._int)
3186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # make the operation, and clean starting zeroes
318865808ff0c08e60572cf81ebe5dc24794a706f390Mark Dickinson        result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)])
318972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
3190353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_xor(self, other, context=None):
3192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies an 'xor' operation between self and other's digits."""
3193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._islogical() or not other._islogical():
3196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fill to context.prec
3199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (opa, opb) = self._fill_logical(context, self._int, other._int)
3200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # make the operation, and clean starting zeroes
320265808ff0c08e60572cf81ebe5dc24794a706f390Mark Dickinson        result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)])
320372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
3204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def max_mag(self, other, context=None):
3206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
3207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
3208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
32096c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
32106c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
32116c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
3212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special or other._is_special:
3213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
3214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # number is always returned
3215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sn = self._isnan()
3216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            on = other._isnan()
3217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sn or on:
3218e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if on == 1 and sn == 0:
3219e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return self._fix(context)
3220e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if sn == 1 and on == 0:
3221e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return other._fix(context)
3222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._check_nans(other, context)
3223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
32242fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self.copy_abs()._cmp(other.copy_abs())
3225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == 0:
3226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
3227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
3229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = other
3230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
3232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3233e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
3234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def min_mag(self, other, context=None):
3236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
3237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
3238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
32396c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
32406c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
32416c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
3242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special or other._is_special:
3243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
3244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # number is always returned
3245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sn = self._isnan()
3246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            on = other._isnan()
3247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sn or on:
3248e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if on == 1 and sn == 0:
3249e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return self._fix(context)
3250e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if sn == 1 and on == 0:
3251e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return other._fix(context)
3252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._check_nans(other, context)
3253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
32542fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self.copy_abs()._cmp(other.copy_abs())
3255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == 0:
3256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
3257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
3259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
3260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = other
3262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3263e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
3264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_minus(self, context=None):
3266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the largest representable number smaller than itself."""
3267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == -1:
3275b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _NegativeInfinity
3276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
327772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, '9'*context.prec, context.Etop())
3278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context.copy()
3280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._set_rounding(ROUND_FLOOR)
3281353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._ignore_all_flags()
3282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        new_self = self._fix(context)
3283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if new_self != self:
3284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return new_self
328572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
328672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                            context)
3287353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_plus(self, context=None):
3289353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the smallest representable number larger than itself."""
3290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
3298b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Infinity
3299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == -1:
330072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(1, '9'*context.prec, context.Etop())
3301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context.copy()
3303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._set_rounding(ROUND_CEILING)
3304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._ignore_all_flags()
3305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        new_self = self._fix(context)
3306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if new_self != self:
3307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return new_self
330872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
330972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                            context)
3310353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_toward(self, other, context=None):
3312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the number closest to self, in the direction towards other.
3313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the closest representable number to self
3315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (excluding self) that is in the direction towards other,
3316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        unless both have the same value.  If the two operands are
3317353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        numerically equal, then the result is a copy of self with the
3318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        sign set to be the same as the sign of other.
3319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
3321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3323353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
33292fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        comparison = self._cmp(other)
3330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if comparison == 0:
333172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return self.copy_sign(other)
3332353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3333353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if comparison == -1:
3334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self.next_plus(context)
3335353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else: # comparison == 1
3336353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self.next_minus(context)
3337353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3338353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # decide which flags to raise using value of ans
3339353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans._isinfinity():
3340353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Overflow,
3341353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                 'Infinite result from next_toward',
3342353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                 ans._sign)
3343353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
3344353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
3345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif ans.adjusted() < context.Emin:
3346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Underflow)
3347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Subnormal)
3348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
3349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
3350353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # if precision == 1 then we don't raise Clamped for a
3351353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result 0E-Etiny.
3352353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not ans:
3353353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Clamped)
3354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3355353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
3356353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3357353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def number_class(self, context=None):
3358353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns an indication of the class of self.
3359353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3360353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The class is one of the following strings:
33610f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista          sNaN
33620f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista          NaN
3363353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Infinity
3364353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Normal
3365353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Subnormal
3366353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Zero
3367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Zero
3368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Subnormal
3369353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Normal
3370353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Infinity
3371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_snan():
3373353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "sNaN"
3374353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_qnan():
3375353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "NaN"
3376353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        inf = self._isinfinity()
3377353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if inf == 1:
3378353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "+Infinity"
3379353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if inf == -1:
3380353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "-Infinity"
3381353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_zero():
3382353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self._sign:
3383353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "-Zero"
3384353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
3385353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "+Zero"
3386353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3387353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3388353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_subnormal(context=context):
3389353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self._sign:
3390353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "-Subnormal"
3391353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
3392353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "+Subnormal"
3393353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # just a normal, regular, boring number, :)
3394353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign:
3395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "-Normal"
3396353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3397353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "+Normal"
3398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3399353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def radix(self):
3400353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Just returns 10, as this is Decimal, :)"""
3401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return Decimal(10)
3402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def rotate(self, other, context=None):
3404353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a rotated copy of self, value-of-other times."""
3405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3408353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3410353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3411353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3412353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._exp != 0:
3413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3414353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (-context.prec <= int(other) <= context.prec):
3415353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3416353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
34186c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3420353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # get values, pad if necessary
3421353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        torot = int(other)
3422353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotdig = self._int
3423353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        topad = context.prec - len(rotdig)
3424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if topad:
342572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            rotdig = '0'*topad + rotdig
3426353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3427353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # let's rotate!
3428353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotated = rotdig[torot:] + rotdig[:torot]
342972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(self._sign,
343072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                rotated.lstrip('0') or '0', self._exp)
3431353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3432353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def scaleb (self, other, context=None):
3433353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns self operand after adding the second value to its exp."""
3434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3441353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._exp != 0:
3442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3443353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        liminf = -2 * (context.Emax + context.prec)
3444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        limsup =  2 * (context.Emax + context.prec)
3445353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (liminf <= int(other) <= limsup):
3446353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
34496c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
345172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
3452353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        d = d._fix(context)
3453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return d
3454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def shift(self, other, context=None):
3456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a shifted copy of self, value-of-other times."""
3457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3460353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3462353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._exp != 0:
3465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3466353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (-context.prec <= int(other) <= context.prec):
3467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3468353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
34706c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # get values, pad if necessary
3473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        torot = int(other)
3474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not torot:
34756c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotdig = self._int
3477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        topad = context.prec - len(rotdig)
3478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if topad:
347972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            rotdig = '0'*topad + rotdig
3480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # let's shift!
3482353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if torot < 0:
3483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rotated = rotdig[:torot]
3484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
348572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            rotated = rotdig + '0'*torot
3486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rotated = rotated[-context.prec:]
3487353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
348872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(self._sign,
348972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                    rotated.lstrip('0') or '0', self._exp)
3490353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
349159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # Support for pickling, copy, and deepcopy
34927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __reduce__(self):
34937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (self.__class__, (str(self),))
34947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
34957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __copy__(self):
34967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
3497cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis            return self     # I'm immutable; therefore I am my own clone
34987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
34997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
35007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __deepcopy__(self, memo):
35017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
3502cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis            return self     # My components are also immutable
35037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
35047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3505277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    # PEP 3101 support.  the _localeconv keyword argument should be
3506277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    # considered private: it's provided for ease of testing only.
3507277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    def __format__(self, specifier, context=None, _localeconv=None):
3508f4da77765f8581e31620e9f49c68028e57b0ae85Mark Dickinson        """Format a Decimal instance according to the given specifier.
35091ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35101ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        The specifier should be a standard format specifier, with the
35111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        form described in PEP 3101.  Formatting types 'e', 'E', 'f',
3512277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        'F', 'g', 'G', 'n' and '%' are supported.  If the formatting
3513277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        type is omitted it defaults to 'g' or 'G', depending on the
3514277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        value of context.capitals.
35151ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        """
35161ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35171ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # Note: PEP 3101 says that if the type is not present then
35181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # there should be at least one digit after the decimal point.
35191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # We take the liberty of ignoring this requirement for
35201ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # Decimal---it's presumably there to make sure that
35211ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # format(float, '') behaves similarly to str(float).
35221ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if context is None:
35231ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            context = getcontext()
35241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
3525277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        spec = _parse_format_specifier(specifier, _localeconv=_localeconv)
35261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
3527277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        # special values don't care about the type or precision
35281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if self._is_special:
3529277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            sign = _format_sign(self._sign, spec)
3530277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            body = str(self.copy_abs())
3531277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            return _format_align(sign, body, spec)
35321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # a type of None defaults to 'g' or 'G', depending on context
35341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if spec['type'] is None:
35351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            spec['type'] = ['g', 'G'][context.capitals]
3536277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
3537277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        # if type is '%', adjust exponent of self accordingly
3538277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if spec['type'] == '%':
35391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            self = _dec_from_triple(self._sign, self._int, self._exp+2)
35401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # round if necessary, taking rounding mode from the context
35421ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        rounding = context.rounding
35431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        precision = spec['precision']
35441ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if precision is not None:
35451ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            if spec['type'] in 'eE':
35461ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                self = self._round(precision+1, rounding)
35471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            elif spec['type'] in 'fF%':
35481ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                self = self._rescale(-precision, rounding)
3549277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            elif spec['type'] in 'gG' and len(self._int) > precision:
3550277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson                self = self._round(precision, rounding)
35511ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # special case: zeros with a positive exponent can't be
35521ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # represented in fixed point; rescale them to 0e0.
3553277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if not self and self._exp > 0 and spec['type'] in 'fF%':
35541ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            self = self._rescale(0, rounding)
35551ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35561ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # figure out placement of the decimal point
35571ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        leftdigits = self._exp + len(self._int)
3558277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if spec['type'] in 'eE':
35591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            if not self and precision is not None:
35601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = 1 - precision
35611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            else:
35621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = 1
3563277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        elif spec['type'] in 'fF%':
3564277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            dotplace = leftdigits
35651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif spec['type'] in 'gG':
35661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            if self._exp <= 0 and leftdigits > -6:
35671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = leftdigits
35681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            else:
35691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = 1
35701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
3571277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        # find digits before and after decimal point, and get exponent
3572277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if dotplace < 0:
3573277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            intpart = '0'
3574277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            fracpart = '0'*(-dotplace) + self._int
3575277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        elif dotplace > len(self._int):
3576277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            intpart = self._int + '0'*(dotplace-len(self._int))
3577277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            fracpart = ''
35781ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        else:
3579277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            intpart = self._int[:dotplace] or '0'
3580277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            fracpart = self._int[dotplace:]
3581277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        exp = leftdigits-dotplace
35821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
3583277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        # done with the decimal-specific stuff;  hand over the rest
3584277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        # of the formatting to the _format_number function
3585277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        return _format_number(self._sign, intpart, fracpart, exp, spec)
35861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
358772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batistadef _dec_from_triple(sign, coefficient, exponent, special=False):
358872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    """Create a decimal instance directly, without any validation,
358972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    normalization (e.g. removal of leading zeros) or argument
359072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    conversion.
359172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
359272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    This function is for *internal use only*.
359372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    """
359472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
359572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self = object.__new__(Decimal)
359672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._sign = sign
359772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._int = coefficient
359872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._exp = exponent
359972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._is_special = special
360072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
360172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    return self
360272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
36032c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger# Register Decimal as a kind of Number (an abstract base class).
36042c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger# However, do not register it as Real (because Decimals are not
36052c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger# interoperable with floats).
36062c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger_numbers.Number.register(Decimal)
36072c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger
36082c8585b0afb6a39c215a71963e2fadea96f2c6aeRaymond Hettinger
360959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Context class #######################################################
3610cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
36117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3612cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis# get rounding method function:
361359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batistarounding_functions = [name for name in Decimal.__dict__.keys()
361459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                                    if name.startswith('_round_')]
36157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerfor name in rounding_functions:
361659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
36177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    globalname = name[1:].upper()
36187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    val = globals()[globalname]
36197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Decimal._pick_rounding_function[val] = name
36207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettingerdel name, val, globalname, rounding_functions
36227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3623ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlanclass _ContextManager(object):
36248b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """Context manager class to support localcontext().
36251a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
3626ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan      Sets a copy of the supplied context in __enter__() and restores
36278b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan      the previous decimal context in __exit__()
36288b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """
36291a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __init__(self, new_context):
3630ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan        self.new_context = new_context.copy()
36311a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __enter__(self):
36321a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        self.saved_context = getcontext()
36331a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        setcontext(self.new_context)
36341a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        return self.new_context
36351a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __exit__(self, t, v, tb):
36361a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        setcontext(self.saved_context)
36371a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
36387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Context(object):
36397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Contains the context for a Decimal instance.
36407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Contains:
36427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    prec - precision (for use in rounding, division, square roots..)
364359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    rounding - rounding type (how you round)
3644bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger    traps - If traps[exception] = 1, then the exception is
36457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    raised when it is caused.  Otherwise, a value is
36467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    substituted in.
36471840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson    flags  - When an exception is caused, flags[exception] is set.
36487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             (Whether or not the trap_enabler is set)
36497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             Should be reset by user of Decimal instance.
36500ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emin -   Minimum exponent
36510ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emax -   Maximum exponent
36527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    capitals -      If 1, 1*10^1 is printed as 1E+1.
36537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    If 0, printed as 1e1
3654e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger    _clamp - If 1, change exponents if too high (Default 0)
36557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
36569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger
36577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, prec=None, rounding=None,
3658abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger                 traps=None, flags=None,
36590ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                 Emin=None, Emax=None,
3660e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger                 capitals=None, _clamp=0,
3661abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger                 _ignored_flags=None):
3662abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger        if flags is None:
3663abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger            flags = []
3664abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger        if _ignored_flags is None:
3665abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger            _ignored_flags = []
3666bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not isinstance(flags, dict):
366771f3b85497f25bad3b00555173c51378f64edbb5Mark Dickinson            flags = dict([(s, int(s in flags)) for s in _signals])
3668b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
3669bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if traps is not None and not isinstance(traps, dict):
367071f3b85497f25bad3b00555173c51378f64edbb5Mark Dickinson            traps = dict([(s, int(s in traps)) for s in _signals])
3671b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
36727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for name, val in locals().items():
36737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if val is None:
3674eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettinger                setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
36757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
36767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                setattr(self, name, val)
36777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        del self.self
36787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3679b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger    def __repr__(self):
3680bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        """Show the current context."""
3681b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        s = []
368259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
368359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
368459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                 % vars(self))
368559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        names = [f.__name__ for f, v in self.flags.items() if v]
368659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        s.append('flags=[' + ', '.join(names) + ']')
368759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        names = [t.__name__ for t, v in self.traps.items() if v]
368859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        s.append('traps=[' + ', '.join(names) + ']')
3689b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        return ', '.join(s) + ')'
3690b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger
3691d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger    def clear_flags(self):
3692d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        """Reset all flags to zero"""
3693d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        for flag in self.flags:
3694b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger            self.flags[flag] = 0
3695d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger
36969fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def _shallow_copy(self):
36979fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a shallow copy from self."""
3698e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        nc = Context(self.prec, self.rounding, self.traps,
3699e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.flags, self.Emin, self.Emax,
3700e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.capitals, self._clamp, self._ignored_flags)
37017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return nc
37029fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger
37039fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def copy(self):
37049fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a deep copy from self."""
370559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        nc = Context(self.prec, self.rounding, self.traps.copy(),
3706e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.flags.copy(), self.Emin, self.Emax,
3707e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.capitals, self._clamp, self._ignored_flags)
37089fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        return nc
37099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    __copy__ = copy
37107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37115aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    def _raise_error(self, condition, explanation = None, *args):
37127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Handles an error
37137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the flag is in _ignored_flags, returns the default response.
37151840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson        Otherwise, it sets the flag, then, if the corresponding
37167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        trap_enabler is set, it reaises the exception.  Otherwise, it returns
37171840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson        the default value after setting the flag.
37187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
37195aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        error = _condition_map.get(condition, condition)
37207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if error in self._ignored_flags:
372159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # Don't touch the flag
37227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return error().handle(self, *args)
37237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37241840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson        self.flags[error] = 1
3725bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not self.traps[error]:
372659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # The errors define how to handle themselves.
37275aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger            return condition().handle(self, *args)
37287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Errors should only be risked on copies of the context
373059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # self._ignored_flags = []
37318aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson        raise error(explanation)
37327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_all_flags(self):
37347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore all flags, if they are raised"""
3735fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger        return self._ignore_flags(*_signals)
37367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_flags(self, *flags):
37387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore the flags, if they are raised"""
37397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Do not mutate-- This way, copies of a context leave the original
37407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # alone.
37417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self._ignored_flags = (self._ignored_flags + list(flags))
37427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return list(flags)
37437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _regard_flags(self, *flags):
37457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Stop ignoring the flags, if they are raised"""
37467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if flags and isinstance(flags[0], (tuple,list)):
37477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            flags = flags[0]
37487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for flag in flags:
37497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._ignored_flags.remove(flag)
37507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
375153663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan    # We inherit object.__hash__, so we must deny this explicitly
375253663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan    __hash__ = None
37535aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger
37547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etiny(self):
37557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns Etiny (= Emin - prec + 1)"""
37567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emin - self.prec + 1)
37577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etop(self):
3759e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """Returns maximum exponent (= Emax - prec + 1)"""
37607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emax - self.prec + 1)
37617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _set_rounding(self, type):
37637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Sets the rounding type.
37647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Sets the rounding type, and returns the current (previous)
37667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding type.  Often used like:
37677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context = context.copy()
37697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # so you don't change the calling context
37707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # if an error occurs in the middle.
37717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_UP)
37727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = self.__sub__(other, context=context)
37737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding(rounding)
37747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This will make it round up for that operation.
37767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
37777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = self.rounding
37787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.rounding= type
37797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rounding
37807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3781fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger    def create_decimal(self, num='0'):
378259bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        """Creates a new Decimal instance but using self as context.
378359bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson
378459bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        This method implements the to-number operation of the
378559bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        IBM Decimal specification."""
378659bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson
378759bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        if isinstance(num, basestring) and num != num.strip():
378859bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson            return self._raise_error(ConversionSyntax,
378959bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson                                     "no trailing or leading whitespace is "
379059bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson                                     "permitted.")
379159bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson
37927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        d = Decimal(num, context=self)
3793353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if d._isnan() and len(d._int) > self.prec - self._clamp:
3794353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._raise_error(ConversionSyntax,
3795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                     "diagnostic info too long in NaN")
3796dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        return d._fix(self)
37977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3798f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger    def create_decimal_from_float(self, f):
3799f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        """Creates a new Decimal instance from a float but rounding using self
3800f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        as the context.
3801f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
3802f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> context = Context(prec=5, rounding=ROUND_DOWN)
3803f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> context.create_decimal_from_float(3.1415926535897932)
3804f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Decimal('3.1415')
3805f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> context = Context(prec=5, traps=[Inexact])
3806f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> context.create_decimal_from_float(3.1415926535897932)
3807f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Traceback (most recent call last):
3808f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger            ...
3809f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Inexact: None
3810f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
3811f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        """
3812f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        d = Decimal.from_float(f)       # An exact conversion
3813f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        return d._fix(self)             # Apply the context rounding
3814f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
381559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # Methods
38167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def abs(self, a):
38177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of the operand.
38187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the operand is negative, the result is the same as using the minus
382059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation on the operand.  Otherwise, the result is the same as using
38217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the plus operation on the operand.
38227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('2.1'))
3824abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
38259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-100'))
3826abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
38279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('101.5'))
3828abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('101.5')
38299ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-101.5'))
3830abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('101.5')
38317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
38327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__abs__(context=self)
38337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def add(self, a, b):
38357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the sum of the two operands.
38367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38379ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
3838abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('19.00')
38399ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
3840abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.02E+4')
38417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
38427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__add__(b, context=self)
38437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _apply(self, a):
3845dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        return str(a._fix(self))
38467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def canonical(self, a):
3848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the same Decimal object.
3849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        As we do not have different encodings for the same number, the
3851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        received object already is in its canonical form.
3852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.canonical(Decimal('2.50'))
3854abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.50')
3855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.canonical(context=self)
3857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
38587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, a, b):
38597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares values numerically.
38607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the signs of the operands differ, a value representing each operand
38627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ('-1' if the operand is less than zero, '0' if the operand is zero or
38637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negative zero, or '1' if the operand is greater than zero) is used in
38647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        place of that operand for the comparison instead of the actual
38657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operand.
38667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The comparison is then effected by subtracting the second operand from
38687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the first and then returning a value according to the result of the
38697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        subtraction: '-1' if the result is less than zero, '0' if the result is
38707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        zero or negative zero, or '1' if the result is greater than zero.
38717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
3873abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
38749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
3875abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
38769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
3877abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
38789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
3879abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
38809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
3881abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
38829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
3883abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
38847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
38857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.compare(b, context=self)
38867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_signal(self, a, b):
3888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values of the two operands numerically.
3889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        It's pretty much like compare(), but all NaNs signal, with signaling
3891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        NaNs taking precedence over quiet NaNs.
3892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext
3894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
3895abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
3897abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
3898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.flags[InvalidOperation] = 0
3899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        0
3901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
3902abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
3903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        1
3905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.flags[InvalidOperation] = 0
3906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        0
3908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
3909abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
3910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        1
3912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.compare_signal(b, context=self)
3914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total(self, a, b):
3916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares two operands using their abstract representation.
3917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        This is not like the standard compare, which use their numerical
3919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value. Note that a total ordering is defined for all possible abstract
3920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        representations.
3921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
3923abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('-127'),  Decimal('12'))
3925abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
3927abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
3929abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
3930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('12.300'))
3931abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
3932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('NaN'))
3933abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.compare_total(b)
3936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total_mag(self, a, b):
3938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares two operands using their abstract representation ignoring sign.
3939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Like compare_total, but with operand's sign ignored and assumed to be 0.
3941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.compare_total_mag(b)
3943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_abs(self, a):
3945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy of the operand with the sign set to 0.
3946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_abs(Decimal('2.1'))
3948abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
3949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_abs(Decimal('-100'))
3950abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
3951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.copy_abs()
3953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_decimal(self, a):
3955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy of the decimal objet.
3956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_decimal(Decimal('2.1'))
3958abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
3959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
3960abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00')
3961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
39626c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        return Decimal(a)
3963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_negate(self, a):
3965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy of the operand with the sign inverted.
3966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_negate(Decimal('101.5'))
3968abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-101.5')
3969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_negate(Decimal('-101.5'))
3970abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('101.5')
3971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.copy_negate()
3973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_sign(self, a, b):
3975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Copies the second operand's sign to the first one.
3976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        In detail, it returns a copy of the first operand with the sign
3978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        equal to the sign of the second operand.
3979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
3981abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.50')
3982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
3983abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.50')
3984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
3985abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.50')
3986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
3987abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.50')
3988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.copy_sign(b)
3990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
39917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide(self, a, b):
39927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Decimal division in a specified context.
39937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
39949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
3995abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.333333333')
39969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
3997abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.666666667')
39989ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
3999abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.5')
40009ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
4001abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.1')
40029ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
4003abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
40049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
4005abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('4.00')
40069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
4007abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.20')
40089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
4009abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
40109ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
4011abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1000')
40129ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
4013abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.20E+6')
40147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
40157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__div__(b, context=self)
40167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
40177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide_int(self, a, b):
40187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Divides two numbers and returns the integer part of the result.
40197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
40209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
4021abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
40229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
4023abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
40249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
4025abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
40267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
40277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__floordiv__(b, context=self)
40287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
40297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divmod(self, a, b):
40307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__divmod__(b, context=self)
40317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def exp(self, a):
4033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns e ** a.
4034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('-Infinity'))
4039abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('-1'))
4041abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.367879441')
4042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('0'))
4043abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('1'))
4045abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.71828183')
4046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('0.693147181'))
4047abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.00000000')
4048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('+Infinity'))
4049abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.exp(context=self)
4052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def fma(self, a, b, c):
4054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a multiplied by b, plus c.
4055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The first two operands are multiplied together, using multiply,
4057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the third operand is then added to the result of that
4058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        multiplication, using add, all with only one final rounding.
4059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
4061abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('22')
4062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
4063abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-8')
4064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
4065abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.38435736E+12')
4066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.fma(b, c, context=self)
4068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_canonical(self, a):
40701a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is canonical; otherwise return False.
40711a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista
40721a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        Currently, the encoding of a Decimal instance is always
40731a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        canonical, so this method returns True for any Decimal.
4074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_canonical(Decimal('2.50'))
40761a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
40781a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return a.is_canonical()
4079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_finite(self, a):
40811a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is finite; otherwise return False.
4082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
40831a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        A Decimal instance is considered finite if it is neither
40841a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        infinite nor a NaN.
4085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('2.50'))
40871a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('-0.3'))
40891a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('0'))
40911a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('Inf'))
40931a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('NaN'))
40951a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_finite()
4098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_infinite(self, a):
41001a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is infinite; otherwise return False.
4101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_infinite(Decimal('2.50'))
41031a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_infinite(Decimal('-Inf'))
41051a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_infinite(Decimal('NaN'))
41071a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_infinite()
4110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_nan(self, a):
41121a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a qNaN or sNaN;
41131a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        otherwise return False.
4114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_nan(Decimal('2.50'))
41161a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_nan(Decimal('NaN'))
41181a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_nan(Decimal('-sNaN'))
41201a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_nan()
4123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_normal(self, a):
41251a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a normal number;
41261a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        otherwise return False.
4127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('2.50'))
41321a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('0.1E-999'))
41341a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('0.00'))
41361a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('-Inf'))
41381a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('NaN'))
41401a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_normal(context=self)
4143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_qnan(self, a):
41451a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a quiet NaN; otherwise return False.
4146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_qnan(Decimal('2.50'))
41481a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_qnan(Decimal('NaN'))
41501a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_qnan(Decimal('sNaN'))
41521a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_qnan()
4155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_signed(self, a):
41571a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is negative; otherwise return False.
4158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_signed(Decimal('2.50'))
41601a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_signed(Decimal('-12'))
41621a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_signed(Decimal('-0'))
41641a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_signed()
4167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_snan(self, a):
41691a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a signaling NaN;
41701a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        otherwise return False.
4171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_snan(Decimal('2.50'))
41731a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_snan(Decimal('NaN'))
41751a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_snan(Decimal('sNaN'))
41771a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_snan()
4180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_subnormal(self, a):
41821a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is subnormal; otherwise return False.
4183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('2.50'))
41881a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('0.1E-999'))
41901a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('0.00'))
41921a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('-Inf'))
41941a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('NaN'))
41961a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_subnormal(context=self)
4199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_zero(self, a):
42011a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a zero; otherwise return False.
4202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_zero(Decimal('0'))
42041a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_zero(Decimal('2.50'))
42061a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_zero(Decimal('-0E+2'))
42081a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_zero()
4211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def ln(self, a):
4213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the natural (base e) logarithm of the operand.
4214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('0'))
4219abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('1.000'))
4221abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('2.71828183'))
4223abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.00000000')
4224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('10'))
4225abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.30258509')
4226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('+Infinity'))
4227abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.ln(context=self)
4230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def log10(self, a):
4232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the base 10 logarithm of the operand.
4233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('0'))
4238abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('0.001'))
4240abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-3')
4241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('1.000'))
4242abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('2'))
4244abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.301029996')
4245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('10'))
4246abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('70'))
4248abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.84509804')
4249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('+Infinity'))
4250abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.log10(context=self)
4253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logb(self, a):
4255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """ Returns the exponent of the magnitude of the operand's MSD.
4256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the integer which is the exponent of the magnitude
4258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        of the most significant digit of the operand (as though the
4259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        operand were truncated to a single digit while maintaining the
4260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value of that digit and without limiting the resulting exponent).
4261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('250'))
4263abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
4264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('2.50'))
4265abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('0.03'))
4267abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-2')
4268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('0'))
4269abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logb(context=self)
4272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_and(self, a, b):
4274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies the logical operation 'and' between each operand's digits.
4275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operands must be both logical numbers.
4277353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
4279abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
4281abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
4283abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
4285abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
4287abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1000')
4288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
4289abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
4290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_and(b, context=self)
4292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_invert(self, a):
4294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Invert all the digits in the operand.
4295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operand must be a logical number.
4297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('0'))
4299abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('111111111')
4300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('1'))
4301abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('111111110')
4302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('111111111'))
4303abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('101010101'))
4305abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10101010')
4306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_invert(context=self)
4308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4309353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_or(self, a, b):
4310353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies the logical operation 'or' between each operand's digits.
4311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operands must be both logical numbers.
4313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
4315abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
4317abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
4319abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
4321abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
4323abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1110')
4324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
4325abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1110')
4326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_or(b, context=self)
4328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4329353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_xor(self, a, b):
4330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies the logical operation 'xor' between each operand's digits.
4331353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4332353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operands must be both logical numbers.
4333353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
4335abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4336353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
4337abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4338353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
4339abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4340353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
4341abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4342353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
4343abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('110')
4344353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
4345abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1101')
4346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_xor(b, context=self)
4348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
43497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, a,b):
43507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """max compares two values numerically and returns the maximum.
43517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
4353c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling        Otherwise, the operands are compared as though by the compare
435459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation.  If they are numerically equal then the left-hand operand
435559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        is chosen as the result.  Otherwise the maximum (closer to positive
43567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
43577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
4359abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
43609ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
4361abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
43629ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
4363abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4364d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
4365abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7')
43667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
43677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.max(b, context=self)
43687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4369353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def max_mag(self, a, b):
4370353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
4371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.max_mag(b, context=self)
4372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
43737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, a,b):
43747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """min compares two values numerically and returns the minimum.
43757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
4377c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling        Otherwise, the operands are compared as though by the compare
437859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation.  If they are numerically equal then the left-hand operand
437959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        is chosen as the result.  Otherwise the minimum (closer to negative
43807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
43817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
4383abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
43849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
4385abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-10')
43869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
4387abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
4388d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
4389abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7')
43907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
43917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.min(b, context=self)
43927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4393353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def min_mag(self, a, b):
4394353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
4395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.min_mag(b, context=self)
4396353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
43977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def minus(self, a):
43987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Minus corresponds to unary prefix minus in Python.
43997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as subtract; the
44017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation minus(a) is calculated as subtract('0', a) where the '0'
44027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
44037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('1.3'))
4405abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.3')
44069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('-1.3'))
4407abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.3')
44087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
44097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__neg__(context=self)
44107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def multiply(self, a, b):
44127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """multiply multiplies two operands.
44137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4414cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        If either operand is a special value then the general rules apply.
4415cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        Otherwise, the operands are multiplied together ('long multiplication'),
4416cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        resulting in a number which may be as long as the sum of the lengths
4417cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        of the two operands.
44187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
4420abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.60')
44219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
4422abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('21')
44239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
4424abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.72')
44259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
4426abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.0')
44279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
4428abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('4.28135971E+11')
44297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
44307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mul__(b, context=self)
44317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4432353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_minus(self, a):
4433353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the largest representable number smaller than a.
4434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_minus(Decimal('1'))
4439abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.999999999')
4440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_minus(Decimal('1E-1007'))
4441abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0E-1007')
4442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
4443abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000004')
4444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_minus(Decimal('Infinity'))
4445abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('9.99999999E+999')
4446353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.next_minus(context=self)
4448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_plus(self, a):
4450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the smallest representable number larger than a.
4451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4452353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_plus(Decimal('1'))
4456abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.00000001')
4457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_plus(Decimal('-1E-1007'))
4458abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0E-1007')
4459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
4460abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000002')
4461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_plus(Decimal('-Infinity'))
4462abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-9.99999999E+999')
4463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.next_plus(context=self)
4465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4466353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_toward(self, a, b):
4467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the number closest to a, in direction towards b.
4468353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the closest representable number from the first
4470353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        operand (but not the first operand) that is in the direction
4471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        towards the second operand, unless the operands have the same
4472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value.
4473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('1'), Decimal('2'))
4478abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.00000001')
4479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
4480abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0E-1007')
4481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
4482abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000002')
4483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('1'), Decimal('0'))
4484abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.999999999')
4485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
4486abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0E-1007')
4487353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
4488abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000004')
4489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
4490abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.00')
4491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4492353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.next_toward(b, context=self)
4493353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
44947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def normalize(self, a):
4495e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """normalize reduces an operand to its simplest form.
44967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Essentially a plus operation with all trailing zeros removed from the
44987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.
44997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45009ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('2.1'))
4501abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
45029ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-2.0'))
4503abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-2')
45049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('1.200'))
4505abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.2')
45069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-120'))
4507abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.2E+2')
45089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('120.00'))
4509abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.2E+2')
45109ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('0.00'))
4511abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
45127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
45137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.normalize(context=self)
45147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4515353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def number_class(self, a):
4516353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns an indication of the class of the operand.
4517353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4518353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The class is one of the following strings:
4519353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -sNaN
4520353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -NaN
4521353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Infinity
4522353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Normal
4523353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Subnormal
4524353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Zero
4525353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Zero
4526353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Subnormal
4527353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Normal
4528353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Infinity
4529353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4530353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = Context(ExtendedContext)
4531353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4532353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4533353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('Infinity'))
4534353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Infinity'
4535353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('1E-10'))
4536353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Normal'
4537353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('2.50'))
4538353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Normal'
4539353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('0.1E-999'))
4540353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Subnormal'
4541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('0'))
4542353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Zero'
4543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-0'))
4544353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Zero'
4545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-0.1E-999'))
4546353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Subnormal'
4547353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-1E-10'))
4548353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Normal'
4549353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-2.50'))
4550353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Normal'
4551353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-Infinity'))
4552353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Infinity'
4553353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('NaN'))
4554353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'NaN'
4555353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-NaN'))
4556353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'NaN'
4557353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('sNaN'))
4558353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'sNaN'
4559353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4560353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.number_class(context=self)
4561353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
45627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def plus(self, a):
45637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Plus corresponds to unary prefix plus in Python.
45647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as add; the
45667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation plus(a) is calculated as add('0', a) where the '0'
45677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
45687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('1.3'))
4570abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.3')
45719ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('-1.3'))
4572abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.3')
45737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
45747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pos__(context=self)
45757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def power(self, a, b, modulo=None):
45777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Raises a to the power of b, to modulo if given.
45787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4579353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With two arguments, compute a**b.  If a is negative then b
4580353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        must be integral.  The result will be inexact unless b is
4581353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        integral and the result is finite and can be expressed exactly
4582353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        in 'precision' digits.
4583353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4584353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With three arguments, compute (a**b) % modulo.  For the
4585353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        three argument form, the following restrictions on the
4586353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        arguments hold:
4587353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4588353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - all three arguments must be integral
4589353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - b must be nonnegative
4590353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - at least one of a or b must be nonzero
4591353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - modulo must be nonzero and have at most 'precision' digits
4592353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4593353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result of pow(a, b, modulo) is identical to the result
4594353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        that would be obtained by computing (a**b) % modulo with
4595353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        unbounded precision, but is computed more efficiently.  It is
4596353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        always exact.
4597353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4598353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4599353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4600353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4601353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('2'), Decimal('3'))
4602abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('8')
4603353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-2'), Decimal('3'))
4604abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-8')
4605353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('2'), Decimal('-3'))
4606abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.125')
4607353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('1.7'), Decimal('8'))
4608abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('69.7575744')
4609353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('10'), Decimal('0.301029996'))
4610abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.00000000')
4611353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('Infinity'), Decimal('-1'))
4612abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4613353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('Infinity'), Decimal('0'))
4614abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4615353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('Infinity'), Decimal('1'))
4616abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4617353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('-1'))
4618abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
4619353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('0'))
4620abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4621353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('1'))
4622abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4623353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('2'))
4624abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4625353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('0'), Decimal('0'))
4626abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
4627353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4628353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
4629abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('11')
4630353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
4631abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-11')
4632353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
4633abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4634353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
4635abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('11')
4636353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
4637abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('11729830')
4638353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
4639abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
4640353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
4641abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
46427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
46437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pow__(b, modulo, context=self)
46447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def quantize(self, a, b):
464659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
46477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The coefficient of the result is derived from that of the left-hand
464959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operand.  It may be rounded using the current rounding setting (if the
46507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exponent is being increased), multiplied by a positive power of ten (if
46517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the exponent is being decreased), or is unchanged (if the exponent is
46527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        already equal to that of the right-hand operand).
46537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Unlike other operations, if the length of the coefficient after the
46557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        quantize operation would be greater than precision then an Invalid
465659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation condition is raised.  This guarantees that, unless there is
465759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        an error condition, the exponent of the result of a quantize is always
46587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        equal to that of the right-hand operand.
46597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Also unlike other operations, quantize will never raise Underflow, even
46617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if the result is subnormal and inexact.
46627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46639ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
4664abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.170')
46659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
4666abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.17')
46679ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
4668abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.2')
46699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
4670abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
46719ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
4672abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0E+1')
46739ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
4674abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
46759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
4676abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
46779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
4678abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
46799ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
4680abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0E+5')
46819ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
4682abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
46839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
4684abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
46859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
4686abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('217.0')
46879ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
4688abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('217')
46899ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
4690abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.2E+2')
46919ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
4692abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2E+2')
46937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
46947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.quantize(b, context=self)
46957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4696353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def radix(self):
4697353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Just returns 10, as this is Decimal, :)
4698353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.radix()
4700abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
4701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4702353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return Decimal(10)
4703353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
47047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder(self, a, b):
47057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the remainder from integer division.
47067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is the residue of the dividend after the operation of
470859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        calculating integer division as described for divide-integer, rounded
47090d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz        to precision digits if necessary.  The sign of the result, if
471059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        non-zero, is the same as that of the original dividend.
47117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
47137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
47147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
47157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47169ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
4717abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
47189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
4719abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
47209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
4721abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
47229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
4723abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.2')
47249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
4725abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.1')
47269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
4727abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
47287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
47297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mod__(b, context=self)
47307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, a, b):
47327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns to be "a - b * n", where n is the integer nearest the exact
47337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        value of "x / b" (if two integers are equally near then the even one
473459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        is chosen).  If the result is equal to 0 then its sign will be the
47357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign of a.
47367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
47387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
47397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
47407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47419ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
4742abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.9')
47439ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
4744abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-2')
47459ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
4746abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
47479ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
4748abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
47499ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
4750abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.2')
47519ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
4752abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.1')
47539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
4754abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.3')
47557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
47567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.remainder_near(b, context=self)
47577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4758353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def rotate(self, a, b):
4759353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a rotated copy of a, b times.
4760353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The coefficient of the result is a rotated copy of the digits in
4762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the coefficient of the first operand.  The number of places of
4763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotation is taken from the absolute value of the second operand,
4764353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        with the rotation being to the left if the second operand is
4765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        positive or to the right otherwise.
4766353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
4768abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('400000003')
4769353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
4770abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('12')
4771353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
4772abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('891234567')
4773353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
4774abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('123456789')
4775353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
4776abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('345678912')
4777353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4778353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.rotate(b, context=self)
4779353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
47807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, a, b):
47817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns True if the two operands have the same exponent.
47827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is never affected by either the sign or the coefficient of
47847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        either operand.
47857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
47877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
47889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
47897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
47909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
47917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
47929ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
47937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
47947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
47957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.same_quantum(b)
47967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def scaleb (self, a, b):
4798353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the first operand after adding the second value its exp.
4799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
4801abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.0750')
4802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
4803abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.50')
4804353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
4805abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.50E+3')
4806353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4807353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.scaleb (b, context=self)
4808353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def shift(self, a, b):
4810353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a shifted copy of a, b times.
4811353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4812353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The coefficient of the result is a shifted copy of the digits
4813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        in the coefficient of the first operand.  The number of places
4814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        to shift is taken from the absolute value of the second operand,
4815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        with the shift being to the left if the second operand is
4816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        positive or to the right otherwise.  Digits shifted into the
4817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        coefficient are zeros.
4818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
4820abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('400000000')
4821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
4822abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
4824abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1234567')
4825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
4826abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('123456789')
4827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
4828abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('345678900')
4829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.shift(b, context=self)
4831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
48327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def sqrt(self, a):
483359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        """Square root of a non-negative number to context precision.
48347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the result must be inexact, it is rounded using the round-half-even
48367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        algorithm.
48377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0'))
4839abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
48409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('-0'))
4841abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
48429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0.39'))
4843abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.624499800')
48449ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('100'))
4845abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
48469ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1'))
4847abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
48489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.0'))
4849abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
48509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.00'))
4851abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
48529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('7'))
4853abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.64575131')
48549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('10'))
4855abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.16227766')
48569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.prec
48576ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        9
48587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.sqrt(context=self)
48607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def subtract(self, a, b):
4862f33d01d304c349a7f555779c7c99930f1203adb7Georg Brandl        """Return the difference between the two operands.
48637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48649ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
4865abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.23')
48669ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
4867abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.00')
48689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
4869abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.77')
48707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__sub__(b, context=self)
48727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, a):
48747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
48757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
48777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.to_eng_string(context=self)
48797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_sci_string(self, a):
48817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
48827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
48847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__str__(context=self)
48867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_exact(self, a):
4888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds to an integer.
4889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        When the operand has a negative exponent, the result is the same
4891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        as using the quantize() operation using the given operand as the
4892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
4893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        of the operand as the precision setting; Inexact and Rounded flags
4894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        are allowed in this operation.  The rounding mode is taken from the
4895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.
4896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
4898abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
4899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('100'))
4900abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
4902abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
4904abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('102')
4905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
4906abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-102')
4907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
4908abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0E+6')
4909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
4910abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.89E+77')
4911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
4912abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.to_integral_exact(context=self)
4915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_value(self, a):
49177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds to an integer.
49187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        When the operand has a negative exponent, the result is the same
49207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        as using the quantize() operation using the given operand as the
49217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
49227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        of the operand as the precision setting, except that no flags will
492359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        be set.  The rounding mode is taken from the context.
49247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('2.1'))
4926abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
4927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('100'))
4928abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('100.0'))
4930abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('101.5'))
4932abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('102')
4933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
4934abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-102')
4935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
4936abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0E+6')
4937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
4938abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.89E+77')
4939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
4940abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
49417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
4942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.to_integral_value(context=self)
4943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # the method name changed, but we provide also the old one, for compatibility
4945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    to_integral = to_integral_value
49467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass _WorkRep(object):
49487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __slots__ = ('sign','int','exp')
494917931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger    # sign: 0 or 1
4950636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # int:  int or long
49517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # exp:  None, int, or string
49527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, value=None):
49547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if value is None:
49557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = None
4956636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self.int = 0
49577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = None
495817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        elif isinstance(value, Decimal):
495917931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            self.sign = value._sign
496072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self.int = int(value._int)
49617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value._exp
496217931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        else:
496317931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            # assert isinstance(value, tuple)
49647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = value[0]
49657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int = value[1]
49667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value[2]
49677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
49697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
49707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __str__ = __repr__
49727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4975e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batistadef _normalize(op1, op2, prec = 0):
49767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Normalizes op1, op2 to have the same exp and length of coefficient.
49777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Done during addition.
49797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
4980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if op1.exp < op2.exp:
49817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op2
49827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op1
49837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
49847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op1
49857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op2
49867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
4988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Then adding 10**exp to tmp has the same effect (after rounding)
4989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # as adding any positive quantity smaller than 10**exp; similarly
4990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # for subtraction.  So if other is smaller than 10**exp we replace
4991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # it with 10**exp.  This avoids tmp.exp - other.exp getting too large.
4992e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    tmp_len = len(str(tmp.int))
4993e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    other_len = len(str(other.int))
4994e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    exp = tmp.exp + min(-1, tmp_len - prec - 2)
4995e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    if other_len + other.exp - 1 < exp:
4996e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        other.int = 1
4997e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        other.exp = exp
4998636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
4999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    tmp.int *= 10 ** (tmp.exp - other.exp)
5000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    tmp.exp = other.exp
50017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return op1, op2
50027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
5004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# This function from Tim Peters was taken from here:
5006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# http://mail.python.org/pipermail/python-list/1999-July/007758.html
5007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# The correction being in the function definition is for speed, and
5008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# the whole function is not resolved with math.log because of avoiding
5009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# the use of floats.
5010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _nbits(n, correction = {
5011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '0': 4, '1': 3, '2': 2, '3': 2,
5012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '4': 1, '5': 1, '6': 1, '7': 1,
5013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '8': 0, '9': 0, 'a': 0, 'b': 0,
5014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'c': 0, 'd': 0, 'e': 0, 'f': 0}):
5015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Number of bits in binary representation of the positive integer n,
5016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    or 0 if n == 0.
5017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if n < 0:
5019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise ValueError("The argument to _nbits should be nonnegative.")
5020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    hex_n = "%x" % n
5021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return 4*len(hex_n) - correction[hex_n[0]]
5022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _sqrt_nearest(n, a):
5024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Closest integer to the square root of the positive integer n.  a is
5025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    an initial approximation to the square root.  Any positive integer
5026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    will do for a, but the closer a is to the square root of n the
5027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    faster convergence will be.
5028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if n <= 0 or a <= 0:
5031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise ValueError("Both arguments to _sqrt_nearest should be positive.")
5032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    b=0
5034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    while a != b:
5035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        b, a = a, a--n//a>>1
5036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return a
5037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _rshift_nearest(x, shift):
5039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given an integer x and a nonnegative integer shift, return closest
5040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    integer to x / 2**shift; use round-to-even in case of a tie.
5041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    b, q = 1L << shift, x >> shift
5044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return q + (2*(x & (b-1)) + (q&1) > b)
5045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _div_nearest(a, b):
5047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Closest integer to a/b, a and b positive integers; rounds to even
5048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    in the case of a tie.
5049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    q, r = divmod(a, b)
5052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return q + (2*r + (q&1) > b)
5053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _ilog(x, M, L = 8):
5055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Integer approximation to M*log(x/M), with absolute error boundable
5056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    in terms only of x/M.
5057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    Given positive integers x and M, return an integer approximation to
5059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    M * log(x/M).  For L = 8 and 0.1 <= x/M <= 10 the difference
5060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    between the approximation and the exact result is at most 22.  For
5061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15.  In
5062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    both cases these are upper bounds on the error; it will usually be
5063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    much smaller."""
5064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # The basic algorithm is the following: let log1p be the function
5066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # log1p(x) = log(1+x).  Then log(x/M) = log1p((x-M)/M).  We use
5067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # the reduction
5068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #    log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
5070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # repeatedly until the argument to log1p is small (< 2**-L in
5072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # absolute value).  For small y we can use the Taylor series
5073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # expansion
5074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #    log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
5076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # truncating at T such that y**T is small enough.  The whole
5078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # computation is carried out in a form of fixed-point arithmetic,
5079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # with a real number z being represented by an integer
5080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # approximation to z*M.  To avoid loss of precision, the y below
5081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # is actually an integer approximation to 2**R*y*M, where R is the
5082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # number of reductions performed so far.
5083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    y = x-M
5085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # argument reduction; R = number of reductions performed
5086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    R = 0
5087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    while (R <= L and long(abs(y)) << L-R >= M or
5088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista           R > L and abs(y) >> R-L >= M):
5089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _div_nearest(long(M*y) << 1,
5090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                         M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
5091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        R += 1
5092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Taylor series with T terms
5094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    T = -int(-10*len(str(M))//(3*L))
5095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    yshift = _rshift_nearest(y, R)
5096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    w = _div_nearest(M, T)
5097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    for k in xrange(T-1, 0, -1):
5098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
5099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(w*y, M)
5101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dlog10(c, e, p):
5103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers c, e and p with c > 0, p >= 0, compute an integer
5104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    approximation to 10**p * log10(c*10**e), with an absolute error of
5105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    at most 1.  Assumes that c*10**e is not exactly 1."""
5106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # increase precision by 2; compensate for this by dividing
5108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # final result by 100
5109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    p += 2
5110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # write c*10**e as d*10**f with either:
5112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   f >= 0 and 1 <= d <= 10, or
5113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   f <= 0 and 0.1 <= d <= 1.
5114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Thus for c*10**e close to 1, f = 0
5115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    l = len(str(c))
5116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    f = e+l - (e+l >= 1)
5117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if p > 0:
5119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        M = 10**p
5120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        k = e+p-f
5121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if k >= 0:
5122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c *= 10**k
5123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = _div_nearest(c, 10**-k)
5125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = _ilog(c, M) # error < 5 + 22 = 27
5127be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        log_10 = _log10_digits(p) # error < 1
5128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = _div_nearest(log_d*M, log_10)
5129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_tenpower = f*M # exact
5130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = 0  # error < 2.31
513218aa388ca084e1d40aa48c8c8f1b4f730c6fe059Neal Norwitz        log_tenpower = _div_nearest(f, 10**-p) # error < 0.5
5133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(log_tenpower+log_d, 100)
5135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dlog(c, e, p):
5137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers c, e and p with c > 0, compute an integer
5138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    approximation to 10**p * log(c*10**e), with an absolute error of
5139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    at most 1.  Assumes that c*10**e is not exactly 1."""
5140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Increase precision by 2. The precision increase is compensated
5142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # for at the end with a division by 100.
5143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    p += 2
5144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
5146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # or f <= 0 and 0.1 <= d <= 1.  Then we can compute 10**p * log(c*10**e)
5147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # as 10**p * log(d) + 10**p*f * log(10).
5148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    l = len(str(c))
5149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    f = e+l - (e+l >= 1)
5150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # compute approximation to 10**p*log(d), with error < 27
5152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if p > 0:
5153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        k = e+p-f
5154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if k >= 0:
5155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c *= 10**k
5156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = _div_nearest(c, 10**-k)  # error of <= 0.5 in c
5158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # _ilog magnifies existing error in c by a factor of at most 10
5160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
5161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # p <= 0: just approximate the whole thing by 0; error < 2.31
5163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = 0
5164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5165be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # compute approximation to f*10**p*log(10), with error < 11.
5166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if f:
5167be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        extra = len(str(abs(f)))-1
5168be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        if p + extra >= 0:
5169be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
5170be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
5171be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
5172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            f_log_ten = 0
5174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        f_log_ten = 0
5176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5177be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
5178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(f_log_ten + log_d, 100)
5179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5180be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batistaclass _Log10Memoize(object):
5181be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    """Class to compute, store, and allow retrieval of, digits of the
5182be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    constant log(10) = 2.302585....  This constant is needed by
5183be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
5184be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    def __init__(self):
5185be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        self.digits = "23025850929940456840179914546843642076011014886"
5186be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5187be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    def getdigits(self, p):
5188be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        """Given an integer p >= 0, return floor(10**p)*log(10).
5189be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5190be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        For example, self.getdigits(3) returns 2302.
5191be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        """
5192be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # digits are stored as a string, for quick conversion to
5193be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # integer in the case that we've already computed enough
5194be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # digits; the stored digits should always be correct
5195be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # (truncated, not rounded to nearest).
5196be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        if p < 0:
5197be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            raise ValueError("p should be nonnegative")
5198be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5199be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        if p >= len(self.digits):
5200be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # compute p+3, p+6, p+9, ... digits; continue until at
5201be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # least one of the extra digits is nonzero
5202be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            extra = 3
5203be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            while True:
5204be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                # compute p+extra digits, correct to within 1ulp
5205be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                M = 10**(p+extra+2)
5206be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                digits = str(_div_nearest(_ilog(10*M, M), 100))
5207be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                if digits[-extra:] != '0'*extra:
5208be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                    break
5209be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                extra += 3
5210be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # keep all reliable digits so far; remove trailing zeros
5211be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # and next nonzero digit
5212be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            self.digits = digits.rstrip('0')[:-1]
5213be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        return int(self.digits[:p+1])
5214be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5215be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista_log10_digits = _Log10Memoize().getdigits
5216be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _iexp(x, M, L=8):
5218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers x and M, M > 0, such that x/M is small in absolute
5219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    value, compute an integer approximation to M*exp(x/M).  For 0 <=
5220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    x/M <= 2.4, the absolute error in the result is bounded by 60 (and
5221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    is usually much smaller)."""
5222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Algorithm: to compute exp(z) for a real number z, first divide z
5224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # by a suitable power R of 2 so that |z/2**R| < 2**-L.  Then
5225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
5226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # series
5227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #     expm1(x) = x + x**2/2! + x**3/3! + ...
5229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Now use the identity
5231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #     expm1(2x) = expm1(x)*(expm1(x)+2)
5233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # R times to compute the sequence expm1(z/2**R),
5235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
5236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Find R such that x/2**R/M <= 2**-L
5238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    R = _nbits((long(x)<<L)//M)
5239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Taylor series.  (2**L)**T > M
5241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    T = -int(-10*len(str(M))//(3*L))
5242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    y = _div_nearest(x, T)
5243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    Mshift = long(M)<<R
5244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    for i in xrange(T-1, 0, -1):
5245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _div_nearest(x*(Mshift + y), Mshift * i)
5246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Expansion
5248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    for k in xrange(R-1, -1, -1):
5249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Mshift = long(M)<<(k+2)
5250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _div_nearest(y*(y+Mshift), Mshift)
5251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return M+y
5253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dexp(c, e, p):
5255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Compute an approximation to exp(c*10**e), with p decimal places of
5256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    precision.
5257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5258be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    Returns integers d, f such that:
5259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      10**(p-1) <= d <= 10**p, and
5261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
5262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    In other words, d*10**f is an approximation to exp(c*10**e) with p
5264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    digits of precision, and with an error in d of at most 1.  This is
5265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    almost, but not quite, the same as the error being < 1ulp: when d
5266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    = 10**(p-1) the error could be up to 10 ulp."""
5267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
5269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    p += 2
5270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5271be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # compute log(10) with extra precision = adjusted exponent of c*10**e
5272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    extra = max(0, e + len(str(c)) - 1)
5273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    q = p + extra
5274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5275be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
5276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # rounding down
5277353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    shift = e+q
5278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if shift >= 0:
5279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        cshift = c*10**shift
5280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5281353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        cshift = c//10**-shift
5282be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    quot, rem = divmod(cshift, _log10_digits(q))
5283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # reduce remainder back to original precision
5285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    rem = _div_nearest(rem, 10**extra)
5286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5287353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # error in result of _iexp < 120;  error after division < 0.62
5288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
5289353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dpower(xc, xe, yc, ye, p):
5291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
5292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    y = yc*10**ye, compute x**y.  Returns a pair of integers (c, e) such that:
5293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      10**(p-1) <= c <= 10**p, and
5295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      (c-1)*10**e < x**y < (c+1)*10**e
5296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    in other words, c*10**e is an approximation to x**y with p digits
5298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    of precision, and with an error in c of at most 1.  (This is
5299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    almost, but not quite, the same as the error being < 1ulp: when c
5300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    == 10**(p-1) we can only guarantee error < 10ulp.)
5301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    We assume that: x is positive and not equal to 1, and y is nonzero.
5303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Find b such that 10**(b-1) <= |y| <= 10**b
5306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    b = len(str(abs(yc))) + ye
5307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
5309353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    lxc = _dlog(xc, xe, p+b+1)
5310353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
5312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    shift = ye-b
5313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if shift >= 0:
5314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        pc = lxc*yc*10**shift
5315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        pc = _div_nearest(lxc*yc, 10**-shift)
5317353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if pc == 0:
5319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # we prefer a result that isn't exactly 1; this makes it
5320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # easier to compute a correctly rounded result in __pow__
5321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
5322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            coeff, exp = 10**(p-1)+1, 1-p
5323353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            coeff, exp = 10**p-1, -p
5325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        coeff, exp = _dexp(pc, -(p+1), p+1)
5327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        coeff = _div_nearest(coeff, 10)
5328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exp += 1
5329353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return coeff, exp
5331353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5332353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _log10_lb(c, correction = {
5333353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
5334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '6': 23, '7': 16, '8': 10, '9': 5}):
5335353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Compute a lower bound for 100*log10(c) for a positive integer c."""
5336353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if c <= 0:
5337353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise ValueError("The argument to _log10_lb should be nonnegative.")
5338353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    str_c = str(c)
5339353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return 100*len(str_c) - correction[str_c[0]]
5340353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
534159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Helper Functions ####################################################
53427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5343353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _convert_other(other, raiseit=False):
5344636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    """Convert other to Decimal.
5345636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
5346636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    Verifies that it's ok to use in an implicit construction.
5347636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    """
5348636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    if isinstance(other, Decimal):
5349636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        return other
5350636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    if isinstance(other, (int, long)):
5351636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        return Decimal(other)
5352353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if raiseit:
5353353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise TypeError("Unable to convert %s to Decimal" % other)
5354267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger    return NotImplemented
5355636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
535659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Setup Specific Contexts ############################################
53577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# The default context prototype used by Context()
5359fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger# Is mutable, so that new contexts can have different default values
53607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDefaultContext = Context(
53626ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=28, rounding=ROUND_HALF_EVEN,
5363bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation],
5364bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
536599148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emax=999999999,
536699148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emin=-999999999,
5367e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        capitals=1
53687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
53697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Pre-made alternate contexts offered by the specification
53717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Don't change these; the user should be able to select these
53727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# contexts and be able to reproduce results from other implementations
53737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# of the spec.
53747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerBasicContext = Context(
53767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prec=9, rounding=ROUND_HALF_UP,
5377bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
5378bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
53797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
53807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53819ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerExtendedContext = Context(
53826ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=9, rounding=ROUND_HALF_EVEN,
5383bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[],
5384bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
53857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
53867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
538859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### crud for parsing strings #############################################
53896a123cb7827859748a0096570dfbb5ceba0e59dcMark Dickinson#
539072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Regular expression used for parsing numeric strings.  Additional
539172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# comments:
539272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista#
539372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
539472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# whitespace.  But note that the specification disallows whitespace in
539572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# a numeric string.
539672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista#
539772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 2. For finite numbers (not infinities and NaNs) the body of the
539872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# number between the optional sign and the optional exponent must have
539972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# at least one decimal digit, possibly after the decimal point.  The
540072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# lookahead expression '(?=\d|\.\d)' checks this.
54017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
540272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batistaimport re
540370c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson_parser = re.compile(r"""        # A numeric string consists of:
54047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
540570c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson    (?P<sign>[-+])?              # an optional sign, followed by either...
54067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (
54074326ad8f72053140aa658a0392a509c9da382670Mark Dickinson        (?=\d|\.\d)              # ...a number (with at least one digit)
54084326ad8f72053140aa658a0392a509c9da382670Mark Dickinson        (?P<int>\d*)             # having a (possibly empty) integer part
54094326ad8f72053140aa658a0392a509c9da382670Mark Dickinson        (\.(?P<frac>\d*))?       # followed by an optional fractional part
54104326ad8f72053140aa658a0392a509c9da382670Mark Dickinson        (E(?P<exp>[-+]?\d+))?    # followed by an optional exponent, or...
54117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    |
541270c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        Inf(inity)?              # ...an infinity, or...
541372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    |
541470c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (?P<signal>s)?           # ...an (optionally signaling)
541570c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        NaN                      # NaN
54164326ad8f72053140aa658a0392a509c9da382670Mark Dickinson        (?P<diag>\d*)            # with (possibly empty) diagnostic info.
54177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    )
54187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
541959bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson    \Z
54204326ad8f72053140aa658a0392a509c9da382670Mark Dickinson""", re.VERBOSE | re.IGNORECASE | re.UNICODE).match
54217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
54222ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista_all_zeros = re.compile('0*$').match
54232ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista_exact_half = re.compile('50*$').match
54241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54251ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson##### PEP3101 support functions ##############################################
5426277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# The functions in this section have little to do with the Decimal
5427277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# class, and could potentially be reused or adapted for other pure
54281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# Python numeric classes that want to implement __format__
54291ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson#
54301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# A format specifier for Decimal looks like:
54311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson#
5432277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson#   [[fill]align][sign][0][minimumwidth][,][.precision][type]
54331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson_parse_format_specifier_regex = re.compile(r"""\A
54351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?:
54361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson   (?P<fill>.)?
54371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson   (?P<align>[<>=^])
54381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson)?
54391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<sign>[-+ ])?
54401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<zeropad>0)?
54411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<minimumwidth>(?!0)\d+)?
5442277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson(?P<thousands_sep>,)?
54431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?:\.(?P<precision>0|(?!0)\d+))?
5444277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson(?P<type>[eEfFgGn%])?
54451ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson\Z
54461ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson""", re.VERBOSE)
54471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdel re
54497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5450277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# The locale module is only needed for the 'n' format specifier.  The
5451277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# rest of the PEP 3101 code functions quite happily without it, so we
5452277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson# don't care too much if locale isn't present.
5453277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsontry:
5454277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    import locale as _locale
5455277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsonexcept ImportError:
5456277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    pass
5457277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5458277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _parse_format_specifier(format_spec, _localeconv=None):
54591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """Parse and validate a format specifier.
54601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    Turns a standard numeric format specifier into a dict, with the
54621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    following entries:
54631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      fill: fill character to pad field to minimum width
54651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      align: alignment type, either '<', '>', '=' or '^'
54661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      sign: either '+', '-' or ' '
54671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      minimumwidth: nonnegative integer giving minimum width
5468277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      zeropad: boolean, indicating whether to pad with zeros
5469277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      thousands_sep: string to use as thousands separator, or ''
5470277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      grouping: grouping for thousands separators, in format
5471277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        used by localeconv
5472277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      decimal_point: string to use for decimal point
54731ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      precision: nonnegative integer giving precision, or None
54741ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      type: one of the characters 'eEfFgG%', or None
5475277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      unicode: boolean (always True for Python 3.x)
54761ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54771ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """
54781ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    m = _parse_format_specifier_regex.match(format_spec)
54791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if m is None:
54801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        raise ValueError("Invalid format specifier: " + format_spec)
54811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # get the dictionary
54831ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict = m.groupdict()
54841ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
5485277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    # zeropad; defaults for fill and alignment.  If zero padding
5486277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    # is requested, the fill and align fields should be absent.
54871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    fill = format_dict['fill']
54881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    align = format_dict['align']
5489277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    format_dict['zeropad'] = (format_dict['zeropad'] is not None)
5490277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    if format_dict['zeropad']:
5491277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if fill is not None:
54921ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            raise ValueError("Fill character conflicts with '0'"
54931ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                             " in format specifier: " + format_spec)
5494277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if align is not None:
54951ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            raise ValueError("Alignment conflicts with '0' in "
54961ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                             "format specifier: " + format_spec)
54971ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['fill'] = fill or ' '
54981ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['align'] = align or '<'
54991ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
5500277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    # default sign handling: '-' for negative, '' for positive
55011ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict['sign'] is None:
55021ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        format_dict['sign'] = '-'
55031ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55041ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # minimumwidth defaults to 0; precision remains None if not given
55051ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
55061ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict['precision'] is not None:
55071ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        format_dict['precision'] = int(format_dict['precision'])
55081ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55091ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # if format type is 'g' or 'G' then a precision of 0 makes little
55101ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # sense; convert it to 1.  Same if format type is unspecified.
55111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict['precision'] == 0:
55121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if format_dict['type'] in 'gG' or format_dict['type'] is None:
55131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            format_dict['precision'] = 1
55141ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
5515277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    # determine thousands separator, grouping, and decimal separator, and
5516277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    # add appropriate entries to format_dict
5517277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    if format_dict['type'] == 'n':
5518277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        # apart from separators, 'n' behaves just like 'g'
5519277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        format_dict['type'] = 'g'
5520277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if _localeconv is None:
5521277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            _localeconv = _locale.localeconv()
5522277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if format_dict['thousands_sep'] is not None:
5523277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            raise ValueError("Explicit thousands separator conflicts with "
5524277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson                             "'n' type in format specifier: " + format_spec)
5525277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        format_dict['thousands_sep'] = _localeconv['thousands_sep']
5526277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        format_dict['grouping'] = _localeconv['grouping']
5527277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        format_dict['decimal_point'] = _localeconv['decimal_point']
5528277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    else:
5529277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if format_dict['thousands_sep'] is None:
5530277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            format_dict['thousands_sep'] = ''
5531277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        format_dict['grouping'] = [3, 0]
5532277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        format_dict['decimal_point'] = '.'
5533277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
55341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # record whether return type should be str or unicode
55351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['unicode'] = isinstance(format_spec, unicode)
55361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    return format_dict
55381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
5539277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _format_align(sign, body, spec):
5540277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    """Given an unpadded, non-aligned numeric string 'body' and sign
5541277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    string 'sign', add padding and aligment conforming to the given
5542277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    format specifier dictionary 'spec' (as produced by
5543277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    parse_format_specifier).
55441ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
5545277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    Also converts result to unicode if necessary.
55461ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """
55481ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # how much extra space do we have to play with?
5549277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    minimumwidth = spec['minimumwidth']
5550277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    fill = spec['fill']
5551277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    padding = fill*(minimumwidth - len(sign) - len(body))
55521ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
5553277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    align = spec['align']
55541ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if align == '<':
55551ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = sign + body + padding
5556b065e52bc284c2c28a967c4e82aa7ece6d09c562Mark Dickinson    elif align == '>':
5557b065e52bc284c2c28a967c4e82aa7ece6d09c562Mark Dickinson        result = padding + sign + body
55581ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    elif align == '=':
55591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = sign + padding + body
5560277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    elif align == '^':
55611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        half = len(padding)//2
55621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = padding[:half] + sign + body + padding[half:]
5563277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    else:
5564277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        raise ValueError('Unrecognised alignment field')
55651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # make sure that result is unicode if necessary
5567277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    if spec['unicode']:
55681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = unicode(result)
55691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    return result
55710d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz
5572277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _group_lengths(grouping):
5573277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    """Convert a localeconv-style grouping into a (possibly infinite)
5574277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    iterable of integers representing group lengths.
5575277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5576277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    """
5577277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    # The result from localeconv()['grouping'], and the input to this
5578277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    # function, should be a list of integers in one of the
5579277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    # following three forms:
5580277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    #
5581277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    #   (1) an empty list, or
5582277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    #   (2) nonempty list of positive integers + [0]
5583277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    #   (3) list of positive integers + [locale.CHAR_MAX], or
5584277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5585277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    from itertools import chain, repeat
5586277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    if not grouping:
5587277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        return []
5588277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    elif grouping[-1] == 0 and len(grouping) >= 2:
5589277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        return chain(grouping[:-1], repeat(grouping[-2]))
5590277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    elif grouping[-1] == _locale.CHAR_MAX:
5591277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        return grouping[:-1]
5592277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    else:
5593277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        raise ValueError('unrecognised format for grouping')
5594277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5595277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _insert_thousands_sep(digits, spec, min_width=1):
5596277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    """Insert thousands separators into a digit string.
5597277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5598277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    spec is a dictionary whose keys should include 'thousands_sep' and
5599277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    'grouping'; typically it's the result of parsing the format
5600277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    specifier using _parse_format_specifier.
5601277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5602277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    The min_width keyword argument gives the minimum length of the
5603277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    result, which will be padded on the left with zeros if necessary.
5604277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5605277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    If necessary, the zero padding adds an extra '0' on the left to
5606277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    avoid a leading thousands separator.  For example, inserting
5607277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    commas every three digits in '123456', with min_width=8, gives
5608277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    '0,123,456', even though that has length 9.
5609277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5610277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    """
5611277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5612277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    sep = spec['thousands_sep']
5613277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    grouping = spec['grouping']
5614277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5615277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    groups = []
5616277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    for l in _group_lengths(grouping):
5617277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if l <= 0:
5618277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            raise ValueError("group length should be positive")
5619277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        # max(..., 1) forces at least 1 digit to the left of a separator
5620277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        l = min(max(len(digits), min_width, 1), l)
5621277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        groups.append('0'*(l - len(digits)) + digits[-l:])
5622277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        digits = digits[:-l]
5623277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        min_width -= l
5624277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        if not digits and min_width <= 0:
5625277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson            break
5626b14514a153857141631d602cadf094bc932f12eeMark Dickinson        min_width -= len(sep)
5627277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    else:
5628277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        l = max(len(digits), min_width, 1)
5629277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        groups.append('0'*(l - len(digits)) + digits[-l:])
5630277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    return sep.join(reversed(groups))
5631277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5632277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _format_sign(is_negative, spec):
5633277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    """Determine sign character."""
5634277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5635277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    if is_negative:
5636277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        return '-'
5637277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    elif spec['sign'] in ' +':
5638277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        return spec['sign']
5639277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    else:
5640277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        return ''
5641277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5642277859d5910782cc31bb27f2472893b8382ad391Mark Dickinsondef _format_number(is_negative, intpart, fracpart, exp, spec):
5643277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    """Format a number, given the following data:
5644277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5645277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    is_negative: true if the number is negative, else false
5646277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    intpart: string of digits that must appear before the decimal point
5647277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    fracpart: string of digits that must come after the point
5648277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    exp: exponent, as an integer
5649277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    spec: dictionary resulting from parsing the format specifier
5650277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5651277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    This function uses the information in spec to:
5652277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      insert separators (decimal separator and thousands separators)
5653277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      format the sign
5654277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      format the exponent
5655277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      add trailing '%' for the '%' type
5656277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      zero-pad if necessary
5657277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson      fill and align if necessary
5658277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    """
5659277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5660277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    sign = _format_sign(is_negative, spec)
5661277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5662277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    if fracpart:
5663277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        fracpart = spec['decimal_point'] + fracpart
5664277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5665277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    if exp != 0 or spec['type'] in 'eE':
5666277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
5667277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        fracpart += "{0}{1:+}".format(echar, exp)
5668277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    if spec['type'] == '%':
5669277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        fracpart += '%'
5670277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5671277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    if spec['zeropad']:
5672277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        min_width = spec['minimumwidth'] - len(fracpart) - len(sign)
5673277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    else:
5674277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson        min_width = 0
5675277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    intpart = _insert_thousands_sep(intpart, spec, min_width)
5676277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5677277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson    return _format_align(sign, intpart+fracpart, spec)
5678277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
5679277859d5910782cc31bb27f2472893b8382ad391Mark Dickinson
568072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista##### Useful Constants (internal use only) ################################
56817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
568272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Reusable defaults
5683b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_Infinity = Decimal('Inf')
5684b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_NegativeInfinity = Decimal('-Inf')
5685c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson_NaN = Decimal('NaN')
5686b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_Zero = Decimal(0)
5687b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_One = Decimal(1)
5688b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_NegativeOne = Decimal(-1)
5689c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson
5690b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger# _SignedInfinity[sign] is infinity w/ that sign
5691b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_SignedInfinity = (_Infinity, _NegativeInfinity)
56927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
56937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
56947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
56957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerif __name__ == '__main__':
56967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    import doctest, sys
56977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    doctest.testmod(sys.modules[__name__])
5698