decimal.py revision b7e835b820fc7d17a02dc4cdf3b745bb993952ad
17c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Copyright (c) 2004 Python Software Foundation.
27c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# All rights reserved.
37c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Written by Eric Price <eprice at tjhsst.edu>
57c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Facundo Batista <facundo at taniquetil.com.ar>
67c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Raymond Hettinger <python at rcn.com>
71f34eb17b501687c1251678bcffab9accd432591Fred Drake#    and Aahz <aahz at pobox.com>
87c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    and Tim Peters
97c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1027dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# This module is currently Py2.3 compatible and should be kept that way
1127dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# unless a major compelling advantage arises.  IOW, 2.3 compatibility is
1227dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# strongly preferred, but not guaranteed.
1327dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger
1427dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# Also, this module should be kept in sync with the latest updates of
1527dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# the IBM specification as it evolves.  Those updates will be treated
1627dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# as bug fixes (deviation from the spec is a compatibility, usability
1727dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# bug) and will be backported.  At this point the spec is stabilizing
1827dbcf2162c61d5ba248c57c89ff4fa3d85a21c7Raymond Hettinger# and the updates are becoming fewer, smaller, and less significant.
197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"""
217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerThis is a Py2.3 implementation of decimal floating point arithmetic based on
227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerthe General Decimal Arithmetic Specification:
237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    www2.hursley.ibm.com/decimal/decarith.html
257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
260ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettingerand IEEE standard 854-1987:
277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDecimal floating point has finite precision with arbitrarily large bounds.
317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo BatistaThe purpose of this module is to support arithmetic using familiar
3359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista"schoolhouse" rules and to avoid some of the tricky representation
347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerissues associated with binary floating point.  The package is especially
357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingeruseful for financial applications or for contexts where users have
367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerexpectations that are at odds with binary floating point (for instance,
377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerin binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
38abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettingerof the expected Decimal('0.00') returned by decimal floating point).
397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerHere are some examples of using the decimal module:
417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> from decimal import *
43bd7f76dd04780304c397323ae994092ce759d5a2Raymond Hettinger>>> setcontext(ExtendedContext)
447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(0)
45abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('0')
46abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('1')
47abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('1')
48abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('-.0123')
49abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('-0.0123')
507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> Decimal(123456)
51abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('123456')
52abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('123.45e12345678901234567890')
53abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('1.2345E+12345678901234567892')
54abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('1.33') + Decimal('1.27')
55abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('2.60')
56abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger>>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41')
57abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('-2.20')
587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> dig = Decimal(1)
597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3)
607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333
617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> getcontext().prec = 18
627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / Decimal(3)
637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0.333333333333333333
647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig.sqrt()
657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3).sqrt()
677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1.73205080756887729
687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print Decimal(3) ** 123
697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger4.85192780976896427E+58
707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> inf = Decimal(1) / Decimal(0)
717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print inf
727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity
737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> neginf = Decimal(-1) / Decimal(0)
747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf
757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity
767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf + inf
777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN
787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print neginf * inf
797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger-Infinity
807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0
817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerInfinity
82bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> getcontext().traps[DivisionByZero] = 1
837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print dig / 0
847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last):
857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDivisionByZero: x / 0
897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c = Context()
90bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0
915aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0
937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> c.divide(Decimal(0), Decimal(0))
94abe32371878dcaea31c835e10144fdaa2eca6492Raymond HettingerDecimal('NaN')
95bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 1
965aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
985aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0
995aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger0
1017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0))
1027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerTraceback (most recent call last):
1037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger  ...
1065aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond HettingerInvalidOperation: 0 / 0
1075aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
1095aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> c.flags[InvalidOperation] = 0
110bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger>>> c.traps[InvalidOperation] = 0
1117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>> print c.divide(Decimal(0), Decimal(0))
1127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerNaN
1135aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger>>> print c.flags[InvalidOperation]
1147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger1
1157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger>>>
1167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger"""
1177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger__all__ = [
1197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Two major classes
1207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'Decimal', 'Context',
1217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Contexts
1239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    'DefaultContext', 'BasicContext', 'ExtendedContext',
1247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Exceptions
126d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger    'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
127d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger    'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
1287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Constants for use in setting up contexts
1307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP',
1327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # Functions for manipulating contexts
1348b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    'setcontext', 'getcontext', 'localcontext'
1357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger]
1367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
137eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettingerimport copy as _copy
138f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettingerimport math as _math
1397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
140097a1903035f9ee2efb1953306123f183124125dRaymond Hettingertry:
141097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger    from collections import namedtuple as _namedtuple
142097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger    DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
143097a1903035f9ee2efb1953306123f183124125dRaymond Hettingerexcept ImportError:
144097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger    DecimalTuple = lambda *args: args
145097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger
14659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista# Rounding
1470ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_DOWN = 'ROUND_DOWN'
1480ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_UP = 'ROUND_HALF_UP'
1490ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
1500ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_CEILING = 'ROUND_CEILING'
1510ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_FLOOR = 'ROUND_FLOOR'
1520ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_UP = 'ROUND_UP'
1530ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo BatistaROUND_05UP = 'ROUND_05UP'
1557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista# Errors
1577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DecimalException(ArithmeticError):
1595aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    """Base exception class.
1607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Used exceptions derive from this.
1627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    If an exception derives from another exception besides this (such as
1637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
1647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    called if the others are present.  This isn't actually used for
1657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    anything, though.
1667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
167cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis    handle  -- Called when context._raise_error is called and the
168cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               trap_enabler is set.  First argument is self, second is the
169cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               context.  More arguments can be given, those being after
170cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               the explanation in _raise_error (For example,
171cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               context._raise_error(NewError, '(-x)!', self._sign) would
172cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               call NewError().handle(context, self._sign).)
173cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
1747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    To define a new exception, it should be sufficient to have it derive
1757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    from DecimalException.
1767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
1787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        pass
1797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Clamped(DecimalException):
1827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent of a 0 changed to fit bounds.
1837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals clamped if the exponent of a result has been
1857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    altered in order to fit the constraints of a specific concrete
18659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    representation.  This may occur when the exponent of a zero result would
18759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    be outside the bounds of a representation, or when a large normal
18859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    number would have an encoded exponent that cannot be represented.  In
1897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    this latter case, the exponent is reduced to fit and the corresponding
1907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    number of zero digits are appended to the coefficient ("fold-down").
1917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidOperation(DecimalException):
1947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """An invalid operation was performed.
1957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Various bad things cause this:
1977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Something creates a signaling NaN
1997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -INF + INF
20059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    0 * (+-)INF
20159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    (+-)INF / (+-)INF
2027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x % 0
2037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (+-)INF % x
2047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x._rescale( non-integer )
2057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    sqrt(-x) , x > 0
2067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    0 ** 0
2077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (non-integer)
2087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (+-)INF
2097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    An operand is invalid
210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    The result of the operation after these is a quiet positive NaN,
212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    except when the cause is a signaling NaN, in which case the result is
213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    also a quiet NaN, but with the original sign, and an optional
214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    diagnostic information.
2157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if args:
2180f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
2190f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            return ans._fix_nan(context)
220c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson        return _NaN
2217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass ConversionSyntax(InvalidOperation):
2237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Trying to convert badly formed string.
2247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an string is being
2267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    converted to a number and it does not conform to the numeric string
22759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    syntax.  The result is [0,qNaN].
2287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
229cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis    def handle(self, context, *args):
230c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson        return _NaN
2317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionByZero(DecimalException, ZeroDivisionError):
2337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Division by 0.
2347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals division-by-zero if division of a finite number
2367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero was attempted (during a divide-integer or divide operation, or a
2377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    power operation with negative right-hand operand), and the dividend was
2387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not zero.
2397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result of the operation is [sign,inf], where sign is the exclusive
2417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or of the signs of the operands for divide, or is 1 for an odd power of
2427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -0, for power.
2437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
244cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
245cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista    def handle(self, context, sign, *args):
246b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger        return _SignedInfinity[sign]
2477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionImpossible(InvalidOperation):
2497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Cannot perform the division adequately.
2507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if the integer result of a
2527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    divide-integer or remainder operation had too many digits (would be
25359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    longer than precision).  The result is [0,qNaN].
2547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
255cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
2567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
257c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson        return _NaN
2587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionUndefined(InvalidOperation, ZeroDivisionError):
2607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Undefined result of division.
2617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if division by zero was
2637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    attempted (during a divide-integer, divide, or remainder operation), and
26459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    the dividend is also zero.  The result is [0,qNaN].
2657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
266cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
267cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista    def handle(self, context, *args):
268c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson        return _NaN
2697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Inexact(DecimalException):
2717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Had to round, losing information.
2727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals inexact whenever the result of an operation is
2747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not exact (that is, it needed to be rounded and any discarded digits
27559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    were non-zero), or if an overflow or underflow condition occurs.  The
2767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
2777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The inexact signal may be tested (or trapped) to determine if a given
2797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) was inexact.
2807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidContext(InvalidOperation):
2837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Invalid context.  Unknown rounding, for example.
2847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an invalid context was
28659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    detected during an operation.  This can occur if contexts are not checked
2877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    on creation and either the precision exceeds the capability of the
2887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    underlying concrete representation or an unknown or unsupported rounding
28959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    was specified.  These aspects of the context need only be checked when
29059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    the values are required to be used.  The result is [0,qNaN].
2917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
292cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
2937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
294c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson        return _NaN
2957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Rounded(DecimalException):
2977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Number got rounded (not  necessarily changed during rounding).
2987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals rounded whenever the result of an operation is
3007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    rounded (that is, some zero or non-zero digits were discarded from the
30159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    coefficient), or if an overflow or underflow condition occurs.  The
3027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
3037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The rounded signal may be tested (or trapped) to determine if a given
3057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) caused a loss of precision.
3067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Subnormal(DecimalException):
3097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent < Emin before rounding.
3107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals subnormal whenever the result of a conversion or
3127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation is subnormal (that is, its adjusted exponent is less than
31359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    Emin, before any rounding).  The result in all cases is unchanged.
3147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The subnormal signal may be tested (or trapped) to determine if a given
3167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or operation (or sequence of operations) yielded a subnormal result.
3177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Overflow(Inexact, Rounded):
3207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical overflow.
3217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals overflow if the adjusted exponent of a result
3237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (from a conversion or from an operation that is not an attempt to divide
3247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero), after rounding, would be greater than the largest value that
3257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    can be handled by the implementation (the value Emax).
3267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result depends on the rounding mode:
3287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    For round-half-up and round-half-even (and for round-half-down and
3307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-up, if implemented), the result of the operation is [sign,inf],
33159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    where sign is the sign of the intermediate result.  For round-down, the
3327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result is the largest finite number that can be represented in the
33359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    current precision, with the sign of the intermediate result.  For
3347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-ceiling, the result is the same as for round-down if the sign of
33559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    the intermediate result is 1, or is [0,inf] otherwise.  For round-floor,
3367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the result is the same as for round-down if the sign of the intermediate
33759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    result is 0, or is [1,inf] otherwise.  In all cases, Inexact and Rounded
3387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    will also be raised.
3390f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista    """
340cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
3417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, sign, *args):
3427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
343353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                ROUND_HALF_DOWN, ROUND_UP):
344b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _SignedInfinity[sign]
3457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 0:
3467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_CEILING:
347b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[sign]
34872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(sign, '9'*context.prec,
34972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                            context.Emax-context.prec+1)
3507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 1:
3517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_FLOOR:
352b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[sign]
35372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(sign, '9'*context.prec,
35472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                             context.Emax-context.prec+1)
3557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Underflow(Inexact, Rounded, Subnormal):
3587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical underflow with result rounded to 0.
3597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals underflow if a result is inexact and the
3617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    adjusted exponent of the result would be smaller (more negative) than
3627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the smallest value that can be handled by the implementation (the value
36359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    Emin).  That is, the result is both inexact and subnormal.
3647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result after an underflow will be a subnormal number rounded, if
36659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    necessary, so that its exponent is not less than Etiny.  This may result
3677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    in 0 with the sign of the intermediate result and an exponent of Etiny.
3687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    In all cases, Inexact, Rounded, and Subnormal will also be raised.
3707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3725aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# List of public traps and flags
373fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
374cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis           Underflow, InvalidOperation, Subnormal]
3757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3765aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# Map conditions (per the spec) to signals
3775aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger_condition_map = {ConversionSyntax:InvalidOperation,
3785aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionImpossible:InvalidOperation,
3795aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionUndefined:InvalidOperation,
3805aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  InvalidContext:InvalidOperation}
3817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Context Functions ##################################################
3837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
384ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# The getcontext() and setcontext() function manage access to a thread-local
385ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# current context.  Py2.4 offers direct support for thread locals.  If that
386ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# is not available, use threading.currentThread() which is slower but will
3877e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger# work for older Pythons.  If threads are not part of the build, create a
388cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis# mock threading object with threading.local() returning the module namespace.
3897e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger
3907e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingertry:
3917e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    import threading
3927e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingerexcept ImportError:
3937e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    # Python was compiled without threads; create a mock object instead
3947e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    import sys
39559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    class MockThreading(object):
3967e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger        def local(self, sys=sys):
3977e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger            return sys.modules[__name__]
3987e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    threading = MockThreading()
3997e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    del sys, MockThreading
400ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
401ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingertry:
402ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    threading.local
403ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
404ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerexcept AttributeError:
405ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
40659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # To fix reloading, force it to create a new context
40759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # Old contexts have different exceptions in their dicts, making problems.
408ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    if hasattr(threading.currentThread(), '__decimal_context__'):
409ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        del threading.currentThread().__decimal_context__
410ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
411ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context):
412ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
413ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4149fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
41561992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
4167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        threading.currentThread().__decimal_context__ = context
417ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
418ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext():
419ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
420ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
421ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
422ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
423ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
424ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
425ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
426ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return threading.currentThread().__decimal_context__
427ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
428ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
429ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            threading.currentThread().__decimal_context__ = context
430ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
431ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
432ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerelse:
433ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
434ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    local = threading.local()
4359fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    if hasattr(local, '__decimal_context__'):
4369fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        del local.__decimal_context__
437ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
438ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext(_local=local):
439ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
440ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
441ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
442ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
443ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
444ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
445ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
446ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return _local.__decimal_context__
447ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
448ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
449ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            _local.__decimal_context__ = context
450ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
451ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
452ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context, _local=local):
453ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
454ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4559fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
45661992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
457ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        _local.__decimal_context__ = context
458ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
459cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis    del threading, local        # Don't contaminate the namespace
4607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4618b6999b4c5fab174090be263ba90f193bdede141Nick Coghlandef localcontext(ctx=None):
4628b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """Return a context manager for a copy of the supplied context
4638b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
4648b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    Uses a copy of the current context if no context is specified
4658b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    The returned context manager creates a local decimal context
4668b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    in a with statement:
4678b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan        def sin(x):
4688b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan             with localcontext() as ctx:
4698b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 ctx.prec += 2
4708b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # Rest of sin calculation algorithm
4718b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # uses a precision 2 greater than normal
47259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista             return +s  # Convert result to normal precision
4738b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
4748b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan         def sin(x):
4758b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan             with localcontext(ExtendedContext):
4768b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # Rest of sin calculation algorithm
4778b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # uses the Extended Context from the
4788b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # General Decimal Arithmetic Specification
47959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista             return +s  # Convert result to normal context
4808b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
481ee340e501d2a59d70a91748ebd948787bfac8044Facundo Batista    >>> setcontext(DefaultContext)
4828b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> print getcontext().prec
4838b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    28
4848b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> with localcontext():
4858b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...     ctx = getcontext()
486495df4716fce4156c1eb110f9342297164eecbb6Raymond Hettinger    ...     ctx.prec += 2
4878b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...     print ctx.prec
4888b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...
4898b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    30
4908b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> with localcontext(ExtendedContext):
4918b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...     print getcontext().prec
4928b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...
4938b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    9
4948b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> print getcontext().prec
4958b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    28
4968b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """
497ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan    if ctx is None: ctx = getcontext()
498ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan    return _ContextManager(ctx)
4998b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
5007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
50159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Decimal class #######################################################
5027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Decimal(object):
5047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Floating point class for decimal arithmetic."""
5057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
506636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    __slots__ = ('_exp','_int','_sign', '_is_special')
507636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # Generally, the value of the Decimal instance is given by
508636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    #  (-1)**_sign * _int * 10**_exp
509636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # Special values are signified by _is_special == True
5107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
511dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    # We're immutable, so use __new__ not __init__
512636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    def __new__(cls, value="0", context=None):
5137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Create a decimal point instance.
5147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal('3.14')              # string input
516abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.14')
51759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        >>> Decimal((0, (3, 1, 4), -2))  # tuple (sign, digit_tuple, exponent)
518abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.14')
5197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(314)                 # int or long
520abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('314')
5217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(Decimal(314))        # another decimal instance
522abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('314')
52359bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        >>> Decimal('  3.14  \\n')        # leading and trailing whitespace okay
524abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.14')
5257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
52772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # Note that the coefficient, self._int, is actually stored as
52872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # a string rather than as a tuple of digits.  This speeds up
52972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # the "digits to integer" and "integer to digits" conversions
53072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # that are used in almost every arithmetic operation on
53172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # Decimals.  This is an internal detail: the as_tuple function
53272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # and the Decimal constructor still deal with tuples of
53372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # digits.
53472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
535636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self = object.__new__(cls)
536636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
5370d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # From a string
5380d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # REs insist on real strings, so we can too.
5390d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        if isinstance(value, basestring):
54059bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson            m = _parser(value.strip())
5410d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            if m is None:
5420d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                if context is None:
5430d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    context = getcontext()
5440d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                return context._raise_error(ConversionSyntax,
5450d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                                "Invalid literal for Decimal: %r" % value)
546636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
5470d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            if m.group('sign') == "-":
5480d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._sign = 1
5490d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            else:
5500d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._sign = 0
5510d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            intpart = m.group('int')
5520d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            if intpart is not None:
5530d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                # finite number
5540d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                fracpart = m.group('frac')
5550d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                exp = int(m.group('exp') or '0')
5560d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                if fracpart is not None:
5578e85ffa4b213be809109180142a107a1ac66f4d5Mark Dickinson                    self._int = str((intpart+fracpart).lstrip('0') or '0')
5580d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    self._exp = exp - len(fracpart)
5590d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                else:
5608e85ffa4b213be809109180142a107a1ac66f4d5Mark Dickinson                    self._int = str(intpart.lstrip('0') or '0')
5610d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    self._exp = exp
5620d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._is_special = False
5630d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            else:
5640d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                diag = m.group('diag')
5650d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                if diag is not None:
5660d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    # NaN
5678e85ffa4b213be809109180142a107a1ac66f4d5Mark Dickinson                    self._int = str(diag.lstrip('0'))
5680d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    if m.group('signal'):
5690d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                        self._exp = 'N'
5700d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    else:
5710d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                        self._exp = 'n'
5720d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                else:
5730d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    # infinity
5740d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    self._int = '0'
5750d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    self._exp = 'F'
5760d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._is_special = True
577636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
578636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
579636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # From an integer
5807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, (int,long)):
581636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if value >= 0:
582636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._sign = 0
583636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            else:
584636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._sign = 1
585636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._exp = 0
58672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self._int = str(abs(value))
5870d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._is_special = False
5880d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            return self
5890d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista
5900d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # From another decimal
5910d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        if isinstance(value, Decimal):
5920d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._exp  = value._exp
5930d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._sign = value._sign
5940d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._int  = value._int
5950d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._is_special  = value._is_special
5960d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            return self
5970d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista
5980d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # From an internal working value
5990d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        if isinstance(value, _WorkRep):
6000d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._sign = value.sign
6010d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._int = str(value.int)
6020d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._exp = int(value.exp)
6030d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._is_special = False
604636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
605636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
606636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # tuple/list conversion (possibly from as_tuple())
607636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if isinstance(value, (list,tuple)):
608636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if len(value) != 3:
6099b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                raise ValueError('Invalid tuple size in creation of Decimal '
6109b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 'from list or tuple.  The list or tuple '
6119b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 'should have exactly three elements.')
6129b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista            # process sign.  The isinstance test rejects floats
6139b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista            if not (isinstance(value[0], (int, long)) and value[0] in (0,1)):
6149b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                raise ValueError("Invalid sign.  The first value in the tuple "
6159b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 "should be an integer; either 0 for a "
6169b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 "positive number or 1 for a negative number.")
617636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._sign = value[0]
6189b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista            if value[2] == 'F':
6199b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                # infinity: value[1] is ignored
62072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                self._int = '0'
621636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._exp = value[2]
622636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._is_special = True
623636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            else:
6249b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                # process and validate the digits in value[1]
6259b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                digits = []
6269b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                for digit in value[1]:
6279b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    if isinstance(digit, (int, long)) and 0 <= digit <= 9:
6289b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                        # skip leading zeros
6299b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                        if digits or digit != 0:
6309b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                            digits.append(digit)
6319b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    else:
6329b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                        raise ValueError("The second value in the tuple must "
6339b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                         "be composed of integers in the range "
6349b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                         "0 through 9.")
6359b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                if value[2] in ('n', 'N'):
6369b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    # NaN: digits form the diagnostic
63772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                    self._int = ''.join(map(str, digits))
6389b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._exp = value[2]
6399b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._is_special = True
6409b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                elif isinstance(value[2], (int, long)):
6419b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    # finite number: digits give the coefficient
64272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                    self._int = ''.join(map(str, digits or [0]))
6439b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._exp = value[2]
6449b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._is_special = False
6459b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                else:
6469b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    raise ValueError("The third value in the tuple must "
6479b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                     "be an integer, or one of the "
6489b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                     "strings 'F', 'n', 'N'.")
649636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
650636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
651636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if isinstance(value, float):
652636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            raise TypeError("Cannot convert float to Decimal.  " +
653636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                            "First convert the float to a string")
6547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
655636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        raise TypeError("Cannot convert %r to Decimal" % value)
6567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
657f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger    @classmethod
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))
683f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        sign = 0 if _math.copysign(1.0, f) == 1.0 else 1
684f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        n, d = abs(f).as_integer_ratio()
685f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        k = d.bit_length() - 1
686f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        result = _dec_from_triple(sign, str(n*5**k), -k)
687f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        return result if cls is Decimal else cls(result)
688f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
6897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isnan(self):
6907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
6917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if a number
6930f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista        1 if NaN
6947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        2 if sNaN
6957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
696636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
697636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            exp = self._exp
698636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if exp == 'n':
699636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return 1
700636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            elif exp == 'N':
701636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return 2
7027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
7037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinfinity(self):
7057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is infinite
7067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if finite or not a number
7087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if +INF
7097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 if -INF
7107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
7117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 'F':
7127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign:
7137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return -1
7147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
7157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
7167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
717353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _check_nans(self, other=None, context=None):
7187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
7197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are sNaN, signal
7217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are NaN return nan
7227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
7237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Done before operations.
7257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
7267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
727636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self_is_nan = self._isnan()
728636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if other is None:
729636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            other_is_nan = False
730636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        else:
731636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            other_is_nan = other._isnan()
732636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
733636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self_is_nan or other_is_nan:
734636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if context is None:
735636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context = getcontext()
736636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
737636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self_is_nan == 2:
738636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation, 'sNaN',
7390f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        self)
740636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other_is_nan == 2:
741636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation, 'sNaN',
7420f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        other)
743636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self_is_nan:
744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._fix_nan(context)
745636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
746353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return other._fix_nan(context)
7477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
7487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7492fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def _compare_check_nans(self, other, context):
7502fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        """Version of _check_nans used for the signaling comparisons
7512fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        compare_signal, __le__, __lt__, __ge__, __gt__.
7522fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7532fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        Signal InvalidOperation if either self or other is a (quiet
7542fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        or signaling) NaN.  Signaling NaNs take precedence over quiet
7552fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        NaNs.
7562fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7572fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        Return 0 if neither operand is a NaN.
7582fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7592fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        """
7602fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if context is None:
7612fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            context = getcontext()
7622fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7632fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self._is_special or other._is_special:
7642fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            if self.is_snan():
7652fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7662fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving sNaN',
7672fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            self)
7682fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            elif other.is_snan():
7692fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7702fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving sNaN',
7712fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            other)
7722fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            elif self.is_qnan():
7732fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7742fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving NaN',
7752fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            self)
7762fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            elif other.is_qnan():
7772fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7782fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving NaN',
7792fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            other)
7802fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return 0
7812fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __nonzero__(self):
7831a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is nonzero; otherwise return False.
7847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7851a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        NaNs and infinities are considered nonzero.
7867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
78772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self._is_special or self._int != '0'
7887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7892fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def _cmp(self, other):
7902fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        """Compare the two non-NaN decimal instances self and other.
7917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7922fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        Returns -1 if self < other, 0 if self == other and 1
7932fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self > other.  This routine is for internal use only."""
794636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
7952fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self._is_special or other._is_special:
796636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return cmp(self._isinfinity(), other._isinfinity())
7977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
798353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # check for zeros;  note that cmp(0, -0) should return 0
799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not other:
801353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return 0
802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return -((-1)**other._sign)
804353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other:
805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return (-1)**self._sign
8067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
80759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # If different signs, neg one is less
8087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._sign < self._sign:
8097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -1
8107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign < other._sign:
8117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
8127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
813636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self_adjusted = self.adjusted()
814636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other_adjusted = other.adjusted()
815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_adjusted == other_adjusted:
81672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self_padded = self._int + '0'*(self._exp - other._exp)
81772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            other_padded = other._int + '0'*(other._exp - self._exp)
818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return cmp(self_padded, other_padded) * (-1)**self._sign
819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self_adjusted > other_adjusted:
8207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (-1)**self._sign
821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else: # self_adjusted < other_adjusted
8227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -((-1)**self._sign)
8237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8242fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # Note: The Decimal standard doesn't cover rich comparisons for
8252fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # Decimals.  In particular, the specification is silent on the
8262fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # subject of what should happen for a comparison involving a NaN.
8272fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # We take the following approach:
8282fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #
8292fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #   == comparisons involving a NaN always return False
8302fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #   != comparisons involving a NaN always return True
8312fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #   <, >, <= and >= comparisons involving a (quiet or signaling)
8322fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #      NaN signal InvalidOperation, and return False if the
8333a94ee05f77d0200cfb7988d02f3fdf292932a94Mark Dickinson    #      InvalidOperation is not trapped.
8342fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #
8352fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # This behavior is designed to conform as closely as possible to
8362fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # that specified by IEEE 754.
8372fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8380aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __eq__(self, other):
8392fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8402fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8412fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8422fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self.is_nan() or other.is_nan():
8432fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8442fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) == 0
8450aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
8460aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __ne__(self, other):
8472fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8482fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8492fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8502fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self.is_nan() or other.is_nan():
8512fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return True
8522fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) != 0
8532fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8542fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __lt__(self, other, context=None):
8552fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8562fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8572fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8582fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8592fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8602fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8612fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) < 0
8622fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8632fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __le__(self, other, context=None):
8642fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8652fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8662fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8672fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8682fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8692fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8702fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) <= 0
8712fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8722fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __gt__(self, other, context=None):
8732fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8742fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8752fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8762fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8772fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8782fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8792fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) > 0
8802fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8812fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __ge__(self, other, context=None):
8822fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8832fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8842fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8852fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8862fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8872fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8882fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) >= 0
8890aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
8907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, other, context=None):
8917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares one to another.
8927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 => a < b
8947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0  => a = b
8957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1  => a > b
8967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN => one is NaN
8977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Like __cmp__, but returns Decimal instances.
8987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
9007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
90159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # Compare(NaN, NaN) = NaN
902636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if (self._is_special or other and other._is_special):
903636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
904636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
905636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
9067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9072fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return Decimal(self._cmp(other))
9087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __hash__(self):
9107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """x.__hash__() <==> hash(x)"""
9117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Decimal integers must hash the same as the ints
91252b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        #
91352b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # The hash of a nonspecial noninteger Decimal must depend only
91452b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # on the value of that Decimal, and not on its representation.
915abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        # For example: hash(Decimal('100E-1')) == hash(Decimal('10')).
916bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger        if self._is_special:
917bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger            if self._isnan():
918bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger                raise TypeError('Cannot hash a NaN value.')
919bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger            return hash(str(self))
9208c202440699cef19602acc24822366d0d7c32083Facundo Batista        if not self:
9218c202440699cef19602acc24822366d0d7c32083Facundo Batista            return 0
9228c202440699cef19602acc24822366d0d7c32083Facundo Batista        if self._isinteger():
9238c202440699cef19602acc24822366d0d7c32083Facundo Batista            op = _WorkRep(self.to_integral_value())
9248c202440699cef19602acc24822366d0d7c32083Facundo Batista            # to make computation feasible for Decimals with large
9258c202440699cef19602acc24822366d0d7c32083Facundo Batista            # exponent, we use the fact that hash(n) == hash(m) for
9268c202440699cef19602acc24822366d0d7c32083Facundo Batista            # any two nonzero integers n and m such that (i) n and m
9278c202440699cef19602acc24822366d0d7c32083Facundo Batista            # have the same sign, and (ii) n is congruent to m modulo
9288c202440699cef19602acc24822366d0d7c32083Facundo Batista            # 2**64-1.  So we can replace hash((-1)**s*c*10**e) with
9298c202440699cef19602acc24822366d0d7c32083Facundo Batista            # hash((-1)**s*c*pow(10, e, 2**64-1).
9308c202440699cef19602acc24822366d0d7c32083Facundo Batista            return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1))
93152b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # The value of a nonzero nonspecial Decimal instance is
93252b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # faithfully represented by the triple consisting of its sign,
93352b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # its adjusted exponent, and its coefficient with trailing
93452b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # zeros removed.
93552b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        return hash((self._sign,
93652b25795c02442fc40f8932d05e5d728266339a4Facundo Batista                     self._exp+len(self._int),
93752b25795c02442fc40f8932d05e5d728266339a4Facundo Batista                     self._int.rstrip('0')))
9387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def as_tuple(self):
9407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as a triple tuple.
9417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        To show the internals exactly as they are.
9437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
944097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger        return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
9457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
9477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as an instance of Decimal."""
9487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Invariant:  eval(repr(d)) == d
949abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        return "Decimal('%s')" % str(self)
9507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def __str__(self, eng=False, context=None):
9527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return string representation of the number in scientific notation.
9537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Captures all of the information in the underlying representation.
9557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
9567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
95762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        sign = ['', '-'][self._sign]
958e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger        if self._is_special:
95962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            if self._exp == 'F':
96062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                return sign + 'Infinity'
96162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            elif self._exp == 'n':
96262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                return sign + 'NaN' + self._int
96362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            else: # self._exp == 'N'
96462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                return sign + 'sNaN' + self._int
96562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
96662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # number of digits of self._int to left of decimal point
96762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        leftdigits = self._exp + len(self._int)
96862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
96962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # dotplace is number of digits of self._int to the left of the
97062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # decimal point in the mantissa of the output string (that is,
97162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # after adjusting the exponent)
97262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        if self._exp <= 0 and leftdigits > -6:
97362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # no exponent required
97462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            dotplace = leftdigits
97562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        elif not eng:
97662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # usual scientific notation: 1 digit on left of the point
9777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            dotplace = 1
97862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        elif self._int == '0':
97962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # engineering notation, zero
98062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            dotplace = (leftdigits + 1) % 3 - 1
9817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
98262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # engineering notation, nonzero
98362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            dotplace = (leftdigits - 1) % 3 + 1
98462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
98562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        if dotplace <= 0:
98662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            intpart = '0'
98762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            fracpart = '.' + '0'*(-dotplace) + self._int
98862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        elif dotplace >= len(self._int):
98962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            intpart = self._int+'0'*(dotplace-len(self._int))
99062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            fracpart = ''
99162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        else:
99262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            intpart = self._int[:dotplace]
99362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            fracpart = '.' + self._int[dotplace:]
99462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        if leftdigits == dotplace:
99562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            exp = ''
99662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        else:
99762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            if context is None:
99862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                context = getcontext()
99962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
100062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
100162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        return sign + intpart + fracpart + exp
10027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, context=None):
10047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Convert to engineering-type string.
10057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Engineering notation has an exponent which is a multiple of 3, so there
10077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        are up to 3 digits left of the decimal place.
10087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Same rules for when in exponential and when as a value as in __str__.
10107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self.__str__(eng=True, context=context)
10127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __neg__(self, context=None):
10147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy with the sign switched.
10157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds, if it has reason.
10177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1018636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1019636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1020636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1021636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
10247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # -Decimal('0') is Decimal('0'), not Decimal('-0')
10250f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            ans = self.copy_abs()
10267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
1027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self.copy_negate()
1028636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1029636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1030636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
1031e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
10327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __pos__(self, context=None):
10347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy, unless it is a sNaN.
10357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds the number (if more then precision digits)
10377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1038636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1039636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1040636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1041636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
10447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # + (-0) = 0
10450f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            ans = self.copy_abs()
1046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
1047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = Decimal(self)
10487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1049636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1050636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
1051e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
10527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1053e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    def __abs__(self, round=True, context=None):
10547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of self.
10557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1056e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        If the keyword argument 'round' is false, do not round.  The
1057e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        expression self.__abs__(round=False) is equivalent to
1058e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        self.copy_abs().
10597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1060e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        if not round:
1061e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            return self.copy_abs()
1062e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista
1063636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1064636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1065636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1066636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
10697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__neg__(context=context)
10707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
10717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__pos__(context=context)
10727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
10747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __add__(self, other, context=None):
10767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns self + other.
10777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -INF + INF (or the reverse) cause InvalidOperation errors.
10797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1080636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1081267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1082267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
1083636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
10847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
10857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
10867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1087636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1088636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1089636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1090636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1092636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity():
109359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                # If both INF, same sign => same as both, opposite => error.
1094636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if self._sign != other._sign and other._isinfinity():
1095636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '-INF + INF')
1096636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal(self)
1097636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
109859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                return Decimal(other)  # Can't both be infinity here
10997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = min(self._exp, other._exp)
11017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negativezero = 0
11027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding == ROUND_FLOOR and self._sign != other._sign:
110359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If the answer is 0, the sign should be negative, in this case.
11047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            negativezero = 1
11057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
11077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = min(self._sign, other._sign)
11087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if negativezero:
11097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                sign = 1
111072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(sign, '0', exp)
1111e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
1112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
11137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
111499b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista            exp = max(exp, other._exp - context.prec-1)
1115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = other._rescale(exp, context.rounding)
1116e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
11177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not other:
111999b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista            exp = max(exp, self._exp - context.prec-1)
1120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._rescale(exp, context.rounding)
1121e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
11227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = _WorkRep(self)
11257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = _WorkRep(other)
1126e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        op1, op2 = _normalize(op1, op2, context.prec)
11277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result = _WorkRep()
11297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if op1.sign != op2.sign:
11307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # Equal and opposite
113117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.int == op2.int:
113272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(negativezero, '0', exp)
1133e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                ans = ans._fix(context)
1134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return ans
113517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.int < op2.int:
11367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1, op2 = op2, op1
113759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                # OK, now abs(op1) > abs(op2)
113817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.sign == 1:
113917931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger                result.sign = 1
11407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1.sign, op2.sign = op2.sign, op1.sign
11417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
114217931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger                result.sign = 0
114359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                # So we know the sign, and op1 > 0.
114417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        elif op1.sign == 1:
11457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.sign = 1
114617931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            op1.sign, op2.sign = (0, 0)
114717931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        else:
114817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            result.sign = 0
114959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # Now, op1 > abs(op2) > 0
11507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
115117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        if op2.sign == 0:
1152636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            result.int = op1.int + op2.int
11537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
1154636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            result.int = op1.int - op2.int
11557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.exp = op1.exp
11577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(result)
1158e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        ans = ans._fix(context)
11597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
11607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __radd__ = __add__
11627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __sub__(self, other, context=None):
1164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return self - other"""
1165636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1166267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1167267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
11687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1169636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1170636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context=context)
1171636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1172636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
11737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self - other is computed as self + other.copy_negate()
1175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self.__add__(other.copy_negate(), context=context)
11767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rsub__(self, other, context=None):
1178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return other - self"""
1179636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1180267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1181267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
11827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return other.__sub__(self, context=context)
11847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mul__(self, other, context=None):
11867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self * other.
11877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (+-) INF * 0 (or its reverse) raise InvalidOperation.
11897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1190636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1191267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1192267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
1193636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
11947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
11957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
11967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1197d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger        resultsign = self._sign ^ other._sign
11987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1199636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1200636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1201636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1202636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
1203636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1204636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity():
1205636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if not other:
1206636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '(+-)INF * 0')
1207b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[resultsign]
1208636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1209636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
1210636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if not self:
1211636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '0 * (+-)INF')
1212b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[resultsign]
12137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resultexp = self._exp + other._exp
12157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by zero
12177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self or not other:
121872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(resultsign, '0', resultexp)
1219e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            # Fixing in case the exponent is out of bounds
1220e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
12217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
12227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by power of 10
122472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if self._int == '1':
122572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(resultsign, other._int, resultexp)
1226e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
12277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
122872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if other._int == '1':
122972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(resultsign, self._int, resultexp)
1230e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
12317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
12327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1233636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        op1 = _WorkRep(self)
1234636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        op2 = _WorkRep(other)
1235636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
123672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
1237e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        ans = ans._fix(context)
12387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
12407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __rmul__ = __mul__
12417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12428aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    def __truediv__(self, other, context=None):
12437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self / other."""
1244636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1245267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1246cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return NotImplemented
1247636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
12487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
12497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
12507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1251636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        sign = self._sign ^ other._sign
1252636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1253636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1254636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1255636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
12567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return ans
12577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1258636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity() and other._isinfinity():
12597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
12607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._isinfinity():
1262b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[sign]
1263636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1264636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
1265636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context._raise_error(Clamped, 'Division by infinity')
126672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(sign, '0', context.Etiny())
1267636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1268636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # Special cases for zeroes
1269636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if not other:
1270cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if not self:
1271cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionUndefined, '0 / 0')
1272636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return context._raise_error(DivisionByZero, 'x / 0', sign)
12737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1274cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not self:
1275cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            exp = self._exp - other._exp
1276cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            coeff = 0
1277cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        else:
1278cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            # OK, so neither = 0, INF or NaN
1279cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            shift = len(other._int) - len(self._int) + context.prec + 1
1280cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            exp = self._exp - other._exp - shift
1281cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op1 = _WorkRep(self)
1282cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op2 = _WorkRep(other)
1283cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if shift >= 0:
1284cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                coeff, remainder = divmod(op1.int * 10**shift, op2.int)
1285cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1286cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
1287cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if remainder:
1288cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                # result is not exact; adjust to ensure correct rounding
1289cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                if coeff % 5 == 0:
1290cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    coeff += 1
1291cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1292cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                # result is exact; get as close to ideal exponent as possible
1293cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                ideal_exp = self._exp - other._exp
1294cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                while exp < ideal_exp and coeff % 10 == 0:
1295cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    coeff //= 10
1296cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    exp += 1
12977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
129872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(sign, str(coeff), exp)
1299cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return ans._fix(context)
13007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1301cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista    def _divide(self, other, context):
1302cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        """Return (self // other, self % other), to context.prec precision.
13037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1304cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        Assumes that neither self nor other is a NaN, that self is not
1305cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        infinite and that other is nonzero.
1306cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        """
1307cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        sign = self._sign ^ other._sign
1308cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if other._isinfinity():
1309cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            ideal_exp = self._exp
1310cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        else:
1311cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            ideal_exp = min(self._exp, other._exp)
13127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1313cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        expdiff = self.adjusted() - other.adjusted()
1314cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not self or other._isinfinity() or expdiff <= -2:
131572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return (_dec_from_triple(sign, '0', 0),
1316cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    self._rescale(ideal_exp, context.rounding))
1317cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if expdiff <= context.prec:
1318cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op1 = _WorkRep(self)
1319cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op2 = _WorkRep(other)
1320cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if op1.exp >= op2.exp:
1321cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                op1.int *= 10**(op1.exp - op2.exp)
1322cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1323cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                op2.int *= 10**(op2.exp - op1.exp)
1324cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            q, r = divmod(op1.int, op2.int)
1325cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if q < 10**context.prec:
132672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return (_dec_from_triple(sign, str(q), 0),
132772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                        _dec_from_triple(self._sign, str(r), ideal_exp))
13287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1329cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        # Here the quotient is too large to be representable
1330cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = context._raise_error(DivisionImpossible,
1331cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                                   'quotient too large in //, % or divmod')
1332cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return ans, ans
13337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13348aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    def __rtruediv__(self, other, context=None):
13358aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson        """Swaps self/other and returns __truediv__."""
1336636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1337267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1338267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13398aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson        return other.__truediv__(self, context=context)
13408aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson
13418aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    __div__ = __truediv__
13428aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    __rdiv__ = __rtruediv__
13437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __divmod__(self, other, context=None):
13457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1346cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        Return (self // other, self % other)
13477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1348cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        other = _convert_other(other)
1349cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if other is NotImplemented:
1350cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return other
1351cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1352cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if context is None:
1353cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            context = getcontext()
1354cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1355cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = self._check_nans(other, context)
1356cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if ans:
1357cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return (ans, ans)
1358cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1359cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        sign = self._sign ^ other._sign
1360cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if self._isinfinity():
1361cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if other._isinfinity():
1362cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
1363cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return ans, ans
1364cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1365b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return (_SignedInfinity[sign],
1366cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                        context._raise_error(InvalidOperation, 'INF % x'))
1367cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1368cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not other:
1369cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if not self:
1370cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
1371cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return ans, ans
1372cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1373cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return (context._raise_error(DivisionByZero, 'x // 0', sign),
1374cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                        context._raise_error(InvalidOperation, 'x % 0'))
1375cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1376cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        quotient, remainder = self._divide(other, context)
1377e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        remainder = remainder._fix(context)
1378cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return quotient, remainder
13797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rdivmod__(self, other, context=None):
13817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __divmod__."""
1382636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1383267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1384267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__divmod__(self, context=context)
13867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mod__(self, other, context=None):
13887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self % other
13907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1391636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1392267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1393267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1395cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if context is None:
1396cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            context = getcontext()
13977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1398cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = self._check_nans(other, context)
1399cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if ans:
1400cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return ans
14017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1402cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if self._isinfinity():
1403cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(InvalidOperation, 'INF % x')
1404cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        elif not other:
1405cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if self:
1406cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(InvalidOperation, 'x % 0')
1407cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1408cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionUndefined, '0 % 0')
1409cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1410cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        remainder = self._divide(other, context)[1]
1411e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        remainder = remainder._fix(context)
1412cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return remainder
14137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rmod__(self, other, context=None):
14157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __mod__."""
1416636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1417267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1418267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
14197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__mod__(self, context=context)
14207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, other, context=None):
14227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
14237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Remainder nearest to 0-  abs(remainder-near) <= other/2
14247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1425636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1426636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
14277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1428353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
14297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1430353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
1431353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
1432353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
14337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self == +/-infinity -> InvalidOperation
1435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
1436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'remainder_near(infinity, x)')
14387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # other == 0 -> either InvalidOperation or DivisionUndefined
1440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other:
1441353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self:
1442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation,
1443353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                            'remainder_near(x, 0)')
1444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1445353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(DivisionUndefined,
1446353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                            'remainder_near(0, 0)')
14477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # other = +/-infinity -> remainder = self
1449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._isinfinity():
1450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = Decimal(self)
1451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
14527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self = 0 -> remainder = self, with ideal exponent
1454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ideal_exponent = min(self._exp, other._exp)
1455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
145672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(self._sign, '0', ideal_exponent)
1457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
14587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # catch most cases of large or small quotient
1460353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        expdiff = self.adjusted() - other.adjusted()
1461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if expdiff >= context.prec + 1:
1462353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # expdiff >= prec+1 => abs(self/other) > 10**prec
1463cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(DivisionImpossible)
1464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if expdiff <= -2:
1465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # expdiff <= -2 => abs(self/other) < 0.1
1466353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._rescale(ideal_exponent, context.rounding)
1467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
14687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adjust both arguments to have the same exponent, then divide
1470353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op1 = _WorkRep(self)
1471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op2 = _WorkRep(other)
1472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if op1.exp >= op2.exp:
1473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op1.int *= 10**(op1.exp - op2.exp)
14747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
1475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op2.int *= 10**(op2.exp - op1.exp)
1476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        q, r = divmod(op1.int, op2.int)
1477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # remainder is r*10**ideal_exponent; other is +/-op2.int *
1478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 10**ideal_exponent.   Apply correction to ensure that
1479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # abs(remainder) <= abs(other)/2
1480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if 2*r + (q&1) > op2.int:
1481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            r -= op2.int
1482353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            q += 1
1483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if q >= 10**context.prec:
1485cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(DivisionImpossible)
1486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1487353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # result has same sign as self unless r is negative
1488353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        sign = self._sign
1489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if r < 0:
1490353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sign = 1-sign
1491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            r = -r
14927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
149372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(sign, str(r), ideal_exponent)
1494353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans._fix(context)
14957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __floordiv__(self, other, context=None):
14977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """self // other"""
1498cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        other = _convert_other(other)
1499cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if other is NotImplemented:
1500cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return other
1501cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1502cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if context is None:
1503cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            context = getcontext()
1504cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1505cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = self._check_nans(other, context)
1506cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if ans:
1507cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return ans
1508cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1509cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if self._isinfinity():
1510cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if other._isinfinity():
1511cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(InvalidOperation, 'INF // INF')
1512cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1513b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[self._sign ^ other._sign]
1514cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1515cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not other:
1516cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if self:
1517cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionByZero, 'x // 0',
1518cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                                            self._sign ^ other._sign)
1519cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1520cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionUndefined, '0 // 0')
1521cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1522cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return self._divide(other, context)[0]
15237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rfloordiv__(self, other, context=None):
15257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __floordiv__."""
1526636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1527267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1528267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
15297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__floordiv__(self, context=context)
15307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __float__(self):
15327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Float representation."""
15337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return float(str(self))
15347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __int__(self):
153646b0802ccd9a9c47b27a285526fbb2a8bee5b8cbBrett Cannon        """Converts self to an int, truncating if necessary."""
1537636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1538636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isnan():
1539636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context = getcontext()
1540636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidContext)
1541636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            elif self._isinfinity():
15428aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson                raise OverflowError("Cannot convert infinity to int")
1543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        s = (-1)**self._sign
15447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
154572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return s*int(self._int)*10**self._exp
1546605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger        else:
154772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return s*int(self._int[:self._exp] or '0')
15487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15495a05364049a7b0c3eeee94fb7b77e6b41036b3aeRaymond Hettinger    __trunc__ = __int__
15505a05364049a7b0c3eeee94fb7b77e6b41036b3aeRaymond Hettinger
1551116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    @property
1552116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def real(self):
1553116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return self
1554116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
1555116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    @property
1556116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def imag(self):
1557116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return Decimal(0)
1558116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
1559116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def conjugate(self):
1560116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return self
1561116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
1562116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def __complex__(self):
1563116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return complex(float(self))
1564116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
15657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __long__(self):
15667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts to a long.
15677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Equivalent to long(int(self))
15697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
15707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return long(self.__int__())
15717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1572353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _fix_nan(self, context):
1573353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Decapitate the payload of a NaN to fit the context"""
1574353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        payload = self._int
1575353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1576353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # maximum length of payload is precision if _clamp=0,
1577353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # precision-1 if _clamp=1.
1578353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        max_payload_len = context.prec - context._clamp
1579353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if len(payload) > max_payload_len:
158072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            payload = payload[len(payload)-max_payload_len:].lstrip('0')
158172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, payload, self._exp, True)
15826c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        return Decimal(self)
1583353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1584dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    def _fix(self, context):
15857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round if it is necessary to keep self within prec precision.
15867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds and fixes the exponent.  Does not raise on a sNaN.
15887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Arguments:
15907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self - Decimal instance
15917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context - context used.
15927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1593636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1594353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
1595353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self._isnan():
1596353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # decapitate payload if necessary
1597353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._fix_nan(context)
1598353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1599353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # self is +/-Infinity; return unaltered
16006c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return Decimal(self)
16017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1602353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if self is zero then exponent should be between Etiny and
1603353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.
1604353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Etiny = context.Etiny()
1605353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Etop = context.Etop()
16067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
1607353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exp_max = [context.Emax, Etop][context._clamp]
1608353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            new_exp = min(max(self._exp, Etiny), exp_max)
1609353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if new_exp != self._exp:
1610353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Clamped)
161172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(self._sign, '0', new_exp)
16127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
16136c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return Decimal(self)
16147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1615353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp_min is the smallest allowable exponent of the result,
1616353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # equal to max(self.adjusted()-context.prec+1, Etiny)
1617353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exp_min = len(self._int) + self._exp - context.prec
1618353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if exp_min > Etop:
1619353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # overflow: exp_min > Etop iff self.adjusted() > Emax
1620353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
1621353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
1622353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(Overflow, 'above Emax', self._sign)
1623353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_is_subnormal = exp_min < Etiny
1624353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_is_subnormal:
1625353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Subnormal)
1626353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exp_min = Etiny
16277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1628353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # round if self has too many digits
1629353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp < exp_min:
16307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
16312ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            digits = len(self._int) + self._exp - exp_min
16322ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            if digits < 0:
16332ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                self = _dec_from_triple(self._sign, '1', exp_min-1)
16342ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                digits = 0
16352ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            this_function = getattr(self, self._pick_rounding_function[context.rounding])
16362ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            changed = this_function(digits)
16372ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            coeff = self._int[:digits] or '0'
16382ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            if changed == 1:
16392ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                coeff = str(int(coeff)+1)
16402ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            ans = _dec_from_triple(self._sign, coeff, exp_min)
16412ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista
16422ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            if changed:
1643353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Inexact)
1644353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_is_subnormal:
1645353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    context._raise_error(Underflow)
1646353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if not ans:
1647353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        # raise Clamped on underflow to 0
1648353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        context._raise_error(Clamped)
1649353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                elif len(ans._int) == context.prec+1:
1650353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    # we get here only if rescaling rounds the
1651353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    # cofficient up to exactly 10**context.prec
1652353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if ans._exp < Etop:
165372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                        ans = _dec_from_triple(ans._sign,
165472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                                   ans._int[:-1], ans._exp+1)
1655353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    else:
1656353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        # Inexact and Rounded have already been raised
1657353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        ans = context._raise_error(Overflow, 'above Emax',
1658353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                                   self._sign)
16597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
16607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1661353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fold down if _clamp == 1 and self has too few digits
1662353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context._clamp == 1 and self._exp > Etop:
1663353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Clamped)
166472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self_padded = self._int + '0'*(self._exp - Etop)
166572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, self_padded, Etop)
16667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1667353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # here self was representable to begin with; return unchanged
16686c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        return Decimal(self)
16697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    _pick_rounding_function = {}
16717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1672353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # for each of the rounding functions below:
1673353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   self is a finite, nonzero Decimal
1674353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   prec is an integer satisfying 0 <= prec < len(self._int)
16752ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #
16762ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    # each function returns either -1, 0, or 1, as follows:
16772ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #   1 indicates that self should be rounded up (away from zero)
16782ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #   0 indicates that self should be truncated, and that all the
16792ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #     digits to be truncated are zeros (so the value is unchanged)
16802ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #  -1 indicates that there are nonzero digits to be truncated
16817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1682353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_down(self, prec):
1683353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Also known as round-towards-0, truncate."""
16842ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if _all_zeros(self._int, prec):
16852ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return 0
16862ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        else:
16872ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
16887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1689353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_up(self, prec):
1690353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds away from 0."""
16912ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        return -self._round_down(prec)
16927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1693353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_half_up(self, prec):
1694353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds 5 up (away from 0)"""
169572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if self._int[prec] in '56789':
16962ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return 1
16972ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        elif _all_zeros(self._int, prec):
16982ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return 0
1699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
17002ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
17017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1702353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_half_down(self, prec):
17037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round 5 down"""
17042ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if _exact_half(self._int, prec):
17052ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
17062ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        else:
17072ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return self._round_half_up(prec)
17087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_half_even(self, prec):
1710353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Round 5 to even, rest to nearest."""
17112ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if _exact_half(self._int, prec) and \
17122ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                (prec == 0 or self._int[prec-1] in '02468'):
17132ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
1714353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
17152ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return self._round_half_up(prec)
17167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1717353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_ceiling(self, prec):
17187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds up (not away from 0 if negative.)"""
17197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
1720353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._round_down(prec)
17217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
17222ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -self._round_down(prec)
17237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1724353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_floor(self, prec):
17257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds down (not towards 0 if negative)"""
17267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self._sign:
1727353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._round_down(prec)
17287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
17292ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -self._round_down(prec)
17307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1731353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_05up(self, prec):
1732353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Round down unless digit prec-1 is 0 or 5."""
17332ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if prec and self._int[prec-1] not in '05':
1734353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._round_down(prec)
17352ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        else:
17362ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -self._round_down(prec)
1737353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1738353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def fma(self, other, third, context=None):
1739353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Fused multiply-add.
17407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1741353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Returns self*other+third with no rounding of the intermediate
1742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        product self*other.
1743353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self and other are multiplied together, with no rounding of
1745353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the result.  The third operand is then added to the result,
1746353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        and a single final rounding is performed.
17477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1748353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1749353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
17507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
175158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        # compute product; raise InvalidOperation if either operand is
175258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        # a signaling NaN or if the product is zero times infinity.
175358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        if self._is_special or other._is_special:
175458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if context is None:
175558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                context = getcontext()
175658f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if self._exp == 'N':
17570f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                return context._raise_error(InvalidOperation, 'sNaN', self)
175858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if other._exp == 'N':
17590f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                return context._raise_error(InvalidOperation, 'sNaN', other)
176058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if self._exp == 'n':
176158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                product = self
176258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            elif other._exp == 'n':
176358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                product = other
176458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            elif self._exp == 'F':
176558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                if not other:
176658f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                    return context._raise_error(InvalidOperation,
176758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                                'INF * 0 in fma')
1768b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                product = _SignedInfinity[self._sign ^ other._sign]
176958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            elif other._exp == 'F':
177058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                if not self:
177158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                    return context._raise_error(InvalidOperation,
177258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                                '0 * INF in fma')
1773b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                product = _SignedInfinity[self._sign ^ other._sign]
177458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        else:
177558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            product = _dec_from_triple(self._sign ^ other._sign,
177658f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                       str(int(self._int) * int(other._int)),
177758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                       self._exp + other._exp)
17787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
177958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        third = _convert_other(third, raiseit=True)
178058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        return product.__add__(third, context)
17817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _power_modulo(self, other, modulo, context=None):
1783353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Three argument version of __pow__"""
17847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1785353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if can't convert other and modulo to Decimal, raise
1786353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # TypeError; there's no point returning NotImplemented (no
1787353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # equivalent of __rpow__ for three argument pow)
1788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
1789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo = _convert_other(modulo, raiseit=True)
17907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1791353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
1792353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
17937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1794353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # deal with NaNs: if there are any sNaNs then first one wins,
1795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (i.e. behaviour for NaNs is identical to that of fma)
1796353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_is_nan = self._isnan()
1797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other_is_nan = other._isnan()
1798353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo_is_nan = modulo._isnan()
1799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_is_nan or other_is_nan or modulo_is_nan:
1800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self_is_nan == 2:
1801353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, 'sNaN',
18020f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        self)
1803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other_is_nan == 2:
1804353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, 'sNaN',
18050f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        other)
1806353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if modulo_is_nan == 2:
1807353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, 'sNaN',
18080f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        modulo)
1809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self_is_nan:
18106c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return self._fix_nan(context)
1811353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other_is_nan:
18126c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return other._fix_nan(context)
18136c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return modulo._fix_nan(context)
1814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # check inputs: we apply same restrictions as Python's pow()
1816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (self._isinteger() and
1817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                other._isinteger() and
1818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                modulo._isinteger()):
1819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'pow() 3rd argument not allowed '
1821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'unless all arguments are integers')
1822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other < 0:
1823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'pow() 2nd argument cannot be '
1825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'negative when 3rd argument specified')
1826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not modulo:
1827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'pow() 3rd argument cannot be 0')
1829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # additional restriction for decimal: the modulus must be less
1831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # than 10**prec in absolute value
1832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if modulo.adjusted() >= context.prec:
1833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1834353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'insufficient precision: pow() 3rd '
1835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'argument must not have more than '
1836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'precision digits')
1837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # define 0**0 == NaN, for consistency with two-argument pow
1839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (even though it hurts!)
1840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other and not self:
1841353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1842353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'at least one of pow() 1st argument '
1843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'and 2nd argument must be nonzero ;'
1844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        '0**0 is not defined')
1845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute sign of result
1847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._iseven():
1848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sign = 0
1849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
1850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sign = self._sign
1851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # convert modulo to a Python integer, and self and other to
1853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Decimal integers (i.e. force their exponents to be >= 0)
1854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo = abs(int(modulo))
1855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        base = _WorkRep(self.to_integral_value())
1856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exponent = _WorkRep(other.to_integral_value())
1857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1858353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute result using integer pow()
1859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
1860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        for i in xrange(exponent.exp):
1861353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            base = pow(base, 10, modulo)
1862353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        base = pow(base, exponent.int, modulo)
1863353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
186472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(sign, str(base), 0)
1865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _power_exact(self, other, p):
1867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Attempt to compute self**other exactly.
1868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Given Decimals self and other and an integer p, attempt to
1870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        compute an exact result for the power self**other, with p
1871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        digits of precision.  Return None if self**other is not
1872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exactly representable in p digits.
1873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Assumes that elimination of special cases has already been
1875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        performed: self and other must both be nonspecial; self must
1876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        be positive and not numerically equal to 1; other must be
1877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        nonzero.  For efficiency, other._exp should not be too large,
1878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        so that 10**abs(other._exp) is a feasible calculation."""
1879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1880353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # In the comments below, we write x for the value of self and
1881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # y for the value of other.  Write x = xc*10**xe and y =
1882353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # yc*10**ye.
1883353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # The main purpose of this method is to identify the *failure*
1885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # of x**y to be exactly representable with as little effort as
1886353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # possible.  So we look for cheap and easy tests that
1887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # eliminate the possibility of x**y being exact.  Only if all
1888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # these tests are passed do we go on to actually compute x**y.
1889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Here's the main idea.  First normalize both x and y.  We
1891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # express y as a rational m/n, with m and n relatively prime
1892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # and n>0.  Then for x**y to be exactly representable (at
1893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # *any* precision), xc must be the nth power of a positive
1894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # integer and xe must be divisible by n.  If m is negative
1895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # then additionally xc must be a power of either 2 or 5, hence
1896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # a power of 2**n or 5**n.
1897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # There's a limit to how small |y| can be: if y=m/n as above
1899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # then:
1900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #  (1) if xc != 1 then for the result to be representable we
1902353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      need xc**(1/n) >= 2, and hence also xc**|y| >= 2.  So
1903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
1904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      2**(1/|y|), hence xc**|y| < 2 and the result is not
1905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      representable.
1906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #  (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1.  Hence if
1908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      |y| < 1/|xe| then the result is not representable.
1909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Note that since x is not equal to 1, at least one of (1) and
1911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (2) must apply.  Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
1912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
1913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # There's also a limit to how large y can be, at least if it's
1915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # positive: the normalized result will have coefficient xc**y,
1916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # so if it's representable then xc**y < 10**p, and y <
1917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # p/log10(xc).  Hence if y*log10(xc) >= p then the result is
1918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # not exactly representable.
1919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
1921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # so |y| < 1/xe and the result is not representable.
1922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
1923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # < 1/nbits(xc).
1924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        x = _WorkRep(self)
1926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        xc, xe = x.int, x.exp
1927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while xc % 10 == 0:
1928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc //= 10
1929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xe += 1
1930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _WorkRep(other)
1932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        yc, ye = y.int, y.exp
1933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while yc % 10 == 0:
1934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            yc //= 10
1935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ye += 1
1936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # case where xc == 1: result is 10**(xe*y), with xe*y
1938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # required to be an integer
1939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if xc == 1:
1940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ye >= 0:
1941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exponent = xe*yc*10**ye
1942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exponent, remainder = divmod(xe*yc, 10**-ye)
1944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if remainder:
1945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if y.sign == 1:
1947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exponent = -exponent
1948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # if other is a nonnegative integer, use ideal exponent
1949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._isinteger() and other._sign == 0:
1950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                ideal_exponent = self._exp*int(other)
1951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                zeros = min(exponent-ideal_exponent, p-1)
1952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                zeros = 0
195472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
1955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # case where y is negative: xc must be either a power
1957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # of 2 or a power of 5.
1958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if y.sign == 1:
1959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            last_digit = xc % 10
1960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if last_digit in (2,4,6,8):
1961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # quick test for power of 2
1962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if xc & -xc != xc:
1963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # now xc is a power of 2; e is its exponent
1965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                e = _nbits(xc)-1
1966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # find e*y and xe*y; both must be integers
1967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if ye >= 0:
1968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    y_as_int = yc*10**ye
1969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e = e*y_as_int
1970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe = xe*y_as_int
1971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
1972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    ten_pow = 10**-ye
1973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e, remainder = divmod(e*yc, ten_pow)
1974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
1975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
1976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe, remainder = divmod(xe*yc, ten_pow)
1977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
1978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
1979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if e*65 >= p*93: # 93/65 > log(10)/log(5)
1981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                xc = 5**e
1983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            elif last_digit == 5:
1985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # e >= log_5(xc) if xc is a power of 5; we have
1986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # equality all the way up to xc=5**2658
1987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                e = _nbits(xc)*28//65
1988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                xc, remainder = divmod(5**e, xc)
1989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if remainder:
1990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                while xc % 5 == 0:
1992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xc //= 5
1993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e -= 1
1994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if ye >= 0:
1995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    y_as_integer = yc*10**ye
1996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e = e*y_as_integer
1997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe = xe*y_as_integer
1998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
1999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    ten_pow = 10**-ye
2000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e, remainder = divmod(e*yc, ten_pow)
2001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
2002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
2003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe, remainder = divmod(xe*yc, ten_pow)
2004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
2005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
2006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if e*3 >= p*10: # 10/3 > log(10)/log(2)
2007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
2008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                xc = 2**e
2009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
20117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xc >= 10**p:
2013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xe = -e-xe
201572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, str(xc), xe)
20167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # now y is positive; find m and n such that y = m/n
2018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ye >= 0:
2019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            m, n = yc*10**ye, 1
2020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xe != 0 and len(str(abs(yc*xe))) <= -ye:
2022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc_bits = _nbits(xc)
2024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
2025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            m, n = yc, 10**(-ye)
2027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while m % 2 == n % 2 == 0:
2028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                m //= 2
2029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n //= 2
2030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while m % 5 == n % 5 == 0:
2031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                m //= 5
2032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n //= 5
2033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute nth root of xc*10**xe
2035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if n > 1:
2036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # if 1 < xc < 2**n then xc isn't an nth power
2037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xc != 1 and xc_bits <= n:
2038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xe, rem = divmod(xe, n)
2041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if rem != 0:
2042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # compute nth root of xc using Newton's method
2045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            a = 1L << -(-_nbits(xc)//n) # initial estimate
2046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
2047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                q, r = divmod(xc, a**(n-1))
2048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if a <= q:
2049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
2050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
2051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    a = (a*(n-1) + q)//n
2052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not (a == q and r == 0):
2053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc = a
2055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # now xc*10**xe is the nth root of the original xc*10**xe
2057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute mth power of xc*10**xe
2058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
2060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 10**p and the result is not representable.
2061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if xc > 1 and m > p*100//_log10_lb(xc):
2062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return None
2063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        xc = xc**m
2064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        xe *= m
2065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if xc > 10**p:
2066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return None
2067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # by this point the result *is* exactly representable
2069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adjust the exponent to get as close as possible to the ideal
2070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exponent, if necessary
2071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        str_xc = str(xc)
2072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._isinteger() and other._sign == 0:
2073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ideal_exponent = self._exp*int(other)
2074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            zeros = min(xe-ideal_exponent, p-len(str_xc))
2075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            zeros = 0
207772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
2078cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
2079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def __pow__(self, other, modulo=None, context=None):
2080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return self ** other [ % modulo].
20817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With two arguments, compute self**other.
20837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With three arguments, compute (self**other) % modulo.  For the
2085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        three argument form, the following restrictions on the
2086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        arguments hold:
20877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - all three arguments must be integral
2089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - other must be nonnegative
2090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - either self or other (or both) must be nonzero
2091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - modulo must be nonzero and must have at most p digits,
2092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista           where p is the context precision.
20937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        If any of these restrictions is violated the InvalidOperation
2095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        flag is raised.
2096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result of pow(self, other, modulo) is identical to the
2098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        result that would be obtained by computing (self**other) %
2099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo with unbounded precision, but is computed more
2100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        efficiently.  It is always exact.
2101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if modulo is not None:
2104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._power_modulo(other, modulo, context)
21057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2106636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
2107267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
2108267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
21097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
21127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # either argument is a NaN => result is NaN
2114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
2115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
2116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
21177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
2119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other:
2120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not self:
2121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, '0 ** 0')
2122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2123b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _One
21247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # result has sign 1 iff self._sign is 1 and other is an odd integer
2126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        result_sign = 0
2127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 1:
2128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._isinteger():
2129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if not other._iseven():
2130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    result_sign = 1
2131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # -ve**noninteger = NaN
2133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # (-0)**noninteger = 0**noninteger
2134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self:
2135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return context._raise_error(InvalidOperation,
2136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        'x ** y with x negative and y not an integer')
2137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # negate self, without doing any unwanted rounding
213872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self = self.copy_negate()
2139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
2141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
2142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._sign == 0:
214372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(result_sign, '0', 0)
2144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2145b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[result_sign]
2146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
2148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
2149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._sign == 0:
2150b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[result_sign]
2151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
215272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(result_sign, '0', 0)
2153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 1**other = 1, but the choice of exponent and the flags
2155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # depend on the exponent of self, and on whether other is a
2156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # positive integer, a negative integer, or neither
2157b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger        if self == _One:
2158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._isinteger():
2159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # exp = max(self._exp*max(int(other), 0),
2160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # 1-context.prec) but evaluating int(other) directly
2161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # is dangerous until we know other is small (other
2162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # could be 1e999999999)
2163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other._sign == 1:
2164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    multiplier = 0
2165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                elif other > context.prec:
2166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    multiplier = context.prec
2167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
2168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    multiplier = int(other)
2169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2170353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exp = self._exp * multiplier
2171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if exp < 1-context.prec:
2172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    exp = 1-context.prec
2173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    context._raise_error(Rounded)
2174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Inexact)
2176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Rounded)
2177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exp = 1-context.prec
2178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
217972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
2180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute adjusted exponent of self
2182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_adj = self.adjusted()
2183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self ** infinity is infinity if self > 1, 0 if self < 1
2185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self ** -infinity is infinity if self < 1, 0 if self > 1
2186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._isinfinity():
2187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if (other._sign == 0) == (self_adj < 0):
218872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(result_sign, '0', 0)
2189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2190b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _SignedInfinity[result_sign]
2191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # from here on, the result always goes through the call
2193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # to _fix at the end of this function.
2194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = None
2195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # crude test to catch cases of extreme overflow/underflow.  If
2197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(self)*other >= 10**bound and bound >= len(str(Emax))
2198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
2199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self**other >= 10**(Emax+1), so overflow occurs.  The test
2200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # for underflow is similar.
2201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        bound = self._log10_exp_bound() + other.adjusted()
2202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if (self_adj >= 0) == (other._sign == 0):
2203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self > 1 and other +ve, or self < 1 and other -ve
2204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # possibility of overflow
2205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if bound >= len(str(context.Emax)):
220672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(result_sign, '1', context.Emax+1)
2207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self > 1 and other -ve, or self < 1 and other +ve
2209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # possibility of underflow to 0
2210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            Etiny = context.Etiny()
2211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if bound >= len(str(-Etiny)):
221272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(result_sign, '1', Etiny-1)
2213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # try for an exact result with precision +1
2215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans is None:
2216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._power_exact(other, context.prec + 1)
2217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans is not None and result_sign == 1:
221872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(1, ans._int, ans._exp)
2219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # usual case: inexact result, x**y computed directly as exp(y*log(x))
2221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans is None:
2222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            p = context.prec
2223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            x = _WorkRep(self)
2224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc, xe = x.int, x.exp
2225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            y = _WorkRep(other)
2226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            yc, ye = y.int, y.exp
2227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if y.sign == 1:
2228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                yc = -yc
2229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # compute correctly rounded result:  start with precision +3,
2231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # then increase precision until result is unambiguously roundable
2232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            extra = 3
2233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
2234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
2235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if coeff % (5*10**(len(str(coeff))-p-1)):
2236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
2237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                extra += 3
2238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
223972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(result_sign, str(coeff), exp)
2240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the specification says that for non-integer other we need to
2242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # raise Inexact, even when the result is actually exact.  In
2243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the same way, we need to raise Underflow here if the result
2244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # is subnormal.  (The call to _fix will take care of raising
2245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Rounded and Subnormal, as usual.)
2246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other._isinteger():
2247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
2248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # pad with zeros up to length context.prec+1 if necessary
2249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if len(ans._int) <= context.prec:
2250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                expdiff = context.prec+1 - len(ans._int)
225172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
225272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                       ans._exp-expdiff)
2253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans.adjusted() < context.Emin:
2254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Underflow)
2255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # unlike exp, ln and log10, the power function respects the
2257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # rounding mode; no need to use ROUND_HALF_EVEN here
2258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
2260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def __rpow__(self, other, context=None):
2262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Swaps self/other and returns __pow__."""
2263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other)
2264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other is NotImplemented:
2265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return other
2266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return other.__pow__(self, context=context)
2267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def normalize(self, context=None):
2269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
2270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
2275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._check_nans(context=context)
2276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans:
2277353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return ans
2278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        dup = self._fix(context)
2280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if dup._isinfinity():
2281353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return dup
2282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not dup:
228472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(dup._sign, '0', 0)
2285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exp_max = [context.Emax, context.Etop()][context._clamp]
2286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        end = len(dup._int)
22877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = dup._exp
228872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        while dup._int[end-1] == '0' and exp < exp_max:
22897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp += 1
22907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            end -= 1
229172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(dup._sign, dup._int[:end], exp)
22927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2293bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista    def quantize(self, exp, rounding=None, context=None, watchexp=True):
22947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Quantize self so its exponent is the same as that of exp.
22957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Similar to self._rescale(exp._exp) but with error checking.
22977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2298bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista        exp = _convert_other(exp, raiseit=True)
2299bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista
2300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if rounding is None:
2303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rounding = context.rounding
2304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2305636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or exp._is_special:
2306636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(exp, context)
2307636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
2308636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
23097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2310636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if exp._isinfinity() or self._isinfinity():
2311636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if exp._isinfinity() and self._isinfinity():
23126c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return Decimal(self)  # if both are inf, it is OK
2313636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation,
2314636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                                        'quantize with one INF')
2315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2316bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista        # if we're not watching exponents, do a simple rescale
2317bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista        if not watchexp:
2318bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            ans = self._rescale(exp._exp, rounding)
2319bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            # raise Inexact and Rounded where appropriate
2320bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            if ans._exp > self._exp:
2321bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista                context._raise_error(Rounded)
2322bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista                if ans != self:
2323bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista                    context._raise_error(Inexact)
2324bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            return ans
2325bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista
2326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp._exp should be between Etiny and Emax
2327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (context.Etiny() <= exp._exp <= context.Emax):
2328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2329353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                   'target exponent out of bounds in quantize')
2330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2331353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
233272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(self._sign, '0', exp._exp)
2333353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
2334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2335353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_adjusted = self.adjusted()
2336353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_adjusted > context.Emax:
2337353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2338353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'exponent of quantize result too large for current context')
2339353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_adjusted - exp._exp + 1 > context.prec:
2340353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2341353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'quantize result has too many digits for current context')
2342353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2343353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._rescale(exp._exp, rounding)
2344353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans.adjusted() > context.Emax:
2345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'exponent of quantize result too large for current context')
2347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if len(ans._int) > context.prec:
2348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'quantize result has too many digits for current context')
2350353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2351353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # raise appropriate flags
2352353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans._exp > self._exp:
2353353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
2354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans != self:
2355353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Inexact)
2356353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans and ans.adjusted() < context.Emin:
2357353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Subnormal)
2358353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2359353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # call to fix takes care of any necessary folddown
2360353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2361353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
23627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, other):
23641a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self and other have the same exponent; otherwise
23651a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return False.
23667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23671a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        If either operand is a special value, the following rules are used:
23681a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista           * return True if both operands are infinities
23691a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista           * return True if both operands are NaNs
23701a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista           * otherwise, return False.
23717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23721a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        other = _convert_other(other, raiseit=True)
2373636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
23741a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista            return (self.is_nan() and other.is_nan() or
23751a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista                    self.is_infinite() and other.is_infinite())
23767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._exp == other._exp
23777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2378353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _rescale(self, exp, rounding):
2379353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rescale self so that the exponent is exp, either by padding with zeros
2380353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        or by truncating digits, using the given rounding mode.
2381353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2382353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Specials are returned without change.  This operation is
2383353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        quiet: it raises no flags, and uses no information from the
2384353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.
23857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = exp to scale to (an integer)
2387353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = rounding mode
23887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2389636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
23906c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
23917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
239272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, '0', exp)
23937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2394353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp >= exp:
2395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # pad answer with zeros if necessary
239672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign,
239772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                        self._int + '0'*(self._exp - exp), exp)
23987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2399353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # too many digits; round and lose data.  If self.adjusted() <
2400353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp-1, replace self by 10**(exp-1) before rounding
2401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        digits = len(self._int) + self._exp - exp
24027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if digits < 0:
240372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self = _dec_from_triple(self._sign, '1', exp-1)
2404353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            digits = 0
2405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        this_function = getattr(self, self._pick_rounding_function[rounding])
24062ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        changed = this_function(digits)
24072ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        coeff = self._int[:digits] or '0'
24082ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if changed == 1:
24092ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            coeff = str(int(coeff)+1)
24102ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        return _dec_from_triple(self._sign, coeff, exp)
24117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    def _round(self, places, rounding):
24131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        """Round a nonzero, nonspecial Decimal to a fixed number of
24141ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        significant figures, using the given rounding mode.
24151ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
24161ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        Infinities, NaNs and zeros are returned unaltered.
24171ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
24181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        This operation is quiet: it raises no flags, and uses no
24191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        information from the context.
24201ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
24211ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        """
24221ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if places <= 0:
24231ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            raise ValueError("argument should be at least 1 in _round")
24241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if self._is_special or not self:
24251ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            return Decimal(self)
24261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        ans = self._rescale(self.adjusted()+1-places, rounding)
24271ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # it can happen that the rescale alters the adjusted exponent;
24281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # for example when rounding 99.97 to 3 significant figures.
24291ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # When this happens we end up with an extra 0 at the end of
24301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # the number; a second rescale fixes this.
24311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if ans.adjusted() != self.adjusted():
24321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            ans = ans._rescale(ans.adjusted()+1-places, rounding)
24331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        return ans
24341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
2435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_exact(self, rounding=None, context=None):
2436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds to a nearby integer.
24377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        If no rounding mode is specified, take the rounding mode from
2439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the context.  This method raises the Rounded and Inexact flags
2440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        when appropriate.
24417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        See also: to_integral_value, which does exactly the same as
2443353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        this method except that it doesn't raise Inexact or Rounded.
2444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2445636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
2446636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
2447636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
2448636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
24496c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
24507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
24516c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
2452353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
245372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, '0', 0)
2454636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
2455636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
2456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if rounding is None:
2457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rounding = context.rounding
2458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._raise_error(Rounded)
2459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._rescale(0, rounding)
2460353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans != self:
2461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
24627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
24637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_value(self, rounding=None, context=None):
2465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds to the nearest integer, without raising inexact, rounded."""
2466353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2468353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if rounding is None:
2469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rounding = context.rounding
2470353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
2471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._check_nans(context=context)
2472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans:
2473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return ans
24746c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
2475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp >= 0:
24766c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
2477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._rescale(0, rounding)
24797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # the method name changed, but we provide also the old one, for compatibility
2481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    to_integral = to_integral_value
2482353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def sqrt(self, context=None):
2484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return the square root of self."""
24853b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson        if context is None:
24863b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson            context = getcontext()
24873b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson
2488636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
2489636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
2490636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
2491636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
24927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2493636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity() and self._sign == 0:
2494636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal(self)
24957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
2497353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # exponent = self._exp // 2.  sqrt(-0) = -0
249872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(self._sign, '0', self._exp // 2)
2499353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
25007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign == 1:
25027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
25037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2504353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # At this point self represents a positive number.  Let p be
2505353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the desired precision and express self in the form c*100**e
2506353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # with c a positive real number and e an integer, c and e
2507353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # being chosen so that 100**(p-1) <= c < 100**p.  Then the
2508353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
2509353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # <= sqrt(c) < 10**p, so the closest representable Decimal at
2510353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # precision p is n*10**e where n = round_half_even(sqrt(c)),
2511353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the closest integer to sqrt(c) with the even integer chosen
2512353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # in the case of a tie.
2513353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
2514353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # To ensure correct rounding in all cases, we use the
2515353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # following trick: we compute the square root to an extra
2516353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # place (precision p+1 instead of precision p), rounding down.
2517353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Then, if the result is inexact and its last digit is 0 or 5,
2518353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # we increase the last digit to 1 or 6 respectively; if it's
2519353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exact we leave the last digit alone.  Now the final round to
2520353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # p places (or fewer in the case of underflow) will round
2521353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # correctly and raise the appropriate flags.
2522353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2523353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # use an extra digit of precision
2524353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        prec = context.prec+1
2525353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2526353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # write argument in the form c*100**e where e = self._exp//2
2527353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # is the 'ideal' exponent, to be used if the square root is
2528353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exactly representable.  l is the number of 'digits' of c in
2529353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # base 100, so that 100**(l-1) <= c < 100**l.
2530353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
2531353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        e = op.exp >> 1
2532353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if op.exp & 1:
2533353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = op.int * 10
2534353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            l = (len(self._int) >> 1) + 1
25357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
2536353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = op.int
2537353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            l = len(self._int)+1 >> 1
2538353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2539353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # rescale so that c has exactly prec base 100 'digits'
2540353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        shift = prec-l
2541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if shift >= 0:
2542353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c *= 100**shift
2543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exact = True
25447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
2545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c, remainder = divmod(c, 100**-shift)
2546353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exact = not remainder
2547353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        e -= shift
2548353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2549353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # find n = floor(sqrt(c)) using Newton's method
2550353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        n = 10**prec
2551353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while True:
2552353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            q = c//n
2553353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if n <= q:
25547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
2555353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2556353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n = n + q >> 1
2557353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exact = exact and n*n == c
2558353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2559353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if exact:
2560353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result is exact; rescale to use ideal exponent e
2561353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if shift >= 0:
2562353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # assert n % 10**shift == 0
2563353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n //= 10**shift
2564353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2565353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n *= 10**-shift
2566353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            e += shift
25677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
2568353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result is not exact; fix last digit as described above
2569353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if n % 5 == 0:
2570353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n += 1
25717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
257272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(0, str(n), e)
25737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2574353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # round, and fit to current context
2575353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
2576353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
2577dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        ans = ans._fix(context)
2578353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
25797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2580353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
25817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, other, context=None):
25837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the larger value.
25847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2585353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Like max(self, other) except if one is not a number, returns
25867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
25877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2588353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
2589636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
25906c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
25916c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
25926c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
2593636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
259459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
2595636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # number is always returned
2596636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            sn = self._isnan()
2597636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            on = other._isnan()
2598636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if sn or on:
2599e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if on == 1 and sn == 0:
2600e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return self._fix(context)
2601e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if sn == 1 and on == 0:
2602e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return other._fix(context)
2603636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self._check_nans(other, context)
26047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26052fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self._cmp(other)
2606d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
260759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If both operands are finite and equal in numerical value
2608d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # then an ordering is applied:
2609d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
261059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If the signs differ then max returns the operand with the
2611d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # positive sign and min returns the operand with the negative sign
2612d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
261359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If the signs are the same then the exponent is used to select
2614353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # the result.  This is exactly the ordering used in compare_total.
2615353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
2616353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2617353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
26187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2619353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2620353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
2621636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2622e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
26237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, other, context=None):
26257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the smaller value.
26267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
262759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        Like min(self, other) except if one is not a number, returns
26287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
26297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2630353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
2631636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
26326c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
26336c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
26346c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
2635636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
263659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
2637636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # number is always returned
2638636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            sn = self._isnan()
2639636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            on = other._isnan()
2640636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if sn or on:
2641e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if on == 1 and sn == 0:
2642e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return self._fix(context)
2643e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if sn == 1 and on == 0:
2644e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return other._fix(context)
2645636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self._check_nans(other, context)
26467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26472fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self._cmp(other)
2648d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
2649353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
2650353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2651353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
2652353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
2653353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
26547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2655636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2656e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
26577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinteger(self):
26597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether self is an integer"""
2660353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
2661353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return False
26627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
26637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return True
26647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rest = self._int[self._exp:]
266572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return rest == '0'*len(rest)
26667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _iseven(self):
2668353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns True if self is even.  Assumes self is an integer."""
2669353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self or self._exp > 0:
2670353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return True
267172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self._int[-1+self._exp] in '02468'
26727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def adjusted(self):
26747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the adjusted exponent of self"""
26757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        try:
26767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._exp + len(self._int) - 1
267759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # If NaN or Infinity, self._exp is string
26787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        except TypeError:
26797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
26807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2681353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def canonical(self, context=None):
2682353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the same Decimal object.
2683353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2684353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        As we do not have different encodings for the same number, the
2685353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        received object already is in its canonical form.
2686353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2687353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self
2688353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2689353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_signal(self, other, context=None):
2690353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares self to the other operand numerically.
2691353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2692353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        It's pretty much like compare(), but all NaNs signal, with signaling
2693353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        NaNs taking precedence over quiet NaNs.
2694353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
26952fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other, raiseit = True)
26962fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
26972fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
26982fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return ans
2699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self.compare(other, context=context)
2700353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total(self, other):
2702353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares self to other using the abstract representations.
2703353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2704353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        This is not like the standard compare, which use their numerical
2705353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value. Note that a total ordering is defined for all possible abstract
2706353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        representations.
2707353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2708353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if one is negative and the other is positive, it's easy
2709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign and not other._sign:
2710b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _NegativeOne
2711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._sign and other._sign:
2712b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _One
2713353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        sign = self._sign
2714353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2715353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # let's handle both NaN types
2716353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_nan = self._isnan()
2717353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other_nan = other._isnan()
2718353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_nan or other_nan:
2719353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self_nan == other_nan:
2720353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self._int < other._int:
2721353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if sign:
2722b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                        return _One
2723353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    else:
2724b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                        return _NegativeOne
2725353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self._int > other._int:
2726353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if sign:
2727b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                        return _NegativeOne
2728353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    else:
2729b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                        return _One
2730b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _Zero
2731353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2732353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sign:
2733353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 1:
2734b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _NegativeOne
2735353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 1:
2736b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _One
2737353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 2:
2738b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _NegativeOne
2739353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 2:
2740b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _One
2741353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 1:
2743b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _One
2744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 1:
2745b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _NegativeOne
2746353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 2:
2747b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _One
2748353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 2:
2749b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                    return _NegativeOne
2750353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2751353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self < other:
2752b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _NegativeOne
2753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self > other:
2754b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _One
2755353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2756353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp < other._exp:
2757353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sign:
2758b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _One
2759353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2760b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _NegativeOne
2761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp > other._exp:
2762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sign:
2763b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _NegativeOne
2764353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2765b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger                return _One
2766b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger        return _Zero
2767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2768353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2769353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total_mag(self, other):
2770353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares self to other using abstract repr., ignoring sign.
2771353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2772353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Like compare_total, but with operand's sign ignored and assumed to be 0.
2773353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2774353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        s = self.copy_abs()
2775353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        o = other.copy_abs()
2776353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return s.compare_total(o)
2777353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2778353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_abs(self):
2779353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy with the sign set to 0. """
278072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, self._int, self._exp, self._is_special)
2781353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_negate(self):
2783353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy with the sign inverted."""
2784353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign:
278572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, self._int, self._exp, self._is_special)
2786353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
278772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(1, self._int, self._exp, self._is_special)
2788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_sign(self, other):
2790353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns self with the sign of other."""
279172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(other._sign, self._int,
279272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                self._exp, self._is_special)
2793353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2794353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def exp(self, context=None):
2795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns e ** self."""
2796353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2798353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(NaN) = NaN
2801353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
2802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
2803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
2804353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(-Infinity) = 0
2806353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == -1:
2807b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Zero
2808353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(0) = 1
2810353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
2811b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _One
2812353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(Infinity) = Infinity
2814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
2815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Decimal(self)
2816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the result is now guaranteed to be inexact (the true
2818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # mathematical result is transcendental). There's no need to
2819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # raise Rounded and Inexact here---they'll always be raised as
2820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # a result of the call to _fix.
2821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        p = context.prec
2822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        adj = self.adjusted()
2823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # we only need to do any computation for quite a small range
2825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # of adjusted exponents---for example, -29 <= adj <= 10 for
2826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the default context.  For smaller exponent the result is
2827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # indistinguishable from 1 at the given precision, while for
2828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # larger exponent the result either overflows or underflows.
2829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
2830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # overflow
283172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '1', context.Emax+1)
2832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
2833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # underflow to 0
283472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '1', context.Etiny()-1)
2835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self._sign == 0 and adj < -p:
2836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # p+1 digits; final round will raise correct flags
283772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
2838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self._sign == 1 and adj < -p-1:
2839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # p+1 digits; final round will raise correct flags
284072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '9'*(p+1), -p-1)
2841353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # general case
2842353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op = _WorkRep(self)
2844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c, e = op.int, op.exp
2845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if op.sign == 1:
2846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                c = -c
2847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # compute correctly rounded result: increase precision by
2849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # 3 digits at a time until we get an unambiguously
2850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # roundable result
2851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            extra = 3
2852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
2853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                coeff, exp = _dexp(c, e, p+extra)
2854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if coeff % (5*10**(len(str(coeff))-p-1)):
2855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
2856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                extra += 3
2857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
285872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, str(coeff), exp)
2859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # at this stage, ans should round correctly with *any*
2861353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # rounding mode, not just with ROUND_HALF_EVEN
2862353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
2863353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
2864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
2866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
2868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_canonical(self):
28701a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is canonical; otherwise return False.
28711a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista
28721a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        Currently, the encoding of a Decimal instance is always
28731a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        canonical, so this method returns True for any Decimal.
28741a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """
28751a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return True
2876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_finite(self):
28781a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is finite; otherwise return False.
2879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
28801a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        A Decimal instance is considered finite if it is neither
28811a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        infinite nor a NaN.
2882353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
28831a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return not self._is_special
2884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_infinite(self):
28861a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is infinite; otherwise return False."""
28871a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp == 'F'
2888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_nan(self):
28901a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a qNaN or sNaN; otherwise return False."""
28911a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp in ('n', 'N')
2892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_normal(self, context=None):
28941a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a normal number; otherwise return False."""
28951a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        if self._is_special or not self:
28961a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista            return False
2897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
28991a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return context.Emin <= self.adjusted() <= context.Emax
2900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_qnan(self):
29021a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a quiet NaN; otherwise return False."""
29031a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp == 'n'
2904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_signed(self):
29061a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is negative; otherwise return False."""
29071a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._sign == 1
2908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_snan(self):
29101a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a signaling NaN; otherwise return False."""
29111a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp == 'N'
2912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_subnormal(self, context=None):
29141a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is subnormal; otherwise return False."""
29151a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        if self._is_special or not self:
29161a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista            return False
2917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
29191a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self.adjusted() < context.Emin
2920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_zero(self):
29221a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a zero; otherwise return False."""
292372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return not self._is_special and self._int == '0'
2924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _ln_exp_bound(self):
2926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compute a lower bound for the adjusted exponent of self.ln().
2927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        In other words, compute r such that self.ln() >= 10**r.  Assumes
2928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        that self is finite and positive and that self != 1.
2929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
2932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        adj = self._exp + len(self._int) - 1
2933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj >= 1:
2934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
2935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str(adj*23//10)) - 1
2936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj <= -2:
2937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # argument <= 0.1
2938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str((-1-adj)*23//10)) - 1
2939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
2940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        c, e = op.int, op.exp
2941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj == 0:
2942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # 1 < self < 10
2943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            num = str(c-10**-e)
2944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            den = str(c)
2945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(num) - len(den) - (num < den)
2946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adj == -1, 0.1 <= self < 1
2947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return e + len(str(10**-e - c)) - 1
2948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def ln(self, context=None):
2951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the natural (base e) logarithm of self."""
2952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(NaN) = NaN
2957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
2958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
2959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
2960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(0.0) == -Infinity
2962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
2963b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _NegativeInfinity
2964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(Infinity) = Infinity
2966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
2967b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Infinity
2968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(1.0) == 0.0
2970b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger        if self == _One:
2971b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Zero
2972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(negative) raises InvalidOperation
2974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 1:
2975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'ln of a negative value')
2977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # result is irrational, so necessarily inexact
2979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
2980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        c, e = op.int, op.exp
2981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        p = context.prec
2982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # correctly rounded result: repeatedly increase precision by 3
2984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # until we get an unambiguously roundable result
2985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        places = p - self._ln_exp_bound() + 2 # at least p+3 places
2986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while True:
2987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            coeff = _dlog(c, e, places)
2988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # assert len(str(abs(coeff)))-p >= 1
2989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
2990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                break
2991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            places += 3
299272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
2993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
2995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
2996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
2998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
2999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _log10_exp_bound(self):
3001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compute a lower bound for the adjusted exponent of self.log10().
3002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        In other words, find r such that self.log10() >= 10**r.
3003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Assumes that self is finite and positive and that self != 1.
3004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # For x >= 10 or x < 0.1 we only need a bound on the integer
3007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # part of log10(self), and this comes directly from the
3008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exponent of x.  For 0.1 <= x <= 10 we use the inequalities
3009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
3010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (1-1/x)/2.31 > 0.  If x < 1 then |log10(x)| > (1-x)/2.31 > 0
3011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        adj = self._exp + len(self._int) - 1
3013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj >= 1:
3014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self >= 10
3015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str(adj))-1
3016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj <= -2:
3017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self < 0.1
3018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str(-1-adj))-1
3019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
3020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        c, e = op.int, op.exp
3021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj == 0:
3022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # 1 < self < 10
3023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            num = str(c-10**-e)
3024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            den = str(231*c)
3025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(num) - len(den) - (num < den) + 2
3026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adj == -1, 0.1 <= self < 1
3027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        num = str(10**-e-c)
3028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return len(num) + e - (num < "231") - 1
3029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def log10(self, context=None):
3031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the base 10 logarithm of self."""
3032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(NaN) = NaN
3037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(0.0) == -Infinity
3042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
3043b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _NegativeInfinity
3044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(Infinity) = Infinity
3046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
3047b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Infinity
3048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(negative or -Infinity) raises InvalidOperation
3050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 1:
3051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
3052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'log10 of a negative value')
3053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(10**n) = n
305572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
3056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # answer may need rounding
3057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = Decimal(self._exp + len(self._int) - 1)
3058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result is irrational, so necessarily inexact
3060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op = _WorkRep(self)
3061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c, e = op.int, op.exp
3062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            p = context.prec
3063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # correctly rounded result: repeatedly increase precision
3065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # until result is unambiguously roundable
3066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            places = p-self._log10_exp_bound()+2
3067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
3068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                coeff = _dlog10(c, e, places)
3069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # assert len(str(abs(coeff)))-p >= 1
3070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
3072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                places += 3
307372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
3074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
3076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
3077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
3078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
3079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
3080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logb(self, context=None):
3082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """ Returns the exponent of the magnitude of self's MSD.
3083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the integer which is the exponent of the magnitude
3085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        of the most significant digit of self (as though it were truncated
3086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        to a single digit while maintaining the value of that digit and
3087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        without limiting the resulting exponent).
3088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # logb(NaN) = NaN
3090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # logb(+/-Inf) = +Inf
3098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
3099b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Infinity
3100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # logb(0) = -Inf, DivisionByZero
3102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
3103cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(DivisionByZero, 'logb(0)', 1)
3104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # otherwise, simply return the adjusted exponent of self, as a
3106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Decimal.  Note that no attempt is made to fit the result
3107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # into the current context.
3108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return Decimal(self.adjusted())
3109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _islogical(self):
3111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return True if self is a logical operand.
3112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3113c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling        For being logical, it must be a finite number with a sign of 0,
3114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        an exponent of 0, and a coefficient whose digits must all be
3115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        either 0 or 1.
3116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign != 0 or self._exp != 0:
3118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return False
3119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        for dig in self._int:
312072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            if dig not in '01':
3121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return False
3122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return True
3123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _fill_logical(self, context, opa, opb):
3125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        dif = context.prec - len(opa)
3126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if dif > 0:
312772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            opa = '0'*dif + opa
3128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif dif < 0:
3129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            opa = opa[-context.prec:]
3130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        dif = context.prec - len(opb)
3131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if dif > 0:
313272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            opb = '0'*dif + opb
3133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif dif < 0:
3134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            opb = opb[-context.prec:]
3135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return opa, opb
3136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_and(self, other, context=None):
3138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies an 'and' operation between self and other's digits."""
3139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._islogical() or not other._islogical():
3142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fill to context.prec
3145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (opa, opb) = self._fill_logical(context, self._int, other._int)
3146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # make the operation, and clean starting zeroes
314872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
314972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
3150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_invert(self, context=None):
3152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Invert all its digits."""
3153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
315572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
315672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                context)
3157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_or(self, other, context=None):
3159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies an 'or' operation between self and other's digits."""
3160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._islogical() or not other._islogical():
3163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fill to context.prec
3166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (opa, opb) = self._fill_logical(context, self._int, other._int)
3167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # make the operation, and clean starting zeroes
316972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        result = "".join(str(int(a)|int(b)) for a,b in zip(opa,opb))
317072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
3171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_xor(self, other, context=None):
3173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies an 'xor' operation between self and other's digits."""
3174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._islogical() or not other._islogical():
3177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fill to context.prec
3180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (opa, opb) = self._fill_logical(context, self._int, other._int)
3181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # make the operation, and clean starting zeroes
318372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        result = "".join(str(int(a)^int(b)) for a,b in zip(opa,opb))
318472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
3185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def max_mag(self, other, context=None):
3187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
3188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
3189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
31906c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
31916c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
31926c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
3193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special or other._is_special:
3194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
3195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # number is always returned
3196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sn = self._isnan()
3197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            on = other._isnan()
3198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sn or on:
3199e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if on == 1 and sn == 0:
3200e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return self._fix(context)
3201e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if sn == 1 and on == 0:
3202e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return other._fix(context)
3203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._check_nans(other, context)
3204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
32052fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self.copy_abs()._cmp(other.copy_abs())
3206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == 0:
3207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
3208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
3210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = other
3211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
3213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3214e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
3215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def min_mag(self, other, context=None):
3217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
3218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
3219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
32206c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
32216c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
32226c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
3223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special or other._is_special:
3224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
3225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # number is always returned
3226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sn = self._isnan()
3227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            on = other._isnan()
3228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sn or on:
3229e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if on == 1 and sn == 0:
3230e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return self._fix(context)
3231e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                if sn == 1 and on == 0:
3232e29d435e0cefb3e1772f6de0844e628aac3cf98eFacundo Batista                    return other._fix(context)
3233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._check_nans(other, context)
3234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
32352fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self.copy_abs()._cmp(other.copy_abs())
3236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == 0:
3237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
3238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
3240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
3241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = other
3243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3244e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
3245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_minus(self, context=None):
3247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the largest representable number smaller than itself."""
3248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == -1:
3256b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _NegativeInfinity
3257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
325872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, '9'*context.prec, context.Etop())
3259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context.copy()
3261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._set_rounding(ROUND_FLOOR)
3262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._ignore_all_flags()
3263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        new_self = self._fix(context)
3264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if new_self != self:
3265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return new_self
326672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
326772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                            context)
3268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_plus(self, context=None):
3270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the smallest representable number larger than itself."""
3271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3277353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
3279b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger            return _Infinity
3280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == -1:
328172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(1, '9'*context.prec, context.Etop())
3282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context.copy()
3284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._set_rounding(ROUND_CEILING)
3285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._ignore_all_flags()
3286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        new_self = self._fix(context)
3287353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if new_self != self:
3288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return new_self
328972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
329072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                            context)
3291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_toward(self, other, context=None):
3293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the number closest to self, in the direction towards other.
3294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the closest representable number to self
3296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (excluding self) that is in the direction towards other,
3297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        unless both have the same value.  If the two operands are
3298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        numerically equal, then the result is a copy of self with the
3299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        sign set to be the same as the sign of other.
3300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
3302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3309353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
33102fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        comparison = self._cmp(other)
3311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if comparison == 0:
331272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return self.copy_sign(other)
3313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if comparison == -1:
3315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self.next_plus(context)
3316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else: # comparison == 1
3317353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self.next_minus(context)
3318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # decide which flags to raise using value of ans
3320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans._isinfinity():
3321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Overflow,
3322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                 'Infinite result from next_toward',
3323353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                 ans._sign)
3324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
3325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
3326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif ans.adjusted() < context.Emin:
3327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Underflow)
3328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Subnormal)
3329353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
3330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
3331353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # if precision == 1 then we don't raise Clamped for a
3332353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result 0E-Etiny.
3333353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not ans:
3334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Clamped)
3335353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3336353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
3337353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3338353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def number_class(self, context=None):
3339353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns an indication of the class of self.
3340353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3341353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The class is one of the following strings:
33420f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista          sNaN
33430f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista          NaN
3344353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Infinity
3345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Normal
3346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Subnormal
3347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Zero
3348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Zero
3349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Subnormal
3350353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Normal
3351353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Infinity
3352353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3353353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_snan():
3354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "sNaN"
3355353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_qnan():
3356353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "NaN"
3357353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        inf = self._isinfinity()
3358353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if inf == 1:
3359353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "+Infinity"
3360353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if inf == -1:
3361353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "-Infinity"
3362353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_zero():
3363353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self._sign:
3364353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "-Zero"
3365353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
3366353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "+Zero"
3367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3369353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_subnormal(context=context):
3370353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self._sign:
3371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "-Subnormal"
3372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
3373353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "+Subnormal"
3374353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # just a normal, regular, boring number, :)
3375353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign:
3376353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "-Normal"
3377353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3378353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "+Normal"
3379353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3380353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def radix(self):
3381353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Just returns 10, as this is Decimal, :)"""
3382353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return Decimal(10)
3383353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3384353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def rotate(self, other, context=None):
3385353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a rotated copy of self, value-of-other times."""
3386353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3387353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3388353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3389353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3390353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3391353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3392353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3393353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._exp != 0:
3394353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (-context.prec <= int(other) <= context.prec):
3396353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3397353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
33996c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3400353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # get values, pad if necessary
3402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        torot = int(other)
3403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotdig = self._int
3404353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        topad = context.prec - len(rotdig)
3405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if topad:
340672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            rotdig = '0'*topad + rotdig
3407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3408353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # let's rotate!
3409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotated = rotdig[torot:] + rotdig[:torot]
341072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(self._sign,
341172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                rotated.lstrip('0') or '0', self._exp)
3412353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def scaleb (self, other, context=None):
3414353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns self operand after adding the second value to its exp."""
3415353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3416353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3418353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3420353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3421353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3422353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._exp != 0:
3423353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        liminf = -2 * (context.Emax + context.prec)
3425353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        limsup =  2 * (context.Emax + context.prec)
3426353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (liminf <= int(other) <= limsup):
3427353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3428353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3429353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
34306c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3431353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
343272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
3433353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        d = d._fix(context)
3434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return d
3435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def shift(self, other, context=None):
3437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a shifted copy of self, value-of-other times."""
3438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3441353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3443353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3445353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._exp != 0:
3446353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (-context.prec <= int(other) <= context.prec):
3448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
34516c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3452353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # get values, pad if necessary
3454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        torot = int(other)
3455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not torot:
34566c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotdig = self._int
3458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        topad = context.prec - len(rotdig)
3459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if topad:
346072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            rotdig = '0'*topad + rotdig
3461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3462353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # let's shift!
3463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if torot < 0:
3464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rotated = rotdig[:torot]
3465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
346672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            rotated = rotdig + '0'*torot
3467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rotated = rotated[-context.prec:]
3468353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
346972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(self._sign,
347072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                    rotated.lstrip('0') or '0', self._exp)
3471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
347259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # Support for pickling, copy, and deepcopy
34737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __reduce__(self):
34747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (self.__class__, (str(self),))
34757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
34767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __copy__(self):
34777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
3478cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis            return self     # I'm immutable; therefore I am my own clone
34797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
34807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
34817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __deepcopy__(self, memo):
34827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
3483cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis            return self     # My components are also immutable
34847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
34857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
34861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # PEP 3101 support.  See also _parse_format_specifier and _format_align
34871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    def __format__(self, specifier, context=None):
3488f4da77765f8581e31620e9f49c68028e57b0ae85Mark Dickinson        """Format a Decimal instance according to the given specifier.
34891ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
34901ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        The specifier should be a standard format specifier, with the
34911ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        form described in PEP 3101.  Formatting types 'e', 'E', 'f',
34921ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        'F', 'g', 'G', and '%' are supported.  If the formatting type
34931ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        is omitted it defaults to 'g' or 'G', depending on the value
34941ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        of context.capitals.
34951ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
34961ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        At this time the 'n' format specifier type (which is supposed
34971ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        to use the current locale) is not supported.
34981ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        """
34991ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35001ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # Note: PEP 3101 says that if the type is not present then
35011ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # there should be at least one digit after the decimal point.
35021ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # We take the liberty of ignoring this requirement for
35031ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # Decimal---it's presumably there to make sure that
35041ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # format(float, '') behaves similarly to str(float).
35051ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if context is None:
35061ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            context = getcontext()
35071ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35081ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        spec = _parse_format_specifier(specifier)
35091ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35101ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # special values don't care about the type or precision...
35111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if self._is_special:
35121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            return _format_align(str(self), spec)
35131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35141ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # a type of None defaults to 'g' or 'G', depending on context
35151ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # if type is '%', adjust exponent of self accordingly
35161ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if spec['type'] is None:
35171ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            spec['type'] = ['g', 'G'][context.capitals]
35181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif spec['type'] == '%':
35191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            self = _dec_from_triple(self._sign, self._int, self._exp+2)
35201ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35211ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # round if necessary, taking rounding mode from the context
35221ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        rounding = context.rounding
35231ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        precision = spec['precision']
35241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if precision is not None:
35251ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            if spec['type'] in 'eE':
35261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                self = self._round(precision+1, rounding)
35271ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            elif spec['type'] in 'gG':
35281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                if len(self._int) > precision:
35291ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                    self = self._round(precision, rounding)
35301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            elif spec['type'] in 'fF%':
35311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                self = self._rescale(-precision, rounding)
35321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # special case: zeros with a positive exponent can't be
35331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # represented in fixed point; rescale them to 0e0.
35341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif not self and self._exp > 0 and spec['type'] in 'fF%':
35351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            self = self._rescale(0, rounding)
35361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # figure out placement of the decimal point
35381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        leftdigits = self._exp + len(self._int)
35391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if spec['type'] in 'fF%':
35401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            dotplace = leftdigits
35411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif spec['type'] in 'eE':
35421ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            if not self and precision is not None:
35431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = 1 - precision
35441ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            else:
35451ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = 1
35461ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif spec['type'] in 'gG':
35471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            if self._exp <= 0 and leftdigits > -6:
35481ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = leftdigits
35491ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            else:
35501ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = 1
35511ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35521ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # figure out main part of numeric string...
35531ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if dotplace <= 0:
35541ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = '0.' + '0'*(-dotplace) + self._int
35551ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif dotplace >= len(self._int):
35561ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            # make sure we're not padding a '0' with extra zeros on the right
35571ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            assert dotplace==len(self._int) or self._int != '0'
35581ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = self._int + '0'*(dotplace-len(self._int))
35591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        else:
35601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = self._int[:dotplace] + '.' + self._int[dotplace:]
35611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # ...then the trailing exponent, or trailing '%'
35631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if leftdigits != dotplace or spec['type'] in 'eE':
35641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
35651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = num + "{0}{1:+}".format(echar, leftdigits-dotplace)
35661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif spec['type'] == '%':
35671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = num + '%'
35681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # add sign
35701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if self._sign == 1:
35711ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = '-' + num
35721ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        return _format_align(num, spec)
35731ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35741ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
357572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batistadef _dec_from_triple(sign, coefficient, exponent, special=False):
357672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    """Create a decimal instance directly, without any validation,
357772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    normalization (e.g. removal of leading zeros) or argument
357872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    conversion.
357972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
358072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    This function is for *internal use only*.
358172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    """
358272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
358372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self = object.__new__(Decimal)
358472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._sign = sign
358572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._int = coefficient
358672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._exp = exponent
358772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._is_special = special
358872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
358972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    return self
359072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
359159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Context class #######################################################
3592cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
35937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3594cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis# get rounding method function:
359559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batistarounding_functions = [name for name in Decimal.__dict__.keys()
359659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                                    if name.startswith('_round_')]
35977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerfor name in rounding_functions:
359859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
35997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    globalname = name[1:].upper()
36007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    val = globals()[globalname]
36017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Decimal._pick_rounding_function[val] = name
36027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettingerdel name, val, globalname, rounding_functions
36047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3605ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlanclass _ContextManager(object):
36068b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """Context manager class to support localcontext().
36071a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
3608ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan      Sets a copy of the supplied context in __enter__() and restores
36098b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan      the previous decimal context in __exit__()
36108b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """
36111a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __init__(self, new_context):
3612ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan        self.new_context = new_context.copy()
36131a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __enter__(self):
36141a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        self.saved_context = getcontext()
36151a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        setcontext(self.new_context)
36161a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        return self.new_context
36171a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __exit__(self, t, v, tb):
36181a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        setcontext(self.saved_context)
36191a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
36207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Context(object):
36217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Contains the context for a Decimal instance.
36227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Contains:
36247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    prec - precision (for use in rounding, division, square roots..)
362559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    rounding - rounding type (how you round)
3626bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger    traps - If traps[exception] = 1, then the exception is
36277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    raised when it is caused.  Otherwise, a value is
36287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    substituted in.
36291840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson    flags  - When an exception is caused, flags[exception] is set.
36307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             (Whether or not the trap_enabler is set)
36317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             Should be reset by user of Decimal instance.
36320ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emin -   Minimum exponent
36330ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emax -   Maximum exponent
36347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    capitals -      If 1, 1*10^1 is printed as 1E+1.
36357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    If 0, printed as 1e1
3636e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger    _clamp - If 1, change exponents if too high (Default 0)
36377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
36389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger
36397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, prec=None, rounding=None,
3640abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger                 traps=None, flags=None,
36410ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                 Emin=None, Emax=None,
3642e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger                 capitals=None, _clamp=0,
3643abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger                 _ignored_flags=None):
3644abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger        if flags is None:
3645abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger            flags = []
3646abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger        if _ignored_flags is None:
3647abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger            _ignored_flags = []
3648bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not isinstance(flags, dict):
364971f3b85497f25bad3b00555173c51378f64edbb5Mark Dickinson            flags = dict([(s, int(s in flags)) for s in _signals])
3650b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
3651bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if traps is not None and not isinstance(traps, dict):
365271f3b85497f25bad3b00555173c51378f64edbb5Mark Dickinson            traps = dict([(s, int(s in traps)) for s in _signals])
3653b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
36547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for name, val in locals().items():
36557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if val is None:
3656eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettinger                setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
36577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
36587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                setattr(self, name, val)
36597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        del self.self
36607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3661b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger    def __repr__(self):
3662bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        """Show the current context."""
3663b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        s = []
366459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
366559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
366659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                 % vars(self))
366759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        names = [f.__name__ for f, v in self.flags.items() if v]
366859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        s.append('flags=[' + ', '.join(names) + ']')
366959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        names = [t.__name__ for t, v in self.traps.items() if v]
367059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        s.append('traps=[' + ', '.join(names) + ']')
3671b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        return ', '.join(s) + ')'
3672b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger
3673d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger    def clear_flags(self):
3674d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        """Reset all flags to zero"""
3675d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        for flag in self.flags:
3676b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger            self.flags[flag] = 0
3677d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger
36789fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def _shallow_copy(self):
36799fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a shallow copy from self."""
3680e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        nc = Context(self.prec, self.rounding, self.traps,
3681e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.flags, self.Emin, self.Emax,
3682e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.capitals, self._clamp, self._ignored_flags)
36837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return nc
36849fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger
36859fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def copy(self):
36869fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a deep copy from self."""
368759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        nc = Context(self.prec, self.rounding, self.traps.copy(),
3688e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.flags.copy(), self.Emin, self.Emax,
3689e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.capitals, self._clamp, self._ignored_flags)
36909fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        return nc
36919ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    __copy__ = copy
36927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36935aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    def _raise_error(self, condition, explanation = None, *args):
36947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Handles an error
36957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the flag is in _ignored_flags, returns the default response.
36971840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson        Otherwise, it sets the flag, then, if the corresponding
36987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        trap_enabler is set, it reaises the exception.  Otherwise, it returns
36991840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson        the default value after setting the flag.
37007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
37015aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        error = _condition_map.get(condition, condition)
37027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if error in self._ignored_flags:
370359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # Don't touch the flag
37047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return error().handle(self, *args)
37057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37061840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson        self.flags[error] = 1
3707bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not self.traps[error]:
370859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # The errors define how to handle themselves.
37095aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger            return condition().handle(self, *args)
37107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Errors should only be risked on copies of the context
371259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # self._ignored_flags = []
37138aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson        raise error(explanation)
37147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_all_flags(self):
37167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore all flags, if they are raised"""
3717fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger        return self._ignore_flags(*_signals)
37187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_flags(self, *flags):
37207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore the flags, if they are raised"""
37217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Do not mutate-- This way, copies of a context leave the original
37227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # alone.
37237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self._ignored_flags = (self._ignored_flags + list(flags))
37247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return list(flags)
37257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _regard_flags(self, *flags):
37277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Stop ignoring the flags, if they are raised"""
37287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if flags and isinstance(flags[0], (tuple,list)):
37297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            flags = flags[0]
37307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for flag in flags:
37317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._ignored_flags.remove(flag)
37327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
373353663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan    # We inherit object.__hash__, so we must deny this explicitly
373453663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan    __hash__ = None
37355aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger
37367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etiny(self):
37377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns Etiny (= Emin - prec + 1)"""
37387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emin - self.prec + 1)
37397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etop(self):
3741e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """Returns maximum exponent (= Emax - prec + 1)"""
37427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emax - self.prec + 1)
37437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _set_rounding(self, type):
37457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Sets the rounding type.
37467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Sets the rounding type, and returns the current (previous)
37487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding type.  Often used like:
37497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context = context.copy()
37517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # so you don't change the calling context
37527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # if an error occurs in the middle.
37537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_UP)
37547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = self.__sub__(other, context=context)
37557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding(rounding)
37567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This will make it round up for that operation.
37587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
37597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = self.rounding
37607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.rounding= type
37617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rounding
37627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3763fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger    def create_decimal(self, num='0'):
376459bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        """Creates a new Decimal instance but using self as context.
376559bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson
376659bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        This method implements the to-number operation of the
376759bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        IBM Decimal specification."""
376859bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson
376959bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        if isinstance(num, basestring) and num != num.strip():
377059bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson            return self._raise_error(ConversionSyntax,
377159bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson                                     "no trailing or leading whitespace is "
377259bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson                                     "permitted.")
377359bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson
37747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        d = Decimal(num, context=self)
3775353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if d._isnan() and len(d._int) > self.prec - self._clamp:
3776353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._raise_error(ConversionSyntax,
3777353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                     "diagnostic info too long in NaN")
3778dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        return d._fix(self)
37797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3780f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger    def create_decimal_from_float(self, f):
3781f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        """Creates a new Decimal instance from a float but rounding using self
3782f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        as the context.
3783f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
3784f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> context = Context(prec=5, rounding=ROUND_DOWN)
3785f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> context.create_decimal_from_float(3.1415926535897932)
3786f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Decimal('3.1415')
3787f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> context = Context(prec=5, traps=[Inexact])
3788f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        >>> context.create_decimal_from_float(3.1415926535897932)
3789f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Traceback (most recent call last):
3790f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger            ...
3791f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        Inexact: None
3792f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
3793f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        """
3794f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        d = Decimal.from_float(f)       # An exact conversion
3795f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger        return d._fix(self)             # Apply the context rounding
3796f4d8597a59990c41bc9cc8d499d8bc919d7ebf2dRaymond Hettinger
379759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # Methods
37987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def abs(self, a):
37997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of the operand.
38007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the operand is negative, the result is the same as using the minus
380259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation on the operand.  Otherwise, the result is the same as using
38037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the plus operation on the operand.
38047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('2.1'))
3806abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
38079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-100'))
3808abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
38099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('101.5'))
3810abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('101.5')
38119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-101.5'))
3812abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('101.5')
38137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
38147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__abs__(context=self)
38157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def add(self, a, b):
38177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the sum of the two operands.
38187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
3820abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('19.00')
38219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
3822abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.02E+4')
38237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
38247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__add__(b, context=self)
38257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _apply(self, a):
3827dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        return str(a._fix(self))
38287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def canonical(self, a):
3830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the same Decimal object.
3831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        As we do not have different encodings for the same number, the
3833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        received object already is in its canonical form.
3834353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.canonical(Decimal('2.50'))
3836abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.50')
3837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.canonical(context=self)
3839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
38407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, a, b):
38417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares values numerically.
38427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the signs of the operands differ, a value representing each operand
38447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ('-1' if the operand is less than zero, '0' if the operand is zero or
38457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negative zero, or '1' if the operand is greater than zero) is used in
38467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        place of that operand for the comparison instead of the actual
38477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operand.
38487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The comparison is then effected by subtracting the second operand from
38507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the first and then returning a value according to the result of the
38517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        subtraction: '-1' if the result is less than zero, '0' if the result is
38527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        zero or negative zero, or '1' if the result is greater than zero.
38537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
3855abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
38569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
3857abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
38589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
3859abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
38609ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
3861abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
38629ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
3863abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
38649ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
3865abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
38667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
38677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.compare(b, context=self)
38687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_signal(self, a, b):
3870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values of the two operands numerically.
3871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        It's pretty much like compare(), but all NaNs signal, with signaling
3873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        NaNs taking precedence over quiet NaNs.
3874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext
3876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
3877abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
3879abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
3880353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.flags[InvalidOperation] = 0
3881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3882353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        0
3883353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
3884abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
3885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3886353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        1
3887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.flags[InvalidOperation] = 0
3888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        0
3890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
3891abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
3892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        1
3894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.compare_signal(b, context=self)
3896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total(self, a, b):
3898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares two operands using their abstract representation.
3899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        This is not like the standard compare, which use their numerical
3901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value. Note that a total ordering is defined for all possible abstract
3902353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        representations.
3903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
3905abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('-127'),  Decimal('12'))
3907abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
3909abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
3911abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
3912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('12.300'))
3913abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
3914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('NaN'))
3915abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.compare_total(b)
3918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total_mag(self, a, b):
3920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares two operands using their abstract representation ignoring sign.
3921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Like compare_total, but with operand's sign ignored and assumed to be 0.
3923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.compare_total_mag(b)
3925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_abs(self, a):
3927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy of the operand with the sign set to 0.
3928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_abs(Decimal('2.1'))
3930abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
3931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_abs(Decimal('-100'))
3932abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
3933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.copy_abs()
3935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_decimal(self, a):
3937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy of the decimal objet.
3938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_decimal(Decimal('2.1'))
3940abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
3941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
3942abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00')
3943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
39446c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        return Decimal(a)
3945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_negate(self, a):
3947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy of the operand with the sign inverted.
3948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_negate(Decimal('101.5'))
3950abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-101.5')
3951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_negate(Decimal('-101.5'))
3952abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('101.5')
3953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.copy_negate()
3955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_sign(self, a, b):
3957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Copies the second operand's sign to the first one.
3958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        In detail, it returns a copy of the first operand with the sign
3960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        equal to the sign of the second operand.
3961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
3963abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.50')
3964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
3965abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.50')
3966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
3967abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.50')
3968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
3969abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.50')
3970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.copy_sign(b)
3972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
39737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide(self, a, b):
39747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Decimal division in a specified context.
39757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
39769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
3977abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.333333333')
39789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
3979abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.666666667')
39809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
3981abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.5')
39829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
3983abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.1')
39849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
3985abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
39869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
3987abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('4.00')
39889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
3989abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.20')
39909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
3991abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
39929ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
3993abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1000')
39949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
3995abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.20E+6')
39967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
39977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__div__(b, context=self)
39987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
39997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide_int(self, a, b):
40007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Divides two numbers and returns the integer part of the result.
40017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
40029ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
4003abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
40049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
4005abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
40069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
4007abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
40087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
40097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__floordiv__(b, context=self)
40107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
40117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divmod(self, a, b):
40127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__divmod__(b, context=self)
40137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def exp(self, a):
4015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns e ** a.
4016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('-Infinity'))
4021abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('-1'))
4023abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.367879441')
4024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('0'))
4025abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('1'))
4027abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.71828183')
4028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('0.693147181'))
4029abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.00000000')
4030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('+Infinity'))
4031abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.exp(context=self)
4034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def fma(self, a, b, c):
4036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a multiplied by b, plus c.
4037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The first two operands are multiplied together, using multiply,
4039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the third operand is then added to the result of that
4040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        multiplication, using add, all with only one final rounding.
4041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
4043abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('22')
4044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
4045abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-8')
4046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
4047abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.38435736E+12')
4048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.fma(b, c, context=self)
4050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_canonical(self, a):
40521a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is canonical; otherwise return False.
40531a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista
40541a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        Currently, the encoding of a Decimal instance is always
40551a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        canonical, so this method returns True for any Decimal.
4056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_canonical(Decimal('2.50'))
40581a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
40601a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return a.is_canonical()
4061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_finite(self, a):
40631a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is finite; otherwise return False.
4064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
40651a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        A Decimal instance is considered finite if it is neither
40661a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        infinite nor a NaN.
4067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('2.50'))
40691a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('-0.3'))
40711a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('0'))
40731a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('Inf'))
40751a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('NaN'))
40771a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_finite()
4080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_infinite(self, a):
40821a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is infinite; otherwise return False.
4083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_infinite(Decimal('2.50'))
40851a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_infinite(Decimal('-Inf'))
40871a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_infinite(Decimal('NaN'))
40891a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_infinite()
4092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_nan(self, a):
40941a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a qNaN or sNaN;
40951a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        otherwise return False.
4096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_nan(Decimal('2.50'))
40981a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_nan(Decimal('NaN'))
41001a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_nan(Decimal('-sNaN'))
41021a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_nan()
4105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_normal(self, a):
41071a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a normal number;
41081a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        otherwise return False.
4109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('2.50'))
41141a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('0.1E-999'))
41161a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('0.00'))
41181a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('-Inf'))
41201a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('NaN'))
41221a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_normal(context=self)
4125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_qnan(self, a):
41271a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a quiet NaN; otherwise return False.
4128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_qnan(Decimal('2.50'))
41301a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_qnan(Decimal('NaN'))
41321a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_qnan(Decimal('sNaN'))
41341a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_qnan()
4137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_signed(self, a):
41391a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is negative; otherwise return False.
4140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_signed(Decimal('2.50'))
41421a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_signed(Decimal('-12'))
41441a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_signed(Decimal('-0'))
41461a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_signed()
4149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_snan(self, a):
41511a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a signaling NaN;
41521a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        otherwise return False.
4153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_snan(Decimal('2.50'))
41551a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_snan(Decimal('NaN'))
41571a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_snan(Decimal('sNaN'))
41591a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_snan()
4162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_subnormal(self, a):
41641a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is subnormal; otherwise return False.
4165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('2.50'))
41701a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('0.1E-999'))
41721a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('0.00'))
41741a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('-Inf'))
41761a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('NaN'))
41781a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_subnormal(context=self)
4181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_zero(self, a):
41831a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a zero; otherwise return False.
4184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_zero(Decimal('0'))
41861a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_zero(Decimal('2.50'))
41881a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_zero(Decimal('-0E+2'))
41901a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_zero()
4193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def ln(self, a):
4195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the natural (base e) logarithm of the operand.
4196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('0'))
4201abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('1.000'))
4203abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('2.71828183'))
4205abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.00000000')
4206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('10'))
4207abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.30258509')
4208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('+Infinity'))
4209abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.ln(context=self)
4212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def log10(self, a):
4214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the base 10 logarithm of the operand.
4215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('0'))
4220abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('0.001'))
4222abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-3')
4223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('1.000'))
4224abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('2'))
4226abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.301029996')
4227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('10'))
4228abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('70'))
4230abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.84509804')
4231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('+Infinity'))
4232abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.log10(context=self)
4235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logb(self, a):
4237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """ Returns the exponent of the magnitude of the operand's MSD.
4238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the integer which is the exponent of the magnitude
4240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        of the most significant digit of the operand (as though the
4241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        operand were truncated to a single digit while maintaining the
4242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value of that digit and without limiting the resulting exponent).
4243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('250'))
4245abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
4246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('2.50'))
4247abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('0.03'))
4249abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-2')
4250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('0'))
4251abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logb(context=self)
4254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_and(self, a, b):
4256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies the logical operation 'and' between each operand's digits.
4257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operands must be both logical numbers.
4259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
4261abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
4263abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
4265abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
4267abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
4269abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1000')
4270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
4271abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
4272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_and(b, context=self)
4274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_invert(self, a):
4276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Invert all the digits in the operand.
4277353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operand must be a logical number.
4279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('0'))
4281abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('111111111')
4282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('1'))
4283abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('111111110')
4284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('111111111'))
4285abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('101010101'))
4287abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10101010')
4288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4289353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_invert(context=self)
4290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_or(self, a, b):
4292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies the logical operation 'or' between each operand's digits.
4293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operands must be both logical numbers.
4295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
4297abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
4299abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
4301abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
4303abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
4305abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1110')
4306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
4307abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1110')
4308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4309353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_or(b, context=self)
4310353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_xor(self, a, b):
4312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies the logical operation 'xor' between each operand's digits.
4313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operands must be both logical numbers.
4315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
4317abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
4319abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
4321abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
4323abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
4325abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('110')
4326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
4327abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1101')
4328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4329353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_xor(b, context=self)
4330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
43317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, a,b):
43327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """max compares two values numerically and returns the maximum.
43337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
4335c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling        Otherwise, the operands are compared as though by the compare
433659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation.  If they are numerically equal then the left-hand operand
433759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        is chosen as the result.  Otherwise the maximum (closer to positive
43387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
43397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
4341abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
43429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
4343abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
43449ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
4345abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4346d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
4347abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7')
43487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
43497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.max(b, context=self)
43507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4351353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def max_mag(self, a, b):
4352353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
4353353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.max_mag(b, context=self)
4354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
43557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, a,b):
43567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """min compares two values numerically and returns the minimum.
43577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
4359c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling        Otherwise, the operands are compared as though by the compare
436059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation.  If they are numerically equal then the left-hand operand
436159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        is chosen as the result.  Otherwise the minimum (closer to negative
43627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
43637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43649ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
4365abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
43669ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
4367abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-10')
43689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
4369abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
4370d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
4371abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7')
43727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
43737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.min(b, context=self)
43747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4375353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def min_mag(self, a, b):
4376353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
4377353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.min_mag(b, context=self)
4378353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
43797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def minus(self, a):
43807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Minus corresponds to unary prefix minus in Python.
43817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as subtract; the
43837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation minus(a) is calculated as subtract('0', a) where the '0'
43847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
43857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('1.3'))
4387abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.3')
43889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('-1.3'))
4389abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.3')
43907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
43917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__neg__(context=self)
43927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def multiply(self, a, b):
43947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """multiply multiplies two operands.
43957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4396cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        If either operand is a special value then the general rules apply.
4397cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        Otherwise, the operands are multiplied together ('long multiplication'),
4398cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        resulting in a number which may be as long as the sum of the lengths
4399cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        of the two operands.
44007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
4402abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.60')
44039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
4404abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('21')
44059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
4406abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.72')
44079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
4408abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.0')
44099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
4410abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('4.28135971E+11')
44117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
44127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mul__(b, context=self)
44137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4414353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_minus(self, a):
4415353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the largest representable number smaller than a.
4416353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4418353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4420353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_minus(Decimal('1'))
4421abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.999999999')
4422353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_minus(Decimal('1E-1007'))
4423abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0E-1007')
4424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
4425abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000004')
4426353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_minus(Decimal('Infinity'))
4427abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('9.99999999E+999')
4428353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4429353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.next_minus(context=self)
4430353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4431353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_plus(self, a):
4432353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the smallest representable number larger than a.
4433353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_plus(Decimal('1'))
4438abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.00000001')
4439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_plus(Decimal('-1E-1007'))
4440abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0E-1007')
4441353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
4442abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000002')
4443353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_plus(Decimal('-Infinity'))
4444abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-9.99999999E+999')
4445353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4446353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.next_plus(context=self)
4447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_toward(self, a, b):
4449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the number closest to a, in direction towards b.
4450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the closest representable number from the first
4452353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        operand (but not the first operand) that is in the direction
4453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        towards the second operand, unless the operands have the same
4454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value.
4455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('1'), Decimal('2'))
4460abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.00000001')
4461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
4462abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0E-1007')
4463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
4464abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000002')
4465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('1'), Decimal('0'))
4466abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.999999999')
4467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
4468abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0E-1007')
4469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
4470abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000004')
4471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
4472abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.00')
4473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.next_toward(b, context=self)
4475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
44767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def normalize(self, a):
4477e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """normalize reduces an operand to its simplest form.
44787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Essentially a plus operation with all trailing zeros removed from the
44807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.
44817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('2.1'))
4483abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
44849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-2.0'))
4485abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-2')
44869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('1.200'))
4487abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.2')
44889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-120'))
4489abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.2E+2')
44909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('120.00'))
4491abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.2E+2')
44929ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('0.00'))
4493abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
44947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
44957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.normalize(context=self)
44967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4497353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def number_class(self, a):
4498353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns an indication of the class of the operand.
4499353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4500353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The class is one of the following strings:
4501353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -sNaN
4502353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -NaN
4503353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Infinity
4504353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Normal
4505353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Subnormal
4506353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Zero
4507353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Zero
4508353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Subnormal
4509353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Normal
4510353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Infinity
4511353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4512353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = Context(ExtendedContext)
4513353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4514353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4515353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('Infinity'))
4516353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Infinity'
4517353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('1E-10'))
4518353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Normal'
4519353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('2.50'))
4520353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Normal'
4521353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('0.1E-999'))
4522353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Subnormal'
4523353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('0'))
4524353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Zero'
4525353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-0'))
4526353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Zero'
4527353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-0.1E-999'))
4528353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Subnormal'
4529353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-1E-10'))
4530353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Normal'
4531353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-2.50'))
4532353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Normal'
4533353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-Infinity'))
4534353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Infinity'
4535353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('NaN'))
4536353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'NaN'
4537353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-NaN'))
4538353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'NaN'
4539353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('sNaN'))
4540353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'sNaN'
4541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4542353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.number_class(context=self)
4543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
45447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def plus(self, a):
45457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Plus corresponds to unary prefix plus in Python.
45467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as add; the
45487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation plus(a) is calculated as add('0', a) where the '0'
45497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
45507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45519ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('1.3'))
4552abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.3')
45539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('-1.3'))
4554abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.3')
45557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
45567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pos__(context=self)
45577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def power(self, a, b, modulo=None):
45597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Raises a to the power of b, to modulo if given.
45607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4561353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With two arguments, compute a**b.  If a is negative then b
4562353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        must be integral.  The result will be inexact unless b is
4563353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        integral and the result is finite and can be expressed exactly
4564353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        in 'precision' digits.
4565353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4566353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With three arguments, compute (a**b) % modulo.  For the
4567353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        three argument form, the following restrictions on the
4568353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        arguments hold:
4569353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4570353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - all three arguments must be integral
4571353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - b must be nonnegative
4572353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - at least one of a or b must be nonzero
4573353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - modulo must be nonzero and have at most 'precision' digits
4574353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4575353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result of pow(a, b, modulo) is identical to the result
4576353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        that would be obtained by computing (a**b) % modulo with
4577353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        unbounded precision, but is computed more efficiently.  It is
4578353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        always exact.
4579353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4580353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4581353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4582353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4583353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('2'), Decimal('3'))
4584abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('8')
4585353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-2'), Decimal('3'))
4586abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-8')
4587353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('2'), Decimal('-3'))
4588abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.125')
4589353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('1.7'), Decimal('8'))
4590abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('69.7575744')
4591353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('10'), Decimal('0.301029996'))
4592abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.00000000')
4593353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('Infinity'), Decimal('-1'))
4594abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4595353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('Infinity'), Decimal('0'))
4596abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4597353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('Infinity'), Decimal('1'))
4598abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4599353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('-1'))
4600abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
4601353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('0'))
4602abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4603353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('1'))
4604abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4605353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('2'))
4606abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4607353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('0'), Decimal('0'))
4608abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
4609353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4610353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
4611abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('11')
4612353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
4613abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-11')
4614353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
4615abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4616353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
4617abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('11')
4618353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
4619abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('11729830')
4620353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
4621abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
4622353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
4623abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
46247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
46257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pow__(b, modulo, context=self)
46267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def quantize(self, a, b):
462859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
46297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The coefficient of the result is derived from that of the left-hand
463159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operand.  It may be rounded using the current rounding setting (if the
46327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exponent is being increased), multiplied by a positive power of ten (if
46337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the exponent is being decreased), or is unchanged (if the exponent is
46347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        already equal to that of the right-hand operand).
46357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Unlike other operations, if the length of the coefficient after the
46377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        quantize operation would be greater than precision then an Invalid
463859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation condition is raised.  This guarantees that, unless there is
463959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        an error condition, the exponent of the result of a quantize is always
46407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        equal to that of the right-hand operand.
46417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Also unlike other operations, quantize will never raise Underflow, even
46437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if the result is subnormal and inexact.
46447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46459ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
4646abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.170')
46479ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
4648abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.17')
46499ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
4650abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.2')
46519ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
4652abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
46539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
4654abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0E+1')
46559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
4656abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
46579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
4658abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
46599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
4660abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
46619ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
4662abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0E+5')
46639ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
4664abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
46659ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
4666abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
46679ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
4668abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('217.0')
46699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
4670abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('217')
46719ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
4672abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.2E+2')
46739ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
4674abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2E+2')
46757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
46767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.quantize(b, context=self)
46777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4678353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def radix(self):
4679353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Just returns 10, as this is Decimal, :)
4680353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4681353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.radix()
4682abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
4683353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4684353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return Decimal(10)
4685353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
46867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder(self, a, b):
46877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the remainder from integer division.
46887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is the residue of the dividend after the operation of
469059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        calculating integer division as described for divide-integer, rounded
46910d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz        to precision digits if necessary.  The sign of the result, if
469259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        non-zero, is the same as that of the original dividend.
46937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
46957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
46967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
46977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46989ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
4699abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
47009ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
4701abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
47029ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
4703abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
47049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
4705abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.2')
47069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
4707abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.1')
47089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
4709abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
47107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
47117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mod__(b, context=self)
47127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, a, b):
47147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns to be "a - b * n", where n is the integer nearest the exact
47157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        value of "x / b" (if two integers are equally near then the even one
471659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        is chosen).  If the result is equal to 0 then its sign will be the
47177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign of a.
47187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
47207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
47217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
47227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
4724abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.9')
47259ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
4726abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-2')
47279ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
4728abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
47299ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
4730abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
47319ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
4732abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.2')
47339ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
4734abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.1')
47359ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
4736abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.3')
47377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
47387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.remainder_near(b, context=self)
47397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4740353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def rotate(self, a, b):
4741353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a rotated copy of a, b times.
4742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4743353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The coefficient of the result is a rotated copy of the digits in
4744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the coefficient of the first operand.  The number of places of
4745353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotation is taken from the absolute value of the second operand,
4746353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        with the rotation being to the left if the second operand is
4747353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        positive or to the right otherwise.
4748353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4749353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
4750abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('400000003')
4751353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
4752abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('12')
4753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
4754abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('891234567')
4755353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
4756abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('123456789')
4757353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
4758abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('345678912')
4759353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4760353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.rotate(b, context=self)
4761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
47627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, a, b):
47637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns True if the two operands have the same exponent.
47647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is never affected by either the sign or the coefficient of
47667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        either operand.
47677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47689ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
47697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
47709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
47717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
47729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
47737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
47749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
47757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
47767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
47777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.same_quantum(b)
47787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4779353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def scaleb (self, a, b):
4780353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the first operand after adding the second value its exp.
4781353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
4783abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.0750')
4784353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
4785abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.50')
4786353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
4787abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.50E+3')
4788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.scaleb (b, context=self)
4790353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4791353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def shift(self, a, b):
4792353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a shifted copy of a, b times.
4793353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4794353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The coefficient of the result is a shifted copy of the digits
4795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        in the coefficient of the first operand.  The number of places
4796353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        to shift is taken from the absolute value of the second operand,
4797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        with the shift being to the left if the second operand is
4798353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        positive or to the right otherwise.  Digits shifted into the
4799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        coefficient are zeros.
4800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4801353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
4802abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('400000000')
4803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
4804abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
4806abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1234567')
4807353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
4808abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('123456789')
4809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
4810abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('345678900')
4811353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4812353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.shift(b, context=self)
4813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
48147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def sqrt(self, a):
481559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        """Square root of a non-negative number to context precision.
48167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the result must be inexact, it is rounded using the round-half-even
48187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        algorithm.
48197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0'))
4821abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
48229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('-0'))
4823abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
48249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0.39'))
4825abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.624499800')
48269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('100'))
4827abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
48289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1'))
4829abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
48309ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.0'))
4831abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
48329ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.00'))
4833abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
48349ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('7'))
4835abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.64575131')
48369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('10'))
4837abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.16227766')
48389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.prec
48396ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        9
48407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.sqrt(context=self)
48427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def subtract(self, a, b):
4844f33d01d304c349a7f555779c7c99930f1203adb7Georg Brandl        """Return the difference between the two operands.
48457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48469ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
4847abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.23')
48489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
4849abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.00')
48509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
4851abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.77')
48527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__sub__(b, context=self)
48547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, a):
48567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
48577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
48597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.to_eng_string(context=self)
48617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_sci_string(self, a):
48637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
48647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
48667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__str__(context=self)
48687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_exact(self, a):
4870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds to an integer.
4871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        When the operand has a negative exponent, the result is the same
4873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        as using the quantize() operation using the given operand as the
4874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
4875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        of the operand as the precision setting; Inexact and Rounded flags
4876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        are allowed in this operation.  The rounding mode is taken from the
4877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.
4878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
4880abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
4881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('100'))
4882abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4883353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
4884abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
4886abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('102')
4887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
4888abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-102')
4889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
4890abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0E+6')
4891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
4892abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.89E+77')
4893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
4894abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.to_integral_exact(context=self)
4897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_value(self, a):
48997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds to an integer.
49007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        When the operand has a negative exponent, the result is the same
49027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        as using the quantize() operation using the given operand as the
49037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
49047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        of the operand as the precision setting, except that no flags will
490559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        be set.  The rounding mode is taken from the context.
49067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('2.1'))
4908abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
4909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('100'))
4910abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('100.0'))
4912abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('101.5'))
4914abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('102')
4915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
4916abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-102')
4917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
4918abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0E+6')
4919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
4920abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.89E+77')
4921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
4922abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
49237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
4924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.to_integral_value(context=self)
4925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # the method name changed, but we provide also the old one, for compatibility
4927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    to_integral = to_integral_value
49287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass _WorkRep(object):
49307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __slots__ = ('sign','int','exp')
493117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger    # sign: 0 or 1
4932636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # int:  int or long
49337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # exp:  None, int, or string
49347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, value=None):
49367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if value is None:
49377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = None
4938636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self.int = 0
49397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = None
494017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        elif isinstance(value, Decimal):
494117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            self.sign = value._sign
494272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self.int = int(value._int)
49437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value._exp
494417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        else:
494517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            # assert isinstance(value, tuple)
49467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = value[0]
49477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int = value[1]
49487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value[2]
49497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
49517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
49527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __str__ = __repr__
49547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4957e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batistadef _normalize(op1, op2, prec = 0):
49587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Normalizes op1, op2 to have the same exp and length of coefficient.
49597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Done during addition.
49617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
4962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if op1.exp < op2.exp:
49637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op2
49647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op1
49657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
49667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op1
49677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op2
49687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
4970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Then adding 10**exp to tmp has the same effect (after rounding)
4971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # as adding any positive quantity smaller than 10**exp; similarly
4972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # for subtraction.  So if other is smaller than 10**exp we replace
4973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # it with 10**exp.  This avoids tmp.exp - other.exp getting too large.
4974e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    tmp_len = len(str(tmp.int))
4975e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    other_len = len(str(other.int))
4976e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    exp = tmp.exp + min(-1, tmp_len - prec - 2)
4977e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    if other_len + other.exp - 1 < exp:
4978e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        other.int = 1
4979e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        other.exp = exp
4980636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
4981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    tmp.int *= 10 ** (tmp.exp - other.exp)
4982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    tmp.exp = other.exp
49837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return op1, op2
49847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
4986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# This function from Tim Peters was taken from here:
4988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# http://mail.python.org/pipermail/python-list/1999-July/007758.html
4989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# The correction being in the function definition is for speed, and
4990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# the whole function is not resolved with math.log because of avoiding
4991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# the use of floats.
4992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _nbits(n, correction = {
4993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '0': 4, '1': 3, '2': 2, '3': 2,
4994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '4': 1, '5': 1, '6': 1, '7': 1,
4995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '8': 0, '9': 0, 'a': 0, 'b': 0,
4996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'c': 0, 'd': 0, 'e': 0, 'f': 0}):
4997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Number of bits in binary representation of the positive integer n,
4998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    or 0 if n == 0.
4999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if n < 0:
5001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise ValueError("The argument to _nbits should be nonnegative.")
5002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    hex_n = "%x" % n
5003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return 4*len(hex_n) - correction[hex_n[0]]
5004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _sqrt_nearest(n, a):
5006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Closest integer to the square root of the positive integer n.  a is
5007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    an initial approximation to the square root.  Any positive integer
5008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    will do for a, but the closer a is to the square root of n the
5009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    faster convergence will be.
5010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if n <= 0 or a <= 0:
5013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise ValueError("Both arguments to _sqrt_nearest should be positive.")
5014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    b=0
5016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    while a != b:
5017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        b, a = a, a--n//a>>1
5018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return a
5019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _rshift_nearest(x, shift):
5021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given an integer x and a nonnegative integer shift, return closest
5022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    integer to x / 2**shift; use round-to-even in case of a tie.
5023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    b, q = 1L << shift, x >> shift
5026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return q + (2*(x & (b-1)) + (q&1) > b)
5027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _div_nearest(a, b):
5029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Closest integer to a/b, a and b positive integers; rounds to even
5030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    in the case of a tie.
5031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    q, r = divmod(a, b)
5034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return q + (2*r + (q&1) > b)
5035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _ilog(x, M, L = 8):
5037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Integer approximation to M*log(x/M), with absolute error boundable
5038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    in terms only of x/M.
5039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    Given positive integers x and M, return an integer approximation to
5041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    M * log(x/M).  For L = 8 and 0.1 <= x/M <= 10 the difference
5042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    between the approximation and the exact result is at most 22.  For
5043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15.  In
5044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    both cases these are upper bounds on the error; it will usually be
5045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    much smaller."""
5046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # The basic algorithm is the following: let log1p be the function
5048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # log1p(x) = log(1+x).  Then log(x/M) = log1p((x-M)/M).  We use
5049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # the reduction
5050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #    log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
5052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # repeatedly until the argument to log1p is small (< 2**-L in
5054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # absolute value).  For small y we can use the Taylor series
5055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # expansion
5056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #    log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
5058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # truncating at T such that y**T is small enough.  The whole
5060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # computation is carried out in a form of fixed-point arithmetic,
5061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # with a real number z being represented by an integer
5062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # approximation to z*M.  To avoid loss of precision, the y below
5063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # is actually an integer approximation to 2**R*y*M, where R is the
5064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # number of reductions performed so far.
5065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    y = x-M
5067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # argument reduction; R = number of reductions performed
5068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    R = 0
5069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    while (R <= L and long(abs(y)) << L-R >= M or
5070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista           R > L and abs(y) >> R-L >= M):
5071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _div_nearest(long(M*y) << 1,
5072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                         M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
5073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        R += 1
5074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Taylor series with T terms
5076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    T = -int(-10*len(str(M))//(3*L))
5077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    yshift = _rshift_nearest(y, R)
5078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    w = _div_nearest(M, T)
5079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    for k in xrange(T-1, 0, -1):
5080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
5081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(w*y, M)
5083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dlog10(c, e, p):
5085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers c, e and p with c > 0, p >= 0, compute an integer
5086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    approximation to 10**p * log10(c*10**e), with an absolute error of
5087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    at most 1.  Assumes that c*10**e is not exactly 1."""
5088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # increase precision by 2; compensate for this by dividing
5090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # final result by 100
5091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    p += 2
5092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # write c*10**e as d*10**f with either:
5094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   f >= 0 and 1 <= d <= 10, or
5095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   f <= 0 and 0.1 <= d <= 1.
5096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Thus for c*10**e close to 1, f = 0
5097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    l = len(str(c))
5098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    f = e+l - (e+l >= 1)
5099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if p > 0:
5101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        M = 10**p
5102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        k = e+p-f
5103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if k >= 0:
5104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c *= 10**k
5105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = _div_nearest(c, 10**-k)
5107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = _ilog(c, M) # error < 5 + 22 = 27
5109be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        log_10 = _log10_digits(p) # error < 1
5110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = _div_nearest(log_d*M, log_10)
5111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_tenpower = f*M # exact
5112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = 0  # error < 2.31
511418aa388ca084e1d40aa48c8c8f1b4f730c6fe059Neal Norwitz        log_tenpower = _div_nearest(f, 10**-p) # error < 0.5
5115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(log_tenpower+log_d, 100)
5117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dlog(c, e, p):
5119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers c, e and p with c > 0, compute an integer
5120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    approximation to 10**p * log(c*10**e), with an absolute error of
5121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    at most 1.  Assumes that c*10**e is not exactly 1."""
5122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Increase precision by 2. The precision increase is compensated
5124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # for at the end with a division by 100.
5125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    p += 2
5126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
5128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # or f <= 0 and 0.1 <= d <= 1.  Then we can compute 10**p * log(c*10**e)
5129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # as 10**p * log(d) + 10**p*f * log(10).
5130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    l = len(str(c))
5131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    f = e+l - (e+l >= 1)
5132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # compute approximation to 10**p*log(d), with error < 27
5134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if p > 0:
5135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        k = e+p-f
5136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if k >= 0:
5137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c *= 10**k
5138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = _div_nearest(c, 10**-k)  # error of <= 0.5 in c
5140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # _ilog magnifies existing error in c by a factor of at most 10
5142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
5143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # p <= 0: just approximate the whole thing by 0; error < 2.31
5145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = 0
5146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5147be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # compute approximation to f*10**p*log(10), with error < 11.
5148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if f:
5149be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        extra = len(str(abs(f)))-1
5150be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        if p + extra >= 0:
5151be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
5152be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
5153be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
5154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            f_log_ten = 0
5156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        f_log_ten = 0
5158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5159be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
5160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(f_log_ten + log_d, 100)
5161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5162be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batistaclass _Log10Memoize(object):
5163be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    """Class to compute, store, and allow retrieval of, digits of the
5164be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    constant log(10) = 2.302585....  This constant is needed by
5165be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
5166be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    def __init__(self):
5167be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        self.digits = "23025850929940456840179914546843642076011014886"
5168be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5169be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    def getdigits(self, p):
5170be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        """Given an integer p >= 0, return floor(10**p)*log(10).
5171be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5172be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        For example, self.getdigits(3) returns 2302.
5173be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        """
5174be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # digits are stored as a string, for quick conversion to
5175be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # integer in the case that we've already computed enough
5176be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # digits; the stored digits should always be correct
5177be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # (truncated, not rounded to nearest).
5178be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        if p < 0:
5179be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            raise ValueError("p should be nonnegative")
5180be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5181be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        if p >= len(self.digits):
5182be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # compute p+3, p+6, p+9, ... digits; continue until at
5183be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # least one of the extra digits is nonzero
5184be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            extra = 3
5185be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            while True:
5186be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                # compute p+extra digits, correct to within 1ulp
5187be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                M = 10**(p+extra+2)
5188be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                digits = str(_div_nearest(_ilog(10*M, M), 100))
5189be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                if digits[-extra:] != '0'*extra:
5190be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                    break
5191be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                extra += 3
5192be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # keep all reliable digits so far; remove trailing zeros
5193be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # and next nonzero digit
5194be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            self.digits = digits.rstrip('0')[:-1]
5195be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        return int(self.digits[:p+1])
5196be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5197be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista_log10_digits = _Log10Memoize().getdigits
5198be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _iexp(x, M, L=8):
5200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers x and M, M > 0, such that x/M is small in absolute
5201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    value, compute an integer approximation to M*exp(x/M).  For 0 <=
5202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    x/M <= 2.4, the absolute error in the result is bounded by 60 (and
5203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    is usually much smaller)."""
5204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Algorithm: to compute exp(z) for a real number z, first divide z
5206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # by a suitable power R of 2 so that |z/2**R| < 2**-L.  Then
5207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
5208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # series
5209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #     expm1(x) = x + x**2/2! + x**3/3! + ...
5211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Now use the identity
5213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #     expm1(2x) = expm1(x)*(expm1(x)+2)
5215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # R times to compute the sequence expm1(z/2**R),
5217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
5218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Find R such that x/2**R/M <= 2**-L
5220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    R = _nbits((long(x)<<L)//M)
5221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Taylor series.  (2**L)**T > M
5223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    T = -int(-10*len(str(M))//(3*L))
5224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    y = _div_nearest(x, T)
5225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    Mshift = long(M)<<R
5226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    for i in xrange(T-1, 0, -1):
5227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _div_nearest(x*(Mshift + y), Mshift * i)
5228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Expansion
5230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    for k in xrange(R-1, -1, -1):
5231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Mshift = long(M)<<(k+2)
5232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _div_nearest(y*(y+Mshift), Mshift)
5233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return M+y
5235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dexp(c, e, p):
5237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Compute an approximation to exp(c*10**e), with p decimal places of
5238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    precision.
5239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5240be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    Returns integers d, f such that:
5241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      10**(p-1) <= d <= 10**p, and
5243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
5244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    In other words, d*10**f is an approximation to exp(c*10**e) with p
5246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    digits of precision, and with an error in d of at most 1.  This is
5247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    almost, but not quite, the same as the error being < 1ulp: when d
5248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    = 10**(p-1) the error could be up to 10 ulp."""
5249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
5251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    p += 2
5252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5253be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # compute log(10) with extra precision = adjusted exponent of c*10**e
5254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    extra = max(0, e + len(str(c)) - 1)
5255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    q = p + extra
5256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5257be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
5258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # rounding down
5259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    shift = e+q
5260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if shift >= 0:
5261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        cshift = c*10**shift
5262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        cshift = c//10**-shift
5264be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    quot, rem = divmod(cshift, _log10_digits(q))
5265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # reduce remainder back to original precision
5267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    rem = _div_nearest(rem, 10**extra)
5268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # error in result of _iexp < 120;  error after division < 0.62
5270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
5271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dpower(xc, xe, yc, ye, p):
5273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
5274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    y = yc*10**ye, compute x**y.  Returns a pair of integers (c, e) such that:
5275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      10**(p-1) <= c <= 10**p, and
5277353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      (c-1)*10**e < x**y < (c+1)*10**e
5278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    in other words, c*10**e is an approximation to x**y with p digits
5280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    of precision, and with an error in c of at most 1.  (This is
5281353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    almost, but not quite, the same as the error being < 1ulp: when c
5282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    == 10**(p-1) we can only guarantee error < 10ulp.)
5283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    We assume that: x is positive and not equal to 1, and y is nonzero.
5285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5287353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Find b such that 10**(b-1) <= |y| <= 10**b
5288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    b = len(str(abs(yc))) + ye
5289353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
5291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    lxc = _dlog(xc, xe, p+b+1)
5292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
5294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    shift = ye-b
5295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if shift >= 0:
5296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        pc = lxc*yc*10**shift
5297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        pc = _div_nearest(lxc*yc, 10**-shift)
5299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if pc == 0:
5301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # we prefer a result that isn't exactly 1; this makes it
5302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # easier to compute a correctly rounded result in __pow__
5303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
5304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            coeff, exp = 10**(p-1)+1, 1-p
5305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            coeff, exp = 10**p-1, -p
5307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        coeff, exp = _dexp(pc, -(p+1), p+1)
5309353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        coeff = _div_nearest(coeff, 10)
5310353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exp += 1
5311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return coeff, exp
5313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _log10_lb(c, correction = {
5315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
5316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '6': 23, '7': 16, '8': 10, '9': 5}):
5317353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Compute a lower bound for 100*log10(c) for a positive integer c."""
5318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if c <= 0:
5319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise ValueError("The argument to _log10_lb should be nonnegative.")
5320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    str_c = str(c)
5321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return 100*len(str_c) - correction[str_c[0]]
5322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
532359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Helper Functions ####################################################
53247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _convert_other(other, raiseit=False):
5326636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    """Convert other to Decimal.
5327636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
5328636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    Verifies that it's ok to use in an implicit construction.
5329636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    """
5330636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    if isinstance(other, Decimal):
5331636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        return other
5332636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    if isinstance(other, (int, long)):
5333636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        return Decimal(other)
5334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if raiseit:
5335353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise TypeError("Unable to convert %s to Decimal" % other)
5336267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger    return NotImplemented
5337636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
533859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Setup Specific Contexts ############################################
53397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# The default context prototype used by Context()
5341fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger# Is mutable, so that new contexts can have different default values
53427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDefaultContext = Context(
53446ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=28, rounding=ROUND_HALF_EVEN,
5345bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation],
5346bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
534799148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emax=999999999,
534899148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emin=-999999999,
5349e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        capitals=1
53507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
53517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Pre-made alternate contexts offered by the specification
53537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Don't change these; the user should be able to select these
53547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# contexts and be able to reproduce results from other implementations
53557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# of the spec.
53567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerBasicContext = Context(
53587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prec=9, rounding=ROUND_HALF_UP,
5359bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
5360bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
53617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
53627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53639ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerExtendedContext = Context(
53646ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=9, rounding=ROUND_HALF_EVEN,
5365bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[],
5366bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
53677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
53687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
537059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### crud for parsing strings #############################################
53716a123cb7827859748a0096570dfbb5ceba0e59dcMark Dickinson#
537272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Regular expression used for parsing numeric strings.  Additional
537372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# comments:
537472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista#
537572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
537672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# whitespace.  But note that the specification disallows whitespace in
537772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# a numeric string.
537872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista#
537972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 2. For finite numbers (not infinities and NaNs) the body of the
538072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# number between the optional sign and the optional exponent must have
538172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# at least one decimal digit, possibly after the decimal point.  The
538272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# lookahead expression '(?=\d|\.\d)' checks this.
538372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista#
538472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# As the flag UNICODE is not enabled here, we're explicitly avoiding any
538572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# other meaning for \d than the numbers [0-9].
53867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
538772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batistaimport re
538870c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson_parser = re.compile(r"""        # A numeric string consists of:
53897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
539070c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson    (?P<sign>[-+])?              # an optional sign, followed by either...
53917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (
539270c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (?=[0-9]|\.[0-9])        # ...a number (with at least one digit)
539370c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (?P<int>[0-9]*)          # having a (possibly empty) integer part
539470c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (\.(?P<frac>[0-9]*))?    # followed by an optional fractional part
539570c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (E(?P<exp>[-+]?[0-9]+))? # followed by an optional exponent, or...
53967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    |
539770c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        Inf(inity)?              # ...an infinity, or...
539872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    |
539970c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (?P<signal>s)?           # ...an (optionally signaling)
540070c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        NaN                      # NaN
540170c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (?P<diag>[0-9]*)         # with (possibly empty) diagnostic info.
54027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    )
54037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
540459bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson    \Z
540572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista""", re.VERBOSE | re.IGNORECASE).match
54067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
54072ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista_all_zeros = re.compile('0*$').match
54082ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista_exact_half = re.compile('50*$').match
54091ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54101ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson##### PEP3101 support functions ##############################################
54111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# The functions parse_format_specifier and format_align have little to do
54121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# with the Decimal class, and could potentially be reused for other pure
54131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# Python numeric classes that want to implement __format__
54141ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson#
54151ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# A format specifier for Decimal looks like:
54161ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson#
54171ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson#   [[fill]align][sign][0][minimumwidth][.precision][type]
54181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson#
54191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54201ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson_parse_format_specifier_regex = re.compile(r"""\A
54211ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?:
54221ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson   (?P<fill>.)?
54231ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson   (?P<align>[<>=^])
54241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson)?
54251ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<sign>[-+ ])?
54261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<zeropad>0)?
54271ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<minimumwidth>(?!0)\d+)?
54281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?:\.(?P<precision>0|(?!0)\d+))?
54291ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<type>[eEfFgG%])?
54301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson\Z
54311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson""", re.VERBOSE)
54321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdel re
54347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
54351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinsondef _parse_format_specifier(format_spec):
54361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """Parse and validate a format specifier.
54371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    Turns a standard numeric format specifier into a dict, with the
54391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    following entries:
54401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      fill: fill character to pad field to minimum width
54421ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      align: alignment type, either '<', '>', '=' or '^'
54431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      sign: either '+', '-' or ' '
54441ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      minimumwidth: nonnegative integer giving minimum width
54451ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      precision: nonnegative integer giving precision, or None
54461ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      type: one of the characters 'eEfFgG%', or None
54471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      unicode: either True or False (always True for Python 3.x)
54481ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54491ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """
54501ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    m = _parse_format_specifier_regex.match(format_spec)
54511ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if m is None:
54521ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        raise ValueError("Invalid format specifier: " + format_spec)
54531ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54541ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # get the dictionary
54551ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict = m.groupdict()
54561ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54571ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # defaults for fill and alignment
54581ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    fill = format_dict['fill']
54591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    align = format_dict['align']
54601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict.pop('zeropad') is not None:
54611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # in the face of conflict, refuse the temptation to guess
54621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if fill is not None and fill != '0':
54631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            raise ValueError("Fill character conflicts with '0'"
54641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                             " in format specifier: " + format_spec)
54651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if align is not None and align != '=':
54661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            raise ValueError("Alignment conflicts with '0' in "
54671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                             "format specifier: " + format_spec)
54681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        fill = '0'
54691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        align = '='
54701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['fill'] = fill or ' '
54711ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['align'] = align or '<'
54721ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54731ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict['sign'] is None:
54741ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        format_dict['sign'] = '-'
54751ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54761ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # turn minimumwidth and precision entries into integers.
54771ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # minimumwidth defaults to 0; precision remains None if not given
54781ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
54791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict['precision'] is not None:
54801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        format_dict['precision'] = int(format_dict['precision'])
54811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # if format type is 'g' or 'G' then a precision of 0 makes little
54831ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # sense; convert it to 1.  Same if format type is unspecified.
54841ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict['precision'] == 0:
54851ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if format_dict['type'] in 'gG' or format_dict['type'] is None:
54861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            format_dict['precision'] = 1
54871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # record whether return type should be str or unicode
54891ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['unicode'] = isinstance(format_spec, unicode)
54901ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54911ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    return format_dict
54921ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54931ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinsondef _format_align(body, spec_dict):
54941ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """Given an unpadded, non-aligned numeric string, add padding and
54951ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    aligment to conform with the given format specifier dictionary (as
54961ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    output from parse_format_specifier).
54971ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54981ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    It's assumed that if body is negative then it starts with '-'.
54991ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    Any leading sign ('-' or '+') is stripped from the body before
55001ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    applying the alignment and padding rules, and replaced in the
55011ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    appropriate position.
55021ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55031ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """
55041ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # figure out the sign; we only examine the first character, so if
55051ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # body has leading whitespace the results may be surprising.
55061ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if len(body) > 0 and body[0] in '-+':
55071ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        sign = body[0]
55081ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        body = body[1:]
55091ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    else:
55101ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        sign = ''
55111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if sign != '-':
55131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if spec_dict['sign'] in ' +':
55141ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            sign = spec_dict['sign']
55151ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        else:
55161ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            sign = ''
55171ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # how much extra space do we have to play with?
55191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    minimumwidth = spec_dict['minimumwidth']
55201ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    fill = spec_dict['fill']
55211ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    padding = fill*(max(minimumwidth - (len(sign+body)), 0))
55221ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55231ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    align = spec_dict['align']
55241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if align == '<':
55251ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = padding + sign + body
55261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    elif align == '>':
55271ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = sign + body + padding
55281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    elif align == '=':
55291ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = sign + padding + body
55301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    else: #align == '^'
55311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        half = len(padding)//2
55321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = padding[:half] + sign + body + padding[half:]
55331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # make sure that result is unicode if necessary
55351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if spec_dict['unicode']:
55361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = unicode(result)
55371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
55381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    return result
55390d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz
554072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista##### Useful Constants (internal use only) ################################
55417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
554272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Reusable defaults
5543b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_Infinity = Decimal('Inf')
5544b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_NegativeInfinity = Decimal('-Inf')
5545c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson_NaN = Decimal('NaN')
5546b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_Zero = Decimal(0)
5547b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_One = Decimal(1)
5548b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_NegativeOne = Decimal(-1)
5549c5de0969ca2a82c66efd30bb675f03c2324a3b27Mark Dickinson
5550b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger# _SignedInfinity[sign] is infinity w/ that sign
5551b7e835b820fc7d17a02dc4cdf3b745bb993952adRaymond Hettinger_SignedInfinity = (_Infinity, _NegativeInfinity)
55527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
55537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
55547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
55557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerif __name__ == '__main__':
55567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    import doctest, sys
55577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    doctest.testmod(sys.modules[__name__])
5558