decimal.py revision 53663a695ef2bb96ac0252cd4cc4aa40d4f953be
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
1387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
139097a1903035f9ee2efb1953306123f183124125dRaymond Hettingertry:
140097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger    from collections import namedtuple as _namedtuple
141097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger    DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
142097a1903035f9ee2efb1953306123f183124125dRaymond Hettingerexcept ImportError:
143097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger    DecimalTuple = lambda *args: args
144097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger
14559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista# Rounding
1460ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_DOWN = 'ROUND_DOWN'
1470ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_UP = 'ROUND_HALF_UP'
1480ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
1490ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_CEILING = 'ROUND_CEILING'
1500ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_FLOOR = 'ROUND_FLOOR'
1510ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_UP = 'ROUND_UP'
1520ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond HettingerROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo BatistaROUND_05UP = 'ROUND_05UP'
1547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista# Errors
1567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DecimalException(ArithmeticError):
1585aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    """Base exception class.
1597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Used exceptions derive from this.
1617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    If an exception derives from another exception besides this (such as
1627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
1637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    called if the others are present.  This isn't actually used for
1647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    anything, though.
1657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
166cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis    handle  -- Called when context._raise_error is called and the
167cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               trap_enabler is set.  First argument is self, second is the
168cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               context.  More arguments can be given, those being after
169cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               the explanation in _raise_error (For example,
170cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               context._raise_error(NewError, '(-x)!', self._sign) would
171cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis               call NewError().handle(context, self._sign).)
172cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
1737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    To define a new exception, it should be sufficient to have it derive
1747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    from DecimalException.
1757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
1777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        pass
1787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Clamped(DecimalException):
1817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent of a 0 changed to fit bounds.
1827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals clamped if the exponent of a result has been
1847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    altered in order to fit the constraints of a specific concrete
18559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    representation.  This may occur when the exponent of a zero result would
18659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    be outside the bounds of a representation, or when a large normal
18759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    number would have an encoded exponent that cannot be represented.  In
1887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    this latter case, the exponent is reduced to fit and the corresponding
1897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    number of zero digits are appended to the coefficient ("fold-down").
1907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
1917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidOperation(DecimalException):
1937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """An invalid operation was performed.
1947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Various bad things cause this:
1967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Something creates a signaling NaN
1987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -INF + INF
19959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    0 * (+-)INF
20059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    (+-)INF / (+-)INF
2017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x % 0
2027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (+-)INF % x
2037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x._rescale( non-integer )
2047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    sqrt(-x) , x > 0
2057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    0 ** 0
2067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (non-integer)
2077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    x ** (+-)INF
2087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    An operand is invalid
209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    The result of the operation after these is a quiet positive NaN,
211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    except when the cause is a signaling NaN, in which case the result is
212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    also a quiet NaN, but with the original sign, and an optional
213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    diagnostic information.
2147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if args:
2170f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
2180f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            return ans._fix_nan(context)
2197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass ConversionSyntax(InvalidOperation):
2227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Trying to convert badly formed string.
2237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an string is being
2257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    converted to a number and it does not conform to the numeric string
22659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    syntax.  The result is [0,qNaN].
2277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
228cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis    def handle(self, context, *args):
229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return NaN
2307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionByZero(DecimalException, ZeroDivisionError):
2327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Division by 0.
2337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals division-by-zero if division of a finite number
2357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero was attempted (during a divide-integer or divide operation, or a
2367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    power operation with negative right-hand operand), and the dividend was
2377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not zero.
2387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result of the operation is [sign,inf], where sign is the exclusive
2407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or of the signs of the operands for divide, or is 1 for an odd power of
2417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    -0, for power.
2427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
243cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
244cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista    def handle(self, context, sign, *args):
2457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return Infsign[sign]
2467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionImpossible(InvalidOperation):
2487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Cannot perform the division adequately.
2497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if the integer result of a
2517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    divide-integer or remainder operation had too many digits (would be
25259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    longer than precision).  The result is [0,qNaN].
2537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
254cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
2557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
256cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return NaN
2577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass DivisionUndefined(InvalidOperation, ZeroDivisionError):
2597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Undefined result of division.
2607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if division by zero was
2627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    attempted (during a divide-integer, divide, or remainder operation), and
26359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    the dividend is also zero.  The result is [0,qNaN].
2647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
265cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
266cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista    def handle(self, context, *args):
2677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Inexact(DecimalException):
2707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Had to round, losing information.
2717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals inexact whenever the result of an operation is
2737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    not exact (that is, it needed to be rounded and any discarded digits
27459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    were non-zero), or if an overflow or underflow condition occurs.  The
2757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
2767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The inexact signal may be tested (or trapped) to determine if a given
2787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) was inexact.
2797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
2807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass InvalidContext(InvalidOperation):
2827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Invalid context.  Unknown rounding, for example.
2837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals invalid-operation if an invalid context was
28559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    detected during an operation.  This can occur if contexts are not checked
2867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    on creation and either the precision exceeds the capability of the
2877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    underlying concrete representation or an unknown or unsupported rounding
28859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    was specified.  These aspects of the context need only be checked when
28959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    the values are required to be used.  The result is [0,qNaN].
2907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
291cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
2927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, *args):
2937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return NaN
2947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Rounded(DecimalException):
2967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Number got rounded (not  necessarily changed during rounding).
2977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals rounded whenever the result of an operation is
2997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    rounded (that is, some zero or non-zero digits were discarded from the
30059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    coefficient), or if an overflow or underflow condition occurs.  The
3017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result in all cases is unchanged.
3027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The rounded signal may be tested (or trapped) to determine if a given
3047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation (or sequence of operations) caused a loss of precision.
3057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Subnormal(DecimalException):
3087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Exponent < Emin before rounding.
3097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals subnormal whenever the result of a conversion or
3117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    operation is subnormal (that is, its adjusted exponent is less than
31259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    Emin, before any rounding).  The result in all cases is unchanged.
3137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The subnormal signal may be tested (or trapped) to determine if a given
3157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    or operation (or sequence of operations) yielded a subnormal result.
3167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Overflow(Inexact, Rounded):
3197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical overflow.
3207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals overflow if the adjusted exponent of a result
3227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (from a conversion or from an operation that is not an attempt to divide
3237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    by zero), after rounding, would be greater than the largest value that
3247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    can be handled by the implementation (the value Emax).
3257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result depends on the rounding mode:
3277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    For round-half-up and round-half-even (and for round-half-down and
3297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-up, if implemented), the result of the operation is [sign,inf],
33059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    where sign is the sign of the intermediate result.  For round-down, the
3317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    result is the largest finite number that can be represented in the
33259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    current precision, with the sign of the intermediate result.  For
3337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    round-ceiling, the result is the same as for round-down if the sign of
33459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    the intermediate result is 1, or is [0,inf] otherwise.  For round-floor,
3357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the result is the same as for round-down if the sign of the intermediate
33659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    result is 0, or is [1,inf] otherwise.  In all cases, Inexact and Rounded
3377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    will also be raised.
3380f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista    """
339cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
3407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def handle(self, context, sign, *args):
3417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
342353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                ROUND_HALF_DOWN, ROUND_UP):
3437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return Infsign[sign]
3447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 0:
3457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_CEILING:
3467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
34772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(sign, '9'*context.prec,
34872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                            context.Emax-context.prec+1)
3497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if sign == 1:
3507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if context.rounding == ROUND_FLOOR:
3517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return Infsign[sign]
35272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(sign, '9'*context.prec,
35372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                             context.Emax-context.prec+1)
3547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Underflow(Inexact, Rounded, Subnormal):
3577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Numerical underflow with result rounded to 0.
3587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    This occurs and signals underflow if a result is inexact and the
3607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    adjusted exponent of the result would be smaller (more negative) than
3617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    the smallest value that can be handled by the implementation (the value
36259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    Emin).  That is, the result is both inexact and subnormal.
3637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    The result after an underflow will be a subnormal number rounded, if
36559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    necessary, so that its exponent is not less than Etiny.  This may result
3667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    in 0 with the sign of the intermediate result and an exponent of Etiny.
3677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    In all cases, Inexact, Rounded, and Subnormal will also be raised.
3697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
3707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3715aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# List of public traps and flags
372fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
373cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis           Underflow, InvalidOperation, Subnormal]
3747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3755aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger# Map conditions (per the spec) to signals
3765aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger_condition_map = {ConversionSyntax:InvalidOperation,
3775aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionImpossible:InvalidOperation,
3785aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  DivisionUndefined:InvalidOperation,
3795aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger                  InvalidContext:InvalidOperation}
3807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Context Functions ##################################################
3827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
383ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# The getcontext() and setcontext() function manage access to a thread-local
384ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# current context.  Py2.4 offers direct support for thread locals.  If that
385ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger# is not available, use threading.currentThread() which is slower but will
3867e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger# work for older Pythons.  If threads are not part of the build, create a
387cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis# mock threading object with threading.local() returning the module namespace.
3887e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger
3897e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingertry:
3907e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    import threading
3917e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettingerexcept ImportError:
3927e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    # Python was compiled without threads; create a mock object instead
3937e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    import sys
39459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    class MockThreading(object):
3957e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger        def local(self, sys=sys):
3967e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger            return sys.modules[__name__]
3977e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    threading = MockThreading()
3987e71fa5cfa250968eafdb77356621e3a9bbb0648Raymond Hettinger    del sys, MockThreading
399ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
400ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingertry:
401ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    threading.local
402ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
403ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerexcept AttributeError:
404ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
40559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # To fix reloading, force it to create a new context
40659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # Old contexts have different exceptions in their dicts, making problems.
407ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    if hasattr(threading.currentThread(), '__decimal_context__'):
408ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        del threading.currentThread().__decimal_context__
409ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
410ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context):
411ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
412ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4139fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
41461992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
4157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        threading.currentThread().__decimal_context__ = context
416ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
417ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext():
418ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
419ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
420ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
421ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
422ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
423ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
424ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
425ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return threading.currentThread().__decimal_context__
426ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
427ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
428ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            threading.currentThread().__decimal_context__ = context
429ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
430ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
431ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettingerelse:
432ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
433ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    local = threading.local()
4349fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    if hasattr(local, '__decimal_context__'):
4359fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        del local.__decimal_context__
436ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
437ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def getcontext(_local=local):
438ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Returns this thread's context.
439ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
440ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        If this thread does not yet have a context, returns
441ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        a new context and sets this thread's context.
442ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        New contexts are copies of DefaultContext.
443ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """
444ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        try:
445ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return _local.__decimal_context__
446ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        except AttributeError:
447ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            context = Context()
448ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            _local.__decimal_context__ = context
449ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger            return context
450ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
451ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger    def setcontext(context, _local=local):
452ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        """Set this thread's context to context."""
453ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        if context in (DefaultContext, BasicContext, ExtendedContext):
4549fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger            context = context.copy()
45561992efc4bb413ae7a19752215eca5af09be6b6dRaymond Hettinger            context.clear_flags()
456ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger        _local.__decimal_context__ = context
457ef66debd7ef590304466d13dde4082632750fa7cRaymond Hettinger
458cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis    del threading, local        # Don't contaminate the namespace
4597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4608b6999b4c5fab174090be263ba90f193bdede141Nick Coghlandef localcontext(ctx=None):
4618b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """Return a context manager for a copy of the supplied context
4628b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
4638b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    Uses a copy of the current context if no context is specified
4648b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    The returned context manager creates a local decimal context
4658b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    in a with statement:
4668b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan        def sin(x):
4678b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan             with localcontext() as ctx:
4688b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 ctx.prec += 2
4698b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # Rest of sin calculation algorithm
4708b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # uses a precision 2 greater than normal
47159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista             return +s  # Convert result to normal precision
4728b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
4738b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan         def sin(x):
4748b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan             with localcontext(ExtendedContext):
4758b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # Rest of sin calculation algorithm
4768b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # uses the Extended Context from the
4778b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan                 # General Decimal Arithmetic Specification
47859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista             return +s  # Convert result to normal context
4798b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
480ee340e501d2a59d70a91748ebd948787bfac8044Facundo Batista    >>> setcontext(DefaultContext)
4818b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> print getcontext().prec
4828b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    28
4838b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> with localcontext():
4848b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...     ctx = getcontext()
485495df4716fce4156c1eb110f9342297164eecbb6Raymond Hettinger    ...     ctx.prec += 2
4868b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...     print ctx.prec
4878b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...
4888b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    30
4898b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> with localcontext(ExtendedContext):
4908b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...     print getcontext().prec
4918b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    ...
4928b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    9
4938b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    >>> print getcontext().prec
4948b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    28
4958b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """
496ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan    if ctx is None: ctx = getcontext()
497ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan    return _ContextManager(ctx)
4988b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan
4997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
50059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Decimal class #######################################################
5017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Decimal(object):
5037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Floating point class for decimal arithmetic."""
5047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
505636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    __slots__ = ('_exp','_int','_sign', '_is_special')
506636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # Generally, the value of the Decimal instance is given by
507636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    #  (-1)**_sign * _int * 10**_exp
508636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # Special values are signified by _is_special == True
5097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
510dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    # We're immutable, so use __new__ not __init__
511636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    def __new__(cls, value="0", context=None):
5127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Create a decimal point instance.
5137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal('3.14')              # string input
515abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.14')
51659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        >>> Decimal((0, (3, 1, 4), -2))  # tuple (sign, digit_tuple, exponent)
517abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.14')
5187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(314)                 # int or long
519abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('314')
5207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        >>> Decimal(Decimal(314))        # another decimal instance
521abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('314')
52259bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        >>> Decimal('  3.14  \\n')        # leading and trailing whitespace okay
523abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.14')
5247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
5257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
52672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # Note that the coefficient, self._int, is actually stored as
52772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # a string rather than as a tuple of digits.  This speeds up
52872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # the "digits to integer" and "integer to digits" conversions
52972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # that are used in almost every arithmetic operation on
53072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # Decimals.  This is an internal detail: the as_tuple function
53172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # and the Decimal constructor still deal with tuples of
53272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        # digits.
53372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
534636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self = object.__new__(cls)
535636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
5360d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # From a string
5370d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # REs insist on real strings, so we can too.
5380d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        if isinstance(value, basestring):
53959bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson            m = _parser(value.strip())
5400d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            if m is None:
5410d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                if context is None:
5420d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    context = getcontext()
5430d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                return context._raise_error(ConversionSyntax,
5440d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                                "Invalid literal for Decimal: %r" % value)
545636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
5460d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            if m.group('sign') == "-":
5470d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._sign = 1
5480d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            else:
5490d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._sign = 0
5500d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            intpart = m.group('int')
5510d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            if intpart is not None:
5520d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                # finite number
5530d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                fracpart = m.group('frac')
5540d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                exp = int(m.group('exp') or '0')
5550d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                if fracpart is not None:
5568e85ffa4b213be809109180142a107a1ac66f4d5Mark Dickinson                    self._int = str((intpart+fracpart).lstrip('0') or '0')
5570d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    self._exp = exp - len(fracpart)
5580d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                else:
5598e85ffa4b213be809109180142a107a1ac66f4d5Mark Dickinson                    self._int = str(intpart.lstrip('0') or '0')
5600d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    self._exp = exp
5610d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._is_special = False
5620d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            else:
5630d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                diag = m.group('diag')
5640d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                if diag is not None:
5650d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    # NaN
5668e85ffa4b213be809109180142a107a1ac66f4d5Mark Dickinson                    self._int = str(diag.lstrip('0'))
5670d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    if m.group('signal'):
5680d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                        self._exp = 'N'
5690d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    else:
5700d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                        self._exp = 'n'
5710d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                else:
5720d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    # infinity
5730d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    self._int = '0'
5740d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                    self._exp = 'F'
5750d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista                self._is_special = True
576636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
577636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
578636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # From an integer
5797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if isinstance(value, (int,long)):
580636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if value >= 0:
581636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._sign = 0
582636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            else:
583636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._sign = 1
584636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._exp = 0
58572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self._int = str(abs(value))
5860d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._is_special = False
5870d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            return self
5880d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista
5890d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # From another decimal
5900d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        if isinstance(value, Decimal):
5910d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._exp  = value._exp
5920d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._sign = value._sign
5930d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._int  = value._int
5940d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._is_special  = value._is_special
5950d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            return self
5960d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista
5970d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        # From an internal working value
5980d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista        if isinstance(value, _WorkRep):
5990d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._sign = value.sign
6000d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._int = str(value.int)
6010d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._exp = int(value.exp)
6020d157a0154140dc6dcd491d62df3a2b66367be15Facundo Batista            self._is_special = False
603636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
604636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
605636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # tuple/list conversion (possibly from as_tuple())
606636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if isinstance(value, (list,tuple)):
607636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if len(value) != 3:
6089b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                raise ValueError('Invalid tuple size in creation of Decimal '
6099b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 'from list or tuple.  The list or tuple '
6109b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 'should have exactly three elements.')
6119b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista            # process sign.  The isinstance test rejects floats
6129b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista            if not (isinstance(value[0], (int, long)) and value[0] in (0,1)):
6139b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                raise ValueError("Invalid sign.  The first value in the tuple "
6149b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 "should be an integer; either 0 for a "
6159b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                 "positive number or 1 for a negative number.")
616636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self._sign = value[0]
6179b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista            if value[2] == 'F':
6189b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                # infinity: value[1] is ignored
61972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                self._int = '0'
620636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._exp = value[2]
621636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                self._is_special = True
622636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            else:
6239b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                # process and validate the digits in value[1]
6249b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                digits = []
6259b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                for digit in value[1]:
6269b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    if isinstance(digit, (int, long)) and 0 <= digit <= 9:
6279b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                        # skip leading zeros
6289b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                        if digits or digit != 0:
6299b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                            digits.append(digit)
6309b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    else:
6319b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                        raise ValueError("The second value in the tuple must "
6329b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                         "be composed of integers in the range "
6339b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                         "0 through 9.")
6349b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                if value[2] in ('n', 'N'):
6359b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    # NaN: digits form the diagnostic
63672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                    self._int = ''.join(map(str, digits))
6379b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._exp = value[2]
6389b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._is_special = True
6399b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                elif isinstance(value[2], (int, long)):
6409b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    # finite number: digits give the coefficient
64172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                    self._int = ''.join(map(str, digits or [0]))
6429b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._exp = value[2]
6439b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    self._is_special = False
6449b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                else:
6459b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                    raise ValueError("The third value in the tuple must "
6469b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                     "be an integer, or one of the "
6479b5e23148badbb0d11fffd05cf9d432f35631a4aFacundo Batista                                     "strings 'F', 'n', 'N'.")
648636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return self
649636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
650636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if isinstance(value, float):
651636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            raise TypeError("Cannot convert float to Decimal.  " +
652636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                            "First convert the float to a string")
6537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
654636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        raise TypeError("Cannot convert %r to Decimal" % value)
6557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isnan(self):
6577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
6587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if a number
6600f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista        1 if NaN
6617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        2 if sNaN
6627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
663636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
664636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            exp = self._exp
665636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if exp == 'n':
666636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return 1
667636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            elif exp == 'N':
668636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return 2
6697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
6707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinfinity(self):
6727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is infinite
6737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0 if finite or not a number
6757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1 if +INF
6767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 if -INF
6777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
6787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp == 'F':
6797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._sign:
6807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return -1
6817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
6827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
6837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
684353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _check_nans(self, other=None, context=None):
6857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether the number is not actually one.
6867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are sNaN, signal
6887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self, other are NaN return nan
6897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
6907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
6917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Done before operations.
6927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
6937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
694636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self_is_nan = self._isnan()
695636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if other is None:
696636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            other_is_nan = False
697636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        else:
698636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            other_is_nan = other._isnan()
699636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
700636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self_is_nan or other_is_nan:
701636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if context is None:
702636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context = getcontext()
703636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
704636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self_is_nan == 2:
705636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation, 'sNaN',
7060f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        self)
707636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other_is_nan == 2:
708636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation, 'sNaN',
7090f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        other)
710636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self_is_nan:
711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._fix_nan(context)
712636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
713353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return other._fix_nan(context)
7147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return 0
7157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7162fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def _compare_check_nans(self, other, context):
7172fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        """Version of _check_nans used for the signaling comparisons
7182fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        compare_signal, __le__, __lt__, __ge__, __gt__.
7192fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7202fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        Signal InvalidOperation if either self or other is a (quiet
7212fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        or signaling) NaN.  Signaling NaNs take precedence over quiet
7222fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        NaNs.
7232fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7242fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        Return 0 if neither operand is a NaN.
7252fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7262fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        """
7272fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if context is None:
7282fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            context = getcontext()
7292fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7302fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self._is_special or other._is_special:
7312fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            if self.is_snan():
7322fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7332fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving sNaN',
7342fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            self)
7352fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            elif other.is_snan():
7362fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7372fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving sNaN',
7382fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            other)
7392fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            elif self.is_qnan():
7402fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7412fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving NaN',
7422fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            self)
7432fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            elif other.is_qnan():
7442fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                return context._raise_error(InvalidOperation,
7452fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            'comparison involving NaN',
7462fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson                                            other)
7472fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return 0
7482fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
7497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __nonzero__(self):
7501a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is nonzero; otherwise return False.
7517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7521a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        NaNs and infinities are considered nonzero.
7537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
75472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self._is_special or self._int != '0'
7557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7562fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def _cmp(self, other):
7572fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        """Compare the two non-NaN decimal instances self and other.
7587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7592fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        Returns -1 if self < other, 0 if self == other and 1
7602fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self > other.  This routine is for internal use only."""
761636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
7622fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self._is_special or other._is_special:
763636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return cmp(self._isinfinity(), other._isinfinity())
7647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # check for zeros;  note that cmp(0, -0) should return 0
766353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not other:
768353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return 0
769353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
770353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return -((-1)**other._sign)
771353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other:
772353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return (-1)**self._sign
7737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
77459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # If different signs, neg one is less
7757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if other._sign < self._sign:
7767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -1
7777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign < other._sign:
7787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 1
7797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
780636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        self_adjusted = self.adjusted()
781636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other_adjusted = other.adjusted()
782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_adjusted == other_adjusted:
78372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self_padded = self._int + '0'*(self._exp - other._exp)
78472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            other_padded = other._int + '0'*(other._exp - self._exp)
785353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return cmp(self_padded, other_padded) * (-1)**self._sign
786353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self_adjusted > other_adjusted:
7877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return (-1)**self._sign
788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else: # self_adjusted < other_adjusted
7897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return -((-1)**self._sign)
7907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
7912fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # Note: The Decimal standard doesn't cover rich comparisons for
7922fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # Decimals.  In particular, the specification is silent on the
7932fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # subject of what should happen for a comparison involving a NaN.
7942fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # We take the following approach:
7952fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #
7962fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #   == comparisons involving a NaN always return False
7972fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #   != comparisons involving a NaN always return True
7982fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #   <, >, <= and >= comparisons involving a (quiet or signaling)
7992fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #      NaN signal InvalidOperation, and return False if the
8003a94ee05f77d0200cfb7988d02f3fdf292932a94Mark Dickinson    #      InvalidOperation is not trapped.
8012fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    #
8022fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # This behavior is designed to conform as closely as possible to
8032fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    # that specified by IEEE 754.
8042fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8050aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __eq__(self, other):
8062fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8072fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8082fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8092fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self.is_nan() or other.is_nan():
8102fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8112fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) == 0
8120aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
8130aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger    def __ne__(self, other):
8142fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8152fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8162fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8172fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if self.is_nan() or other.is_nan():
8182fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return True
8192fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) != 0
8202fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8212fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __lt__(self, other, context=None):
8222fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8232fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8242fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8252fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8262fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8272fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8282fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) < 0
8292fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8302fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __le__(self, other, context=None):
8312fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8322fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8332fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8342fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8352fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8362fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8372fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) <= 0
8382fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8392fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __gt__(self, other, context=None):
8402fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8412fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8422fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8432fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8442fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8452fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8462fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) > 0
8472fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson
8482fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson    def __ge__(self, other, context=None):
8492fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other)
8502fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if other is NotImplemented:
8512fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return other
8522fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
8532fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
8542fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return False
8552fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return self._cmp(other) >= 0
8560aeac107cadd1472e5ea109f7f29e6a6527ae1ecRaymond Hettinger
8577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, other, context=None):
8587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares one to another.
8597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -1 => a < b
8617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        0  => a = b
8627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        1  => a > b
8637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN => one is NaN
8647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Like __cmp__, but returns Decimal instances.
8657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
8677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
86859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # Compare(NaN, NaN) = NaN
869636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if (self._is_special or other and other._is_special):
870636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
871636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
872636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
8737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8742fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        return Decimal(self._cmp(other))
8757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
8767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __hash__(self):
8777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """x.__hash__() <==> hash(x)"""
8787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Decimal integers must hash the same as the ints
87952b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        #
88052b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # The hash of a nonspecial noninteger Decimal must depend only
88152b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # on the value of that Decimal, and not on its representation.
882abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        # For example: hash(Decimal('100E-1')) == hash(Decimal('10')).
883bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger        if self._is_special:
884bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger            if self._isnan():
885bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger                raise TypeError('Cannot hash a NaN value.')
886bea3f6f5c788eb4f0f7639913ff89654152864c0Raymond Hettinger            return hash(str(self))
8878c202440699cef19602acc24822366d0d7c32083Facundo Batista        if not self:
8888c202440699cef19602acc24822366d0d7c32083Facundo Batista            return 0
8898c202440699cef19602acc24822366d0d7c32083Facundo Batista        if self._isinteger():
8908c202440699cef19602acc24822366d0d7c32083Facundo Batista            op = _WorkRep(self.to_integral_value())
8918c202440699cef19602acc24822366d0d7c32083Facundo Batista            # to make computation feasible for Decimals with large
8928c202440699cef19602acc24822366d0d7c32083Facundo Batista            # exponent, we use the fact that hash(n) == hash(m) for
8938c202440699cef19602acc24822366d0d7c32083Facundo Batista            # any two nonzero integers n and m such that (i) n and m
8948c202440699cef19602acc24822366d0d7c32083Facundo Batista            # have the same sign, and (ii) n is congruent to m modulo
8958c202440699cef19602acc24822366d0d7c32083Facundo Batista            # 2**64-1.  So we can replace hash((-1)**s*c*10**e) with
8968c202440699cef19602acc24822366d0d7c32083Facundo Batista            # hash((-1)**s*c*pow(10, e, 2**64-1).
8978c202440699cef19602acc24822366d0d7c32083Facundo Batista            return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1))
89852b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # The value of a nonzero nonspecial Decimal instance is
89952b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # faithfully represented by the triple consisting of its sign,
90052b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # its adjusted exponent, and its coefficient with trailing
90152b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        # zeros removed.
90252b25795c02442fc40f8932d05e5d728266339a4Facundo Batista        return hash((self._sign,
90352b25795c02442fc40f8932d05e5d728266339a4Facundo Batista                     self._exp+len(self._int),
90452b25795c02442fc40f8932d05e5d728266339a4Facundo Batista                     self._int.rstrip('0')))
9057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def as_tuple(self):
9077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as a triple tuple.
9087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        To show the internals exactly as they are.
9107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
911097a1903035f9ee2efb1953306123f183124125dRaymond Hettinger        return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
9127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
9147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Represents the number as an instance of Decimal."""
9157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Invariant:  eval(repr(d)) == d
916abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        return "Decimal('%s')" % str(self)
9177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def __str__(self, eng=False, context=None):
9197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return string representation of the number in scientific notation.
9207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Captures all of the information in the underlying representation.
9227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
9237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
92462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        sign = ['', '-'][self._sign]
925e5a0a9609faea9afdc6f81f1f6dfa07b1437e3aeRaymond Hettinger        if self._is_special:
92662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            if self._exp == 'F':
92762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                return sign + 'Infinity'
92862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            elif self._exp == 'n':
92962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                return sign + 'NaN' + self._int
93062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            else: # self._exp == 'N'
93162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                return sign + 'sNaN' + self._int
93262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
93362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # number of digits of self._int to left of decimal point
93462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        leftdigits = self._exp + len(self._int)
93562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
93662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # dotplace is number of digits of self._int to the left of the
93762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # decimal point in the mantissa of the output string (that is,
93862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        # after adjusting the exponent)
93962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        if self._exp <= 0 and leftdigits > -6:
94062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # no exponent required
94162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            dotplace = leftdigits
94262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        elif not eng:
94362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # usual scientific notation: 1 digit on left of the point
9447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            dotplace = 1
94562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        elif self._int == '0':
94662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # engineering notation, zero
94762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            dotplace = (leftdigits + 1) % 3 - 1
9487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
94962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            # engineering notation, nonzero
95062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            dotplace = (leftdigits - 1) % 3 + 1
95162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
95262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        if dotplace <= 0:
95362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            intpart = '0'
95462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            fracpart = '.' + '0'*(-dotplace) + self._int
95562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        elif dotplace >= len(self._int):
95662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            intpart = self._int+'0'*(dotplace-len(self._int))
95762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            fracpart = ''
95862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        else:
95962edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            intpart = self._int[:dotplace]
96062edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            fracpart = '.' + self._int[dotplace:]
96162edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        if leftdigits == dotplace:
96262edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            exp = ''
96362edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        else:
96462edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            if context is None:
96562edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista                context = getcontext()
96662edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista            exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
96762edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista
96862edb71556d26f924a0e2e949af9cd3c211dea23Facundo Batista        return sign + intpart + fracpart + exp
9697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, context=None):
9717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Convert to engineering-type string.
9727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Engineering notation has an exponent which is a multiple of 3, so there
9747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        are up to 3 digits left of the decimal place.
9757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Same rules for when in exponential and when as a value as in __str__.
9777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self.__str__(eng=True, context=context)
9797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __neg__(self, context=None):
9817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy with the sign switched.
9827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds, if it has reason.
9847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
985636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
986636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
987636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
988636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
9897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
9907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
9917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # -Decimal('0') is Decimal('0'), not Decimal('-0')
9920f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            ans = self.copy_abs()
9937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self.copy_negate()
995636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
996636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
997636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
998e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
9997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __pos__(self, context=None):
10017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns a copy, unless it is a sNaN.
10027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds the number (if more then precision digits)
10047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1005636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1006636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1007636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1008636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
10117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # + (-0) = 0
10120f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista            ans = self.copy_abs()
1013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
1014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = Decimal(self)
10157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1016636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1017636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
1018e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
10197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1020e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    def __abs__(self, round=True, context=None):
10217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of self.
10227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1023e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        If the keyword argument 'round' is false, do not round.  The
1024e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        expression self.__abs__(round=False) is equivalent to
1025e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        self.copy_abs().
10267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1027e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        if not round:
1028e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            return self.copy_abs()
1029e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista
1030636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1031636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
1032636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1033636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
10367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__neg__(context=context)
10377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
10387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = self.__pos__(context=context)
10397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
10417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __add__(self, other, context=None):
10437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns self + other.
10447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        -INF + INF (or the reverse) cause InvalidOperation errors.
10467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1047636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1048267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1049267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
1050636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
10517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
10527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
10537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1054636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1055636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1056636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1057636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
10587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1059636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity():
106059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                # If both INF, same sign => same as both, opposite => error.
1061636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if self._sign != other._sign and other._isinfinity():
1062636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '-INF + INF')
1063636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal(self)
1064636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
106559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                return Decimal(other)  # Can't both be infinity here
10667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = min(self._exp, other._exp)
10687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negativezero = 0
10697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context.rounding == ROUND_FLOOR and self._sign != other._sign:
107059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If the answer is 0, the sign should be negative, in this case.
10717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            negativezero = 1
10727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self and not other:
10747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            sign = min(self._sign, other._sign)
10757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if negativezero:
10767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                sign = 1
107772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(sign, '0', exp)
1078e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
1079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
10807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
108199b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista            exp = max(exp, other._exp - context.prec-1)
1082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = other._rescale(exp, context.rounding)
1083e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
10847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not other:
108699b5548298ffc2ae5f03bd9ef873ce45a9844f0eFacundo Batista            exp = max(exp, self._exp - context.prec-1)
1087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._rescale(exp, context.rounding)
1088e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
10897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
10907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op1 = _WorkRep(self)
10927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        op2 = _WorkRep(other)
1093e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        op1, op2 = _normalize(op1, op2, context.prec)
10947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
10957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result = _WorkRep()
10967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if op1.sign != op2.sign:
10977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            # Equal and opposite
109817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.int == op2.int:
109972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(negativezero, '0', exp)
1100e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                ans = ans._fix(context)
1101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return ans
110217931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.int < op2.int:
11037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1, op2 = op2, op1
110459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                # OK, now abs(op1) > abs(op2)
110517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            if op1.sign == 1:
110617931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger                result.sign = 1
11077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                op1.sign, op2.sign = op2.sign, op1.sign
11087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
110917931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger                result.sign = 0
111059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                # So we know the sign, and op1 > 0.
111117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        elif op1.sign == 1:
11127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            result.sign = 1
111317931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            op1.sign, op2.sign = (0, 0)
111417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        else:
111517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            result.sign = 0
111659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # Now, op1 > abs(op2) > 0
11177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
111817931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        if op2.sign == 0:
1119636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            result.int = op1.int + op2.int
11207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
1121636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            result.int = op1.int - op2.int
11227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.exp = op1.exp
11247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ans = Decimal(result)
1125e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        ans = ans._fix(context)
11267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
11277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __radd__ = __add__
11297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __sub__(self, other, context=None):
1131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return self - other"""
1132636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1133267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1134267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
11357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1136636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1137636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context=context)
1138636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1139636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
11407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self - other is computed as self + other.copy_negate()
1142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self.__add__(other.copy_negate(), context=context)
11437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rsub__(self, other, context=None):
1145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return other - self"""
1146636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1147267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1148267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
11497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return other.__sub__(self, context=context)
11517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mul__(self, other, context=None):
11537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self * other.
11547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (+-) INF * 0 (or its reverse) raise InvalidOperation.
11567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1157636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1158267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1159267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
1160636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
11617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
11627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
11637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1164d87ac8f24da5dce860b559b69e6af59edd2c3eecRaymond Hettinger        resultsign = self._sign ^ other._sign
11657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1166636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1167636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1168636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
1169636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
1170636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1171636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity():
1172636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if not other:
1173636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '(+-)INF * 0')
1174636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Infsign[resultsign]
1175636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1176636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
1177636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if not self:
1178636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                    return context._raise_error(InvalidOperation, '0 * (+-)INF')
1179636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Infsign[resultsign]
11807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        resultexp = self._exp + other._exp
11827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by zero
11847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self or not other:
118572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(resultsign, '0', resultexp)
1186e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            # Fixing in case the exponent is out of bounds
1187e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
11887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
11907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Special case for multiplying by power of 10
119172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if self._int == '1':
119272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(resultsign, other._int, resultexp)
1193e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
11947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
119572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if other._int == '1':
119672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(resultsign, self._int, resultexp)
1197e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista            ans = ans._fix(context)
11987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
11997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1200636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        op1 = _WorkRep(self)
1201636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        op2 = _WorkRep(other)
1202636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
120372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
1204e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        ans = ans._fix(context)
12057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
12077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __rmul__ = __mul__
12087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12098aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    def __truediv__(self, other, context=None):
12107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return self / other."""
1211636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1212267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1213cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return NotImplemented
1214636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
12157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if context is None:
12167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context = getcontext()
12177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1218636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        sign = self._sign ^ other._sign
1219636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1220636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
1221636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(other, context)
1222636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
12237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return ans
12247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1225636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity() and other._isinfinity():
12267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
12277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
12287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if self._isinfinity():
1229636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Infsign[sign]
1230636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1231636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if other._isinfinity():
1232636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context._raise_error(Clamped, 'Division by infinity')
123372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(sign, '0', context.Etiny())
1234636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1235636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        # Special cases for zeroes
1236636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if not other:
1237cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if not self:
1238cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionUndefined, '0 / 0')
1239636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            return context._raise_error(DivisionByZero, 'x / 0', sign)
12407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1241cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not self:
1242cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            exp = self._exp - other._exp
1243cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            coeff = 0
1244cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        else:
1245cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            # OK, so neither = 0, INF or NaN
1246cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            shift = len(other._int) - len(self._int) + context.prec + 1
1247cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            exp = self._exp - other._exp - shift
1248cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op1 = _WorkRep(self)
1249cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op2 = _WorkRep(other)
1250cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if shift >= 0:
1251cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                coeff, remainder = divmod(op1.int * 10**shift, op2.int)
1252cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1253cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
1254cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if remainder:
1255cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                # result is not exact; adjust to ensure correct rounding
1256cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                if coeff % 5 == 0:
1257cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    coeff += 1
1258cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1259cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                # result is exact; get as close to ideal exponent as possible
1260cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                ideal_exp = self._exp - other._exp
1261cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                while exp < ideal_exp and coeff % 10 == 0:
1262cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    coeff //= 10
1263cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    exp += 1
12647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
126572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(sign, str(coeff), exp)
1266cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return ans._fix(context)
12677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1268cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista    def _divide(self, other, context):
1269cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        """Return (self // other, self % other), to context.prec precision.
12707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1271cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        Assumes that neither self nor other is a NaN, that self is not
1272cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        infinite and that other is nonzero.
1273cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        """
1274cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        sign = self._sign ^ other._sign
1275cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if other._isinfinity():
1276cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            ideal_exp = self._exp
1277cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        else:
1278cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            ideal_exp = min(self._exp, other._exp)
12797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1280cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        expdiff = self.adjusted() - other.adjusted()
1281cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not self or other._isinfinity() or expdiff <= -2:
128272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return (_dec_from_triple(sign, '0', 0),
1283cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                    self._rescale(ideal_exp, context.rounding))
1284cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if expdiff <= context.prec:
1285cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op1 = _WorkRep(self)
1286cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            op2 = _WorkRep(other)
1287cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if op1.exp >= op2.exp:
1288cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                op1.int *= 10**(op1.exp - op2.exp)
1289cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1290cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                op2.int *= 10**(op2.exp - op1.exp)
1291cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            q, r = divmod(op1.int, op2.int)
1292cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if q < 10**context.prec:
129372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return (_dec_from_triple(sign, str(q), 0),
129472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                        _dec_from_triple(self._sign, str(r), ideal_exp))
12957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1296cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        # Here the quotient is too large to be representable
1297cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = context._raise_error(DivisionImpossible,
1298cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                                   'quotient too large in //, % or divmod')
1299cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return ans, ans
13007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13018aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    def __rtruediv__(self, other, context=None):
13028aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson        """Swaps self/other and returns __truediv__."""
1303636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1304267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1305267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13068aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson        return other.__truediv__(self, context=context)
13078aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson
13088aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    __div__ = __truediv__
13098aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson    __rdiv__ = __rtruediv__
13107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __divmod__(self, other, context=None):
13127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1313cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        Return (self // other, self % other)
13147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1315cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        other = _convert_other(other)
1316cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if other is NotImplemented:
1317cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return other
1318cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1319cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if context is None:
1320cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            context = getcontext()
1321cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1322cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = self._check_nans(other, context)
1323cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if ans:
1324cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return (ans, ans)
1325cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1326cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        sign = self._sign ^ other._sign
1327cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if self._isinfinity():
1328cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if other._isinfinity():
1329cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
1330cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return ans, ans
1331cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1332cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return (Infsign[sign],
1333cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                        context._raise_error(InvalidOperation, 'INF % x'))
1334cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1335cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not other:
1336cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if not self:
1337cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
1338cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return ans, ans
1339cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1340cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return (context._raise_error(DivisionByZero, 'x // 0', sign),
1341cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                        context._raise_error(InvalidOperation, 'x % 0'))
1342cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1343cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        quotient, remainder = self._divide(other, context)
1344e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        remainder = remainder._fix(context)
1345cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return quotient, remainder
13467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rdivmod__(self, other, context=None):
13487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __divmod__."""
1349636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1350267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1351267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__divmod__(self, context=context)
13537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __mod__(self, other, context=None):
13557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self % other
13577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1358636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1359267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1360267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1362cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if context is None:
1363cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            context = getcontext()
13647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1365cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = self._check_nans(other, context)
1366cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if ans:
1367cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return ans
13687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1369cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if self._isinfinity():
1370cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(InvalidOperation, 'INF % x')
1371cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        elif not other:
1372cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if self:
1373cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(InvalidOperation, 'x % 0')
1374cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1375cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionUndefined, '0 % 0')
1376cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1377cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        remainder = self._divide(other, context)[1]
1378e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        remainder = remainder._fix(context)
1379cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return remainder
13807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rmod__(self, other, context=None):
13827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __mod__."""
1383636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1384267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1385267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
13867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__mod__(self, context=context)
13877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
13887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, other, context=None):
13897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
13907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Remainder nearest to 0-  abs(remainder-near) <= other/2
13917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1392636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
1393636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
13947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
13967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1397353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
1398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
1399353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
14007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self == +/-infinity -> InvalidOperation
1402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
1403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1404353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'remainder_near(infinity, x)')
14057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # other == 0 -> either InvalidOperation or DivisionUndefined
1407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other:
1408353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self:
1409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation,
1410353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                            'remainder_near(x, 0)')
1411353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1412353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(DivisionUndefined,
1413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                            'remainder_near(0, 0)')
14147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1415353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # other = +/-infinity -> remainder = self
1416353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._isinfinity():
1417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = Decimal(self)
1418353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
14197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1420353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self = 0 -> remainder = self, with ideal exponent
1421353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ideal_exponent = min(self._exp, other._exp)
1422353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
142372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(self._sign, '0', ideal_exponent)
1424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
14257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1426353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # catch most cases of large or small quotient
1427353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        expdiff = self.adjusted() - other.adjusted()
1428353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if expdiff >= context.prec + 1:
1429353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # expdiff >= prec+1 => abs(self/other) > 10**prec
1430cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(DivisionImpossible)
1431353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if expdiff <= -2:
1432353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # expdiff <= -2 => abs(self/other) < 0.1
1433353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._rescale(ideal_exponent, context.rounding)
1434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
14357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adjust both arguments to have the same exponent, then divide
1437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op1 = _WorkRep(self)
1438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op2 = _WorkRep(other)
1439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if op1.exp >= op2.exp:
1440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op1.int *= 10**(op1.exp - op2.exp)
14417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
1442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op2.int *= 10**(op2.exp - op1.exp)
1443353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        q, r = divmod(op1.int, op2.int)
1444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # remainder is r*10**ideal_exponent; other is +/-op2.int *
1445353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 10**ideal_exponent.   Apply correction to ensure that
1446353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # abs(remainder) <= abs(other)/2
1447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if 2*r + (q&1) > op2.int:
1448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            r -= op2.int
1449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            q += 1
1450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if q >= 10**context.prec:
1452cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(DivisionImpossible)
1453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # result has same sign as self unless r is negative
1455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        sign = self._sign
1456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if r < 0:
1457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sign = 1-sign
1458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            r = -r
14597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
146072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(sign, str(r), ideal_exponent)
1461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans._fix(context)
14627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __floordiv__(self, other, context=None):
14647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """self // other"""
1465cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        other = _convert_other(other)
1466cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if other is NotImplemented:
1467cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return other
1468cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1469cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if context is None:
1470cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            context = getcontext()
1471cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1472cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        ans = self._check_nans(other, context)
1473cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if ans:
1474cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return ans
1475cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1476cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if self._isinfinity():
1477cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if other._isinfinity():
1478cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(InvalidOperation, 'INF // INF')
1479cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1480cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return Infsign[self._sign ^ other._sign]
1481cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1482cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        if not other:
1483cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            if self:
1484cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionByZero, 'x // 0',
1485cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                                            self._sign ^ other._sign)
1486cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            else:
1487cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista                return context._raise_error(DivisionUndefined, '0 // 0')
1488cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista
1489cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista        return self._divide(other, context)[0]
14907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __rfloordiv__(self, other, context=None):
14927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Swaps self/other and returns __floordiv__."""
1493636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
1494267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
1495267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
14967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return other.__floordiv__(self, context=context)
14977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
14987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __float__(self):
14997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Float representation."""
15007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return float(str(self))
15017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __int__(self):
150346b0802ccd9a9c47b27a285526fbb2a8bee5b8cbBrett Cannon        """Converts self to an int, truncating if necessary."""
1504636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
1505636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isnan():
1506636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                context = getcontext()
1507636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidContext)
1508636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            elif self._isinfinity():
15098aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson                raise OverflowError("Cannot convert infinity to int")
1510353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        s = (-1)**self._sign
15117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
151272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return s*int(self._int)*10**self._exp
1513605ed0248375bbf87bbd1d80afc7c6918fd3ce2bRaymond Hettinger        else:
151472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return s*int(self._int[:self._exp] or '0')
15157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15165a05364049a7b0c3eeee94fb7b77e6b41036b3aeRaymond Hettinger    __trunc__ = __int__
15175a05364049a7b0c3eeee94fb7b77e6b41036b3aeRaymond Hettinger
1518116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    @property
1519116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def real(self):
1520116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return self
1521116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
1522116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    @property
1523116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def imag(self):
1524116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return Decimal(0)
1525116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
1526116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def conjugate(self):
1527116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return self
1528116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
1529116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger    def __complex__(self):
1530116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger        return complex(float(self))
1531116f72fa5ceb864efcc47da2f8c437fd29c7e8b3Raymond Hettinger
15327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __long__(self):
15337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts to a long.
15347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Equivalent to long(int(self))
15367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
15377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return long(self.__int__())
15387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1539353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _fix_nan(self, context):
1540353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Decapitate the payload of a NaN to fit the context"""
1541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        payload = self._int
1542353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # maximum length of payload is precision if _clamp=0,
1544353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # precision-1 if _clamp=1.
1545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        max_payload_len = context.prec - context._clamp
1546353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if len(payload) > max_payload_len:
154772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            payload = payload[len(payload)-max_payload_len:].lstrip('0')
154872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, payload, self._exp, True)
15496c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        return Decimal(self)
1550353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1551dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger    def _fix(self, context):
15527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round if it is necessary to keep self within prec precision.
15537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Rounds and fixes the exponent.  Does not raise on a sNaN.
15557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
15567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Arguments:
15577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self - Decimal instance
15587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context - context used.
15597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1560636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
1561353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
1562353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self._isnan():
1563353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # decapitate payload if necessary
1564353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._fix_nan(context)
1565353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1566353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # self is +/-Infinity; return unaltered
15676c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return Decimal(self)
15687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1569353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if self is zero then exponent should be between Etiny and
1570353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.
1571353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Etiny = context.Etiny()
1572353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Etop = context.Etop()
15737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
1574353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exp_max = [context.Emax, Etop][context._clamp]
1575353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            new_exp = min(max(self._exp, Etiny), exp_max)
1576353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if new_exp != self._exp:
1577353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Clamped)
157872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(self._sign, '0', new_exp)
15797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
15806c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return Decimal(self)
15817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1582353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp_min is the smallest allowable exponent of the result,
1583353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # equal to max(self.adjusted()-context.prec+1, Etiny)
1584353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exp_min = len(self._int) + self._exp - context.prec
1585353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if exp_min > Etop:
1586353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # overflow: exp_min > Etop iff self.adjusted() > Emax
1587353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
1588353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
1589353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(Overflow, 'above Emax', self._sign)
1590353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_is_subnormal = exp_min < Etiny
1591353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_is_subnormal:
1592353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Subnormal)
1593353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exp_min = Etiny
15947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1595353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # round if self has too many digits
1596353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp < exp_min:
15977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            context._raise_error(Rounded)
15982ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            digits = len(self._int) + self._exp - exp_min
15992ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            if digits < 0:
16002ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                self = _dec_from_triple(self._sign, '1', exp_min-1)
16012ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                digits = 0
16022ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            this_function = getattr(self, self._pick_rounding_function[context.rounding])
16032ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            changed = this_function(digits)
16042ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            coeff = self._int[:digits] or '0'
16052ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            if changed == 1:
16062ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                coeff = str(int(coeff)+1)
16072ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            ans = _dec_from_triple(self._sign, coeff, exp_min)
16082ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista
16092ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            if changed:
1610353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Inexact)
1611353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_is_subnormal:
1612353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    context._raise_error(Underflow)
1613353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if not ans:
1614353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        # raise Clamped on underflow to 0
1615353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        context._raise_error(Clamped)
1616353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                elif len(ans._int) == context.prec+1:
1617353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    # we get here only if rescaling rounds the
1618353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    # cofficient up to exactly 10**context.prec
1619353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if ans._exp < Etop:
162072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                        ans = _dec_from_triple(ans._sign,
162172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                                   ans._int[:-1], ans._exp+1)
1622353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    else:
1623353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        # Inexact and Rounded have already been raised
1624353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        ans = context._raise_error(Overflow, 'above Emax',
1625353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                                   self._sign)
16267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return ans
16277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1628353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fold down if _clamp == 1 and self has too few digits
1629353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context._clamp == 1 and self._exp > Etop:
1630353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Clamped)
163172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self_padded = self._int + '0'*(self._exp - Etop)
163272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, self_padded, Etop)
16337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1634353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # here self was representable to begin with; return unchanged
16356c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        return Decimal(self)
16367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
16377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    _pick_rounding_function = {}
16387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1639353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # for each of the rounding functions below:
1640353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   self is a finite, nonzero Decimal
1641353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   prec is an integer satisfying 0 <= prec < len(self._int)
16422ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #
16432ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    # each function returns either -1, 0, or 1, as follows:
16442ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #   1 indicates that self should be rounded up (away from zero)
16452ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #   0 indicates that self should be truncated, and that all the
16462ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #     digits to be truncated are zeros (so the value is unchanged)
16472ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista    #  -1 indicates that there are nonzero digits to be truncated
16487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1649353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_down(self, prec):
1650353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Also known as round-towards-0, truncate."""
16512ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if _all_zeros(self._int, prec):
16522ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return 0
16532ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        else:
16542ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
16557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1656353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_up(self, prec):
1657353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds away from 0."""
16582ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        return -self._round_down(prec)
16597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1660353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_half_up(self, prec):
1661353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds 5 up (away from 0)"""
166272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if self._int[prec] in '56789':
16632ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return 1
16642ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        elif _all_zeros(self._int, prec):
16652ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return 0
1666353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
16672ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
16687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1669353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_half_down(self, prec):
16707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Round 5 down"""
16712ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if _exact_half(self._int, prec):
16722ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
16732ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        else:
16742ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return self._round_half_up(prec)
16757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1676353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_half_even(self, prec):
1677353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Round 5 to even, rest to nearest."""
16782ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if _exact_half(self._int, prec) and \
16792ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista                (prec == 0 or self._int[prec-1] in '02468'):
16802ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -1
1681353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
16822ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return self._round_half_up(prec)
16837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1684353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_ceiling(self, prec):
16857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds up (not away from 0 if negative.)"""
16867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign:
1687353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._round_down(prec)
16887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
16892ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -self._round_down(prec)
16907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1691353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_floor(self, prec):
16927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds down (not towards 0 if negative)"""
16937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self._sign:
1694353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._round_down(prec)
16957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
16962ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -self._round_down(prec)
16977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1698353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _round_05up(self, prec):
1699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Round down unless digit prec-1 is 0 or 5."""
17002ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if prec and self._int[prec-1] not in '05':
1701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._round_down(prec)
17022ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        else:
17032ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            return -self._round_down(prec)
1704353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1705353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def fma(self, other, third, context=None):
1706353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Fused multiply-add.
17077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1708353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Returns self*other+third with no rounding of the intermediate
1709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        product self*other.
1710353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self and other are multiplied together, with no rounding of
1712353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the result.  The third operand is then added to the result,
1713353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        and a single final rounding is performed.
17147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
1715353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1716353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
17177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
171858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        # compute product; raise InvalidOperation if either operand is
171958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        # a signaling NaN or if the product is zero times infinity.
172058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        if self._is_special or other._is_special:
172158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if context is None:
172258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                context = getcontext()
172358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if self._exp == 'N':
17240f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                return context._raise_error(InvalidOperation, 'sNaN', self)
172558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if other._exp == 'N':
17260f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                return context._raise_error(InvalidOperation, 'sNaN', other)
172758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            if self._exp == 'n':
172858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                product = self
172958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            elif other._exp == 'n':
173058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                product = other
173158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            elif self._exp == 'F':
173258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                if not other:
173358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                    return context._raise_error(InvalidOperation,
173458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                                'INF * 0 in fma')
173558f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                product = Infsign[self._sign ^ other._sign]
173658f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            elif other._exp == 'F':
173758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                if not self:
173858f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                    return context._raise_error(InvalidOperation,
173958f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                                '0 * INF in fma')
174058f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                product = Infsign[self._sign ^ other._sign]
174158f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        else:
174258f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista            product = _dec_from_triple(self._sign ^ other._sign,
174358f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                       str(int(self._int) * int(other._int)),
174458f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista                                       self._exp + other._exp)
17457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
174658f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        third = _convert_other(third, raiseit=True)
174758f6f2e0c9fad1ef9ee921980888dc52da8100ceFacundo Batista        return product.__add__(third, context)
17487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1749353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _power_modulo(self, other, modulo, context=None):
1750353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Three argument version of __pow__"""
17517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1752353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if can't convert other and modulo to Decimal, raise
1753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # TypeError; there's no point returning NotImplemented (no
1754353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # equivalent of __rpow__ for three argument pow)
1755353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
1756353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo = _convert_other(modulo, raiseit=True)
17577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1758353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
1759353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
17607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # deal with NaNs: if there are any sNaNs then first one wins,
1762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (i.e. behaviour for NaNs is identical to that of fma)
1763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_is_nan = self._isnan()
1764353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other_is_nan = other._isnan()
1765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo_is_nan = modulo._isnan()
1766353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_is_nan or other_is_nan or modulo_is_nan:
1767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self_is_nan == 2:
1768353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, 'sNaN',
17690f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        self)
1770353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other_is_nan == 2:
1771353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, 'sNaN',
17720f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        other)
1773353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if modulo_is_nan == 2:
1774353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, 'sNaN',
17750f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista                                        modulo)
1776353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self_is_nan:
17776c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return self._fix_nan(context)
1778353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other_is_nan:
17796c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                return other._fix_nan(context)
17806c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return modulo._fix_nan(context)
1781353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # check inputs: we apply same restrictions as Python's pow()
1783353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (self._isinteger() and
1784353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                other._isinteger() and
1785353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                modulo._isinteger()):
1786353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1787353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'pow() 3rd argument not allowed '
1788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'unless all arguments are integers')
1789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other < 0:
1790353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1791353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'pow() 2nd argument cannot be '
1792353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'negative when 3rd argument specified')
1793353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not modulo:
1794353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'pow() 3rd argument cannot be 0')
1796353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # additional restriction for decimal: the modulus must be less
1798353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # than 10**prec in absolute value
1799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if modulo.adjusted() >= context.prec:
1800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1801353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'insufficient precision: pow() 3rd '
1802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'argument must not have more than '
1803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'precision digits')
1804353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # define 0**0 == NaN, for consistency with two-argument pow
1806353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (even though it hurts!)
1807353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other and not self:
1808353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
1809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'at least one of pow() 1st argument '
1810353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'and 2nd argument must be nonzero ;'
1811353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        '0**0 is not defined')
1812353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute sign of result
1814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._iseven():
1815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sign = 0
1816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
1817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sign = self._sign
1818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # convert modulo to a Python integer, and self and other to
1820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Decimal integers (i.e. force their exponents to be >= 0)
1821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo = abs(int(modulo))
1822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        base = _WorkRep(self.to_integral_value())
1823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exponent = _WorkRep(other.to_integral_value())
1824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute result using integer pow()
1826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
1827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        for i in xrange(exponent.exp):
1828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            base = pow(base, 10, modulo)
1829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        base = pow(base, exponent.int, modulo)
1830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
183172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(sign, str(base), 0)
1832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _power_exact(self, other, p):
1834353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Attempt to compute self**other exactly.
1835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Given Decimals self and other and an integer p, attempt to
1837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        compute an exact result for the power self**other, with p
1838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        digits of precision.  Return None if self**other is not
1839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exactly representable in p digits.
1840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1841353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Assumes that elimination of special cases has already been
1842353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        performed: self and other must both be nonspecial; self must
1843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        be positive and not numerically equal to 1; other must be
1844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        nonzero.  For efficiency, other._exp should not be too large,
1845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        so that 10**abs(other._exp) is a feasible calculation."""
1846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # In the comments below, we write x for the value of self and
1848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # y for the value of other.  Write x = xc*10**xe and y =
1849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # yc*10**ye.
1850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # The main purpose of this method is to identify the *failure*
1852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # of x**y to be exactly representable with as little effort as
1853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # possible.  So we look for cheap and easy tests that
1854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # eliminate the possibility of x**y being exact.  Only if all
1855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # these tests are passed do we go on to actually compute x**y.
1856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Here's the main idea.  First normalize both x and y.  We
1858353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # express y as a rational m/n, with m and n relatively prime
1859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # and n>0.  Then for x**y to be exactly representable (at
1860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # *any* precision), xc must be the nth power of a positive
1861353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # integer and xe must be divisible by n.  If m is negative
1862353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # then additionally xc must be a power of either 2 or 5, hence
1863353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # a power of 2**n or 5**n.
1864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # There's a limit to how small |y| can be: if y=m/n as above
1866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # then:
1867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #  (1) if xc != 1 then for the result to be representable we
1869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      need xc**(1/n) >= 2, and hence also xc**|y| >= 2.  So
1870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
1871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      2**(1/|y|), hence xc**|y| < 2 and the result is not
1872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      representable.
1873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #  (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1.  Hence if
1875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #      |y| < 1/|xe| then the result is not representable.
1876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Note that since x is not equal to 1, at least one of (1) and
1878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (2) must apply.  Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
1879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
1880353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
1881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # There's also a limit to how large y can be, at least if it's
1882353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # positive: the normalized result will have coefficient xc**y,
1883353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # so if it's representable then xc**y < 10**p, and y <
1884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # p/log10(xc).  Hence if y*log10(xc) >= p then the result is
1885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # not exactly representable.
1886353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
1888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # so |y| < 1/xe and the result is not representable.
1889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
1890353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # < 1/nbits(xc).
1891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        x = _WorkRep(self)
1893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        xc, xe = x.int, x.exp
1894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while xc % 10 == 0:
1895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc //= 10
1896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xe += 1
1897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _WorkRep(other)
1899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        yc, ye = y.int, y.exp
1900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while yc % 10 == 0:
1901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            yc //= 10
1902353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ye += 1
1903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # case where xc == 1: result is 10**(xe*y), with xe*y
1905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # required to be an integer
1906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if xc == 1:
1907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ye >= 0:
1908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exponent = xe*yc*10**ye
1909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exponent, remainder = divmod(xe*yc, 10**-ye)
1911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if remainder:
1912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if y.sign == 1:
1914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exponent = -exponent
1915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # if other is a nonnegative integer, use ideal exponent
1916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._isinteger() and other._sign == 0:
1917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                ideal_exponent = self._exp*int(other)
1918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                zeros = min(exponent-ideal_exponent, p-1)
1919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                zeros = 0
192172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
1922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # case where y is negative: xc must be either a power
1924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # of 2 or a power of 5.
1925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if y.sign == 1:
1926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            last_digit = xc % 10
1927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if last_digit in (2,4,6,8):
1928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # quick test for power of 2
1929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if xc & -xc != xc:
1930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # now xc is a power of 2; e is its exponent
1932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                e = _nbits(xc)-1
1933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # find e*y and xe*y; both must be integers
1934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if ye >= 0:
1935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    y_as_int = yc*10**ye
1936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e = e*y_as_int
1937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe = xe*y_as_int
1938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
1939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    ten_pow = 10**-ye
1940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e, remainder = divmod(e*yc, ten_pow)
1941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
1942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
1943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe, remainder = divmod(xe*yc, ten_pow)
1944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
1945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
1946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if e*65 >= p*93: # 93/65 > log(10)/log(5)
1948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                xc = 5**e
1950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
1951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            elif last_digit == 5:
1952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # e >= log_5(xc) if xc is a power of 5; we have
1953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # equality all the way up to xc=5**2658
1954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                e = _nbits(xc)*28//65
1955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                xc, remainder = divmod(5**e, xc)
1956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if remainder:
1957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                while xc % 5 == 0:
1959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xc //= 5
1960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e -= 1
1961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if ye >= 0:
1962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    y_as_integer = yc*10**ye
1963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e = e*y_as_integer
1964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe = xe*y_as_integer
1965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
1966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    ten_pow = 10**-ye
1967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    e, remainder = divmod(e*yc, ten_pow)
1968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
1969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
1970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    xe, remainder = divmod(xe*yc, ten_pow)
1971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if remainder:
1972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return None
1973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if e*3 >= p*10: # 10/3 > log(10)/log(2)
1974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return None
1975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                xc = 2**e
1976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
1977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
19787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xc >= 10**p:
1980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
1981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xe = -e-xe
198272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, str(xc), xe)
19837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
1984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # now y is positive; find m and n such that y = m/n
1985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ye >= 0:
1986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            m, n = yc*10**ye, 1
1987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
1988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xe != 0 and len(str(abs(yc*xe))) <= -ye:
1989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
1990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc_bits = _nbits(xc)
1991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
1992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
1993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            m, n = yc, 10**(-ye)
1994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while m % 2 == n % 2 == 0:
1995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                m //= 2
1996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n //= 2
1997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while m % 5 == n % 5 == 0:
1998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                m //= 5
1999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n //= 5
2000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute nth root of xc*10**xe
2002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if n > 1:
2003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # if 1 < xc < 2**n then xc isn't an nth power
2004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if xc != 1 and xc_bits <= n:
2005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xe, rem = divmod(xe, n)
2008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if rem != 0:
2009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # compute nth root of xc using Newton's method
2012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            a = 1L << -(-_nbits(xc)//n) # initial estimate
2013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
2014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                q, r = divmod(xc, a**(n-1))
2015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if a <= q:
2016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
2017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
2018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    a = (a*(n-1) + q)//n
2019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not (a == q and r == 0):
2020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return None
2021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc = a
2022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # now xc*10**xe is the nth root of the original xc*10**xe
2024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute mth power of xc*10**xe
2025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
2027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 10**p and the result is not representable.
2028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if xc > 1 and m > p*100//_log10_lb(xc):
2029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return None
2030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        xc = xc**m
2031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        xe *= m
2032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if xc > 10**p:
2033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return None
2034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # by this point the result *is* exactly representable
2036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adjust the exponent to get as close as possible to the ideal
2037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exponent, if necessary
2038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        str_xc = str(xc)
2039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._isinteger() and other._sign == 0:
2040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ideal_exponent = self._exp*int(other)
2041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            zeros = min(xe-ideal_exponent, p-len(str_xc))
2042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            zeros = 0
204472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
2045cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
2046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def __pow__(self, other, modulo=None, context=None):
2047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return self ** other [ % modulo].
20487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With two arguments, compute self**other.
20507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With three arguments, compute (self**other) % modulo.  For the
2052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        three argument form, the following restrictions on the
2053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        arguments hold:
20547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - all three arguments must be integral
2056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - other must be nonnegative
2057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - either self or other (or both) must be nonzero
2058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - modulo must be nonzero and must have at most p digits,
2059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista           where p is the context precision.
20607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        If any of these restrictions is violated the InvalidOperation
2062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        flag is raised.
2063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result of pow(self, other, modulo) is identical to the
2065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        result that would be obtained by computing (self**other) %
2066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        modulo with unbounded precision, but is computed more
2067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        efficiently.  It is always exact.
2068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if modulo is not None:
2071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._power_modulo(other, modulo, context)
20727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2073636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        other = _convert_other(other)
2074267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger        if other is NotImplemented:
2075267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger            return other
20767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
20797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # either argument is a NaN => result is NaN
2081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
2082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
2083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
20847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
2086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other:
2087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not self:
2088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return context._raise_error(InvalidOperation, '0 ** 0')
2089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return Dec_p1
20917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # result has sign 1 iff self._sign is 1 and other is an odd integer
2093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        result_sign = 0
2094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 1:
2095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._isinteger():
2096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if not other._iseven():
2097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    result_sign = 1
2098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # -ve**noninteger = NaN
2100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # (-0)**noninteger = 0**noninteger
2101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self:
2102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return context._raise_error(InvalidOperation,
2103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        'x ** y with x negative and y not an integer')
2104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # negate self, without doing any unwanted rounding
210572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self = self.copy_negate()
2106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
2108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
2109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._sign == 0:
211072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(result_sign, '0', 0)
2111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return Infsign[result_sign]
2113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
2115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
2116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._sign == 0:
2117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return Infsign[result_sign]
2118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
211972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(result_sign, '0', 0)
2120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 1**other = 1, but the choice of exponent and the flags
2122353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # depend on the exponent of self, and on whether other is a
2123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # positive integer, a negative integer, or neither
2124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self == Dec_p1:
2125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if other._isinteger():
2126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # exp = max(self._exp*max(int(other), 0),
2127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # 1-context.prec) but evaluating int(other) directly
2128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # is dangerous until we know other is small (other
2129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # could be 1e999999999)
2130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other._sign == 1:
2131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    multiplier = 0
2132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                elif other > context.prec:
2133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    multiplier = context.prec
2134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                else:
2135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    multiplier = int(other)
2136353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exp = self._exp * multiplier
2138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if exp < 1-context.prec:
2139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    exp = 1-context.prec
2140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    context._raise_error(Rounded)
2141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Inexact)
2143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Rounded)
2144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                exp = 1-context.prec
2145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
214672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
2147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # compute adjusted exponent of self
2149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_adj = self.adjusted()
2150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self ** infinity is infinity if self > 1, 0 if self < 1
2152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self ** -infinity is infinity if self < 1, 0 if self > 1
2153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._isinfinity():
2154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if (other._sign == 0) == (self_adj < 0):
215572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                return _dec_from_triple(result_sign, '0', 0)
2156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return Infsign[result_sign]
2158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # from here on, the result always goes through the call
2160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # to _fix at the end of this function.
2161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = None
2162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # crude test to catch cases of extreme overflow/underflow.  If
2164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(self)*other >= 10**bound and bound >= len(str(Emax))
2165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
2166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # self**other >= 10**(Emax+1), so overflow occurs.  The test
2167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # for underflow is similar.
2168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        bound = self._log10_exp_bound() + other.adjusted()
2169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if (self_adj >= 0) == (other._sign == 0):
2170353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self > 1 and other +ve, or self < 1 and other -ve
2171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # possibility of overflow
2172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if bound >= len(str(context.Emax)):
217372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(result_sign, '1', context.Emax+1)
2174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self > 1 and other -ve, or self < 1 and other +ve
2176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # possibility of underflow to 0
2177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            Etiny = context.Etiny()
2178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if bound >= len(str(-Etiny)):
217972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(result_sign, '1', Etiny-1)
2180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # try for an exact result with precision +1
2182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans is None:
2183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._power_exact(other, context.prec + 1)
2184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans is not None and result_sign == 1:
218572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(1, ans._int, ans._exp)
2186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # usual case: inexact result, x**y computed directly as exp(y*log(x))
2188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans is None:
2189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            p = context.prec
2190353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            x = _WorkRep(self)
2191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            xc, xe = x.int, x.exp
2192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            y = _WorkRep(other)
2193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            yc, ye = y.int, y.exp
2194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if y.sign == 1:
2195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                yc = -yc
2196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # compute correctly rounded result:  start with precision +3,
2198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # then increase precision until result is unambiguously roundable
2199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            extra = 3
2200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
2201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
2202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if coeff % (5*10**(len(str(coeff))-p-1)):
2203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
2204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                extra += 3
2205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
220672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(result_sign, str(coeff), exp)
2207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the specification says that for non-integer other we need to
2209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # raise Inexact, even when the result is actually exact.  In
2210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the same way, we need to raise Underflow here if the result
2211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # is subnormal.  (The call to _fix will take care of raising
2212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Rounded and Subnormal, as usual.)
2213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not other._isinteger():
2214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
2215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # pad with zeros up to length context.prec+1 if necessary
2216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if len(ans._int) <= context.prec:
2217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                expdiff = context.prec+1 - len(ans._int)
221872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
221972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                       ans._exp-expdiff)
2220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans.adjusted() < context.Emin:
2221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Underflow)
2222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # unlike exp, ln and log10, the power function respects the
2224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # rounding mode; no need to use ROUND_HALF_EVEN here
2225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
2227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def __rpow__(self, other, context=None):
2229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Swaps self/other and returns __pow__."""
2230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other)
2231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other is NotImplemented:
2232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return other
2233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return other.__pow__(self, context=context)
2234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def normalize(self, context=None):
2236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
2237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
2242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._check_nans(context=context)
2243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans:
2244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return ans
2245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        dup = self._fix(context)
2247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if dup._isinfinity():
2248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return dup
2249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not dup:
225172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(dup._sign, '0', 0)
2252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exp_max = [context.Emax, context.Etop()][context._clamp]
2253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        end = len(dup._int)
22547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = dup._exp
225572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        while dup._int[end-1] == '0' and exp < exp_max:
22567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            exp += 1
22577c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            end -= 1
225872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(dup._sign, dup._int[:end], exp)
22597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2260bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista    def quantize(self, exp, rounding=None, context=None, watchexp=True):
22617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Quantize self so its exponent is the same as that of exp.
22627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
22637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Similar to self._rescale(exp._exp) but with error checking.
22647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2265bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista        exp = _convert_other(exp, raiseit=True)
2266bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista
2267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if rounding is None:
2270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rounding = context.rounding
2271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2272636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or exp._is_special:
2273636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(exp, context)
2274636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
2275636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
22767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2277636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if exp._isinfinity() or self._isinfinity():
2278636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if exp._isinfinity() and self._isinfinity():
22796c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return Decimal(self)  # if both are inf, it is OK
2280636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return context._raise_error(InvalidOperation,
2281636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                                        'quantize with one INF')
2282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2283bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista        # if we're not watching exponents, do a simple rescale
2284bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista        if not watchexp:
2285bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            ans = self._rescale(exp._exp, rounding)
2286bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            # raise Inexact and Rounded where appropriate
2287bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            if ans._exp > self._exp:
2288bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista                context._raise_error(Rounded)
2289bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista                if ans != self:
2290bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista                    context._raise_error(Inexact)
2291bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista            return ans
2292bd2fe839db886de6ce9631acd8aa9796b413a565Facundo Batista
2293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp._exp should be between Etiny and Emax
2294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (context.Etiny() <= exp._exp <= context.Emax):
2295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                   'target exponent out of bounds in quantize')
2297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
229972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(self._sign, '0', exp._exp)
2300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
2301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_adjusted = self.adjusted()
2303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_adjusted > context.Emax:
2304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'exponent of quantize result too large for current context')
2306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_adjusted - exp._exp + 1 > context.prec:
2307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'quantize result has too many digits for current context')
2309353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2310353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._rescale(exp._exp, rounding)
2311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans.adjusted() > context.Emax:
2312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'exponent of quantize result too large for current context')
2314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if len(ans._int) > context.prec:
2315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'quantize result has too many digits for current context')
2317353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # raise appropriate flags
2319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans._exp > self._exp:
2320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
2321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans != self:
2322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Inexact)
2323353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans and ans.adjusted() < context.Emin:
2324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Subnormal)
2325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # call to fix takes care of any necessary folddown
2327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
23297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, other):
23311a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self and other have the same exponent; otherwise
23321a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return False.
23337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23341a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        If either operand is a special value, the following rules are used:
23351a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista           * return True if both operands are infinities
23361a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista           * return True if both operands are NaNs
23371a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista           * otherwise, return False.
23387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
23391a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        other = _convert_other(other, raiseit=True)
2340636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
23411a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista            return (self.is_nan() and other.is_nan() or
23421a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista                    self.is_infinite() and other.is_infinite())
23437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self._exp == other._exp
23447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _rescale(self, exp, rounding):
2346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rescale self so that the exponent is exp, either by padding with zeros
2347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        or by truncating digits, using the given rounding mode.
2348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Specials are returned without change.  This operation is
2350353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        quiet: it raises no flags, and uses no information from the
2351353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.
23527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exp = exp to scale to (an integer)
2354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = rounding mode
23557c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2356636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
23576c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
23587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
235972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, '0', exp)
23607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2361353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp >= exp:
2362353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # pad answer with zeros if necessary
236372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign,
236472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                        self._int + '0'*(self._exp - exp), exp)
23657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2366353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # too many digits; round and lose data.  If self.adjusted() <
2367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp-1, replace self by 10**(exp-1) before rounding
2368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        digits = len(self._int) + self._exp - exp
23697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if digits < 0:
237072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self = _dec_from_triple(self._sign, '1', exp-1)
2371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            digits = 0
2372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        this_function = getattr(self, self._pick_rounding_function[rounding])
23732ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        changed = this_function(digits)
23742ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        coeff = self._int[:digits] or '0'
23752ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        if changed == 1:
23762ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista            coeff = str(int(coeff)+1)
23772ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista        return _dec_from_triple(self._sign, coeff, exp)
23787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
23791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    def _round(self, places, rounding):
23801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        """Round a nonzero, nonspecial Decimal to a fixed number of
23811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        significant figures, using the given rounding mode.
23821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
23831ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        Infinities, NaNs and zeros are returned unaltered.
23841ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
23851ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        This operation is quiet: it raises no flags, and uses no
23861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        information from the context.
23871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
23881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        """
23891ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if places <= 0:
23901ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            raise ValueError("argument should be at least 1 in _round")
23911ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if self._is_special or not self:
23921ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            return Decimal(self)
23931ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        ans = self._rescale(self.adjusted()+1-places, rounding)
23941ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # it can happen that the rescale alters the adjusted exponent;
23951ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # for example when rounding 99.97 to 3 significant figures.
23961ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # When this happens we end up with an extra 0 at the end of
23971ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # the number; a second rescale fixes this.
23981ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if ans.adjusted() != self.adjusted():
23991ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            ans = ans._rescale(ans.adjusted()+1-places, rounding)
24001ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        return ans
24011ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
2402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_exact(self, rounding=None, context=None):
2403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds to a nearby integer.
24047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        If no rounding mode is specified, take the rounding mode from
2406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the context.  This method raises the Rounded and Inexact flags
2407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        when appropriate.
24087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        See also: to_integral_value, which does exactly the same as
2410353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        this method except that it doesn't raise Inexact or Rounded.
2411353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2412636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
2413636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
2414636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
2415636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
24166c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
24177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
24186c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
2419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
242072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(self._sign, '0', 0)
2421636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if context is None:
2422636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            context = getcontext()
2423353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if rounding is None:
2424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rounding = context.rounding
2425353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._raise_error(Rounded)
2426353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._rescale(0, rounding)
2427353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans != self:
2428353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
24297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return ans
24307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2431353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_value(self, rounding=None, context=None):
2432353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds to the nearest integer, without raising inexact, rounded."""
2433353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if rounding is None:
2436353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rounding = context.rounding
2437353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
2438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self._check_nans(context=context)
2439353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if ans:
2440353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return ans
24416c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
2442353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp >= 0:
24436c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
2444353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2445353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._rescale(0, rounding)
24467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # the method name changed, but we provide also the old one, for compatibility
2448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    to_integral = to_integral_value
2449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def sqrt(self, context=None):
2451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return the square root of self."""
24523b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson        if context is None:
24533b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson            context = getcontext()
24543b24ccbe7e2b43c4373e4b1e988df55978b819e7Mark Dickinson
2455636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special:
2456636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            ans = self._check_nans(context=context)
2457636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if ans:
2458636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return ans
24597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2460636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if self._isinfinity() and self._sign == 0:
2461636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return Decimal(self)
24627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if not self:
2464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # exponent = self._exp // 2.  sqrt(-0) = -0
246572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(self._sign, '0', self._exp // 2)
2466353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans._fix(context)
24677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
24687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._sign == 1:
24697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
24707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # At this point self represents a positive number.  Let p be
2472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the desired precision and express self in the form c*100**e
2473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # with c a positive real number and e an integer, c and e
2474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # being chosen so that 100**(p-1) <= c < 100**p.  Then the
2475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
2476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # <= sqrt(c) < 10**p, so the closest representable Decimal at
2477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # precision p is n*10**e where n = round_half_even(sqrt(c)),
2478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the closest integer to sqrt(c) with the even integer chosen
2479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # in the case of a tie.
2480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        #
2481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # To ensure correct rounding in all cases, we use the
2482353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # following trick: we compute the square root to an extra
2483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # place (precision p+1 instead of precision p), rounding down.
2484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Then, if the result is inexact and its last digit is 0 or 5,
2485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # we increase the last digit to 1 or 6 respectively; if it's
2486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exact we leave the last digit alone.  Now the final round to
2487353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # p places (or fewer in the case of underflow) will round
2488353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # correctly and raise the appropriate flags.
2489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2490353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # use an extra digit of precision
2491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        prec = context.prec+1
2492353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2493353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # write argument in the form c*100**e where e = self._exp//2
2494353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # is the 'ideal' exponent, to be used if the square root is
2495353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exactly representable.  l is the number of 'digits' of c in
2496353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # base 100, so that 100**(l-1) <= c < 100**l.
2497353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
2498353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        e = op.exp >> 1
2499353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if op.exp & 1:
2500353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = op.int * 10
2501353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            l = (len(self._int) >> 1) + 1
25027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
2503353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = op.int
2504353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            l = len(self._int)+1 >> 1
2505353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2506353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # rescale so that c has exactly prec base 100 'digits'
2507353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        shift = prec-l
2508353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if shift >= 0:
2509353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c *= 100**shift
2510353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exact = True
25117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
2512353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c, remainder = divmod(c, 100**-shift)
2513353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            exact = not remainder
2514353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        e -= shift
2515353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2516353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # find n = floor(sqrt(c)) using Newton's method
2517353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        n = 10**prec
2518353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while True:
2519353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            q = c//n
2520353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if n <= q:
25217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                break
2522353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2523353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n = n + q >> 1
2524353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exact = exact and n*n == c
2525353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2526353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if exact:
2527353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result is exact; rescale to use ideal exponent e
2528353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if shift >= 0:
2529353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # assert n % 10**shift == 0
2530353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n //= 10**shift
2531353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2532353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n *= 10**-shift
2533353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            e += shift
25347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        else:
2535353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result is not exact; fix last digit as described above
2536353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if n % 5 == 0:
2537353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                n += 1
25387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
253972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(0, str(n), e)
25407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # round, and fit to current context
2542353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
2543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
2544dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        ans = ans._fix(context)
2545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
25467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2547353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
25487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, other, context=None):
25507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the larger value.
25517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2552353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Like max(self, other) except if one is not a number, returns
25537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
25547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2555353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
2556636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
25576c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
25586c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
25596c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
2560636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
256159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
2562636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # number is always returned
2563636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            sn = self._isnan()
2564636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            on = other._isnan()
2565636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if sn or on:
2566636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if on == 1 and sn != 2:
25676c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return self._fix_nan(context)
2568636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if sn == 1 and on != 2:
25696c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return other._fix_nan(context)
2570636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self._check_nans(other, context)
25717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25722fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self._cmp(other)
2573d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
257459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If both operands are finite and equal in numerical value
2575d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # then an ordering is applied:
2576d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
257759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If the signs differ then max returns the operand with the
2578d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            # positive sign and min returns the operand with the negative sign
2579d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger            #
258059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If the signs are the same then the exponent is used to select
2581353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # the result.  This is exactly the ordering used in compare_total.
2582353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
2583353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2584353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
25857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2586353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2587353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
2588636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2589e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
25907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
25917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, other, context=None):
25927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the smaller value.
25937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
259459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        Like min(self, other) except if one is not a number, returns
25957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        NaN (and signals if one is sNaN).  Also rounds.
25967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
2597353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
2598636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
25996c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
26006c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
26016c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
2602636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        if self._is_special or other._is_special:
260359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
2604636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            # number is always returned
2605636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            sn = self._isnan()
2606636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            on = other._isnan()
2607636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            if sn or on:
2608636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if on == 1 and sn != 2:
26096c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return self._fix_nan(context)
2610636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                if sn == 1 and on != 2:
26116c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return other._fix_nan(context)
2612636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger                return self._check_nans(other, context)
26137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26142fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self._cmp(other)
2615d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        if c == 0:
2616353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
2617353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2618353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
2619353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
2620353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
26217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            ans = other
2622636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
2623e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
26247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _isinteger(self):
26267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns whether self is an integer"""
2627353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special:
2628353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return False
26297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if self._exp >= 0:
26307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return True
26317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rest = self._int[self._exp:]
263272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return rest == '0'*len(rest)
26337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _iseven(self):
2635353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns True if self is even.  Assumes self is an integer."""
2636353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self or self._exp > 0:
2637353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return True
263872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self._int[-1+self._exp] in '02468'
26397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
26407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def adjusted(self):
26417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the adjusted exponent of self"""
26427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        try:
26437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return self._exp + len(self._int) - 1
264459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # If NaN or Infinity, self._exp is string
26457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        except TypeError:
26467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return 0
26477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
2648353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def canonical(self, context=None):
2649353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the same Decimal object.
2650353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2651353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        As we do not have different encodings for the same number, the
2652353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        received object already is in its canonical form.
2653353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2654353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self
2655353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2656353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_signal(self, other, context=None):
2657353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares self to the other operand numerically.
2658353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2659353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        It's pretty much like compare(), but all NaNs signal, with signaling
2660353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        NaNs taking precedence over quiet NaNs.
2661353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
26622fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        other = _convert_other(other, raiseit = True)
26632fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        ans = self._compare_check_nans(other, context)
26642fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        if ans:
26652fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson            return ans
2666353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return self.compare(other, context=context)
2667353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2668353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total(self, other):
2669353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares self to other using the abstract representations.
2670353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2671353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        This is not like the standard compare, which use their numerical
2672353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value. Note that a total ordering is defined for all possible abstract
2673353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        representations.
2674353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2675353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # if one is negative and the other is positive, it's easy
2676353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign and not other._sign:
2677353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Dec_n1
2678353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._sign and other._sign:
2679353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Dec_p1
2680353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        sign = self._sign
2681353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2682353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # let's handle both NaN types
2683353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        self_nan = self._isnan()
2684353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other_nan = other._isnan()
2685353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self_nan or other_nan:
2686353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self_nan == other_nan:
2687353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self._int < other._int:
2688353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if sign:
2689353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return Dec_p1
2690353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    else:
2691353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return Dec_n1
2692353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self._int > other._int:
2693353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    if sign:
2694353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return Dec_n1
2695353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    else:
2696353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                        return Dec_p1
2697353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return Dec_0
2698353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sign:
2700353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 1:
2701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return Dec_n1
2702353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 1:
2703353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return Dec_p1
2704353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 2:
2705353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return Dec_n1
2706353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 2:
2707353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return Dec_p1
2708353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 1:
2710353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return Dec_p1
2711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 1:
2712353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return Dec_n1
2713353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if self_nan == 2:
2714353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return Dec_p1
2715353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if other_nan == 2:
2716353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    return Dec_n1
2717353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2718353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self < other:
2719353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Dec_n1
2720353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self > other:
2721353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Dec_p1
2722353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2723353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp < other._exp:
2724353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sign:
2725353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return Dec_p1
2726353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2727353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return Dec_n1
2728353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._exp > other._exp:
2729353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sign:
2730353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return Dec_n1
2731353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
2732353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return Dec_p1
2733353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return Dec_0
2734353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2735353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2736353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total_mag(self, other):
2737353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares self to other using abstract repr., ignoring sign.
2738353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2739353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Like compare_total, but with operand's sign ignored and assumed to be 0.
2740353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2741353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        s = self.copy_abs()
2742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        o = other.copy_abs()
2743353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return s.compare_total(o)
2744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2745353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_abs(self):
2746353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy with the sign set to 0. """
274772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, self._int, self._exp, self._is_special)
2748353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2749353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_negate(self):
2750353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy with the sign inverted."""
2751353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign:
275272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, self._int, self._exp, self._is_special)
2753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
275472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(1, self._int, self._exp, self._is_special)
2755353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2756353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_sign(self, other):
2757353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns self with the sign of other."""
275872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(other._sign, self._int,
275972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                self._exp, self._is_special)
2760353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def exp(self, context=None):
2762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns e ** self."""
2763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2764353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2765353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2766353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2767353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(NaN) = NaN
2768353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
2769353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
2770353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
2771353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2772353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(-Infinity) = 0
2773353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == -1:
2774353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Dec_0
2775353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2776353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(0) = 1
2777353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
2778353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Dec_p1
2779353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2780353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exp(Infinity) = Infinity
2781353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
2782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Decimal(self)
2783353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2784353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the result is now guaranteed to be inexact (the true
2785353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # mathematical result is transcendental). There's no need to
2786353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # raise Rounded and Inexact here---they'll always be raised as
2787353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # a result of the call to _fix.
2788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        p = context.prec
2789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        adj = self.adjusted()
2790353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2791353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # we only need to do any computation for quite a small range
2792353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # of adjusted exponents---for example, -29 <= adj <= 10 for
2793353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # the default context.  For smaller exponent the result is
2794353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # indistinguishable from 1 at the given precision, while for
2795353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # larger exponent the result either overflows or underflows.
2796353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
2797353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # overflow
279872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '1', context.Emax+1)
2799353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
2800353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # underflow to 0
280172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '1', context.Etiny()-1)
2802353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self._sign == 0 and adj < -p:
2803353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # p+1 digits; final round will raise correct flags
280472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
2805353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif self._sign == 1 and adj < -p-1:
2806353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # p+1 digits; final round will raise correct flags
280772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, '9'*(p+1), -p-1)
2808353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # general case
2809353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
2810353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op = _WorkRep(self)
2811353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c, e = op.int, op.exp
2812353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if op.sign == 1:
2813353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                c = -c
2814353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2815353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # compute correctly rounded result: increase precision by
2816353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # 3 digits at a time until we get an unambiguously
2817353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # roundable result
2818353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            extra = 3
2819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
2820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                coeff, exp = _dexp(c, e, p+extra)
2821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if coeff % (5*10**(len(str(coeff))-p-1)):
2822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
2823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                extra += 3
2824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
282572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(0, str(coeff), exp)
2826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # at this stage, ans should round correctly with *any*
2828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # rounding mode, not just with ROUND_HALF_EVEN
2829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
2830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
2831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
2833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2834353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
2835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_canonical(self):
28371a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is canonical; otherwise return False.
28381a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista
28391a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        Currently, the encoding of a Decimal instance is always
28401a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        canonical, so this method returns True for any Decimal.
28411a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """
28421a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return True
2843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_finite(self):
28451a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is finite; otherwise return False.
2846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
28471a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        A Decimal instance is considered finite if it is neither
28481a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        infinite nor a NaN.
2849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
28501a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return not self._is_special
2851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_infinite(self):
28531a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is infinite; otherwise return False."""
28541a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp == 'F'
2855353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_nan(self):
28571a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a qNaN or sNaN; otherwise return False."""
28581a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp in ('n', 'N')
2859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_normal(self, context=None):
28611a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a normal number; otherwise return False."""
28621a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        if self._is_special or not self:
28631a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista            return False
2864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
28661a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return context.Emin <= self.adjusted() <= context.Emax
2867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_qnan(self):
28691a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a quiet NaN; otherwise return False."""
28701a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp == 'n'
2871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_signed(self):
28731a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is negative; otherwise return False."""
28741a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._sign == 1
2875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_snan(self):
28771a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a signaling NaN; otherwise return False."""
28781a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self._exp == 'N'
2879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2880353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_subnormal(self, context=None):
28811a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is subnormal; otherwise return False."""
28821a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        if self._is_special or not self:
28831a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista            return False
2884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
28861a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return self.adjusted() < context.Emin
2887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_zero(self):
28891a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if self is a zero; otherwise return False."""
289072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return not self._is_special and self._int == '0'
2891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2892353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _ln_exp_bound(self):
2893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compute a lower bound for the adjusted exponent of self.ln().
2894353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        In other words, compute r such that self.ln() >= 10**r.  Assumes
2895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        that self is finite and positive and that self != 1.
2896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
2899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        adj = self._exp + len(self._int) - 1
2900353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj >= 1:
2901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
2902353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str(adj*23//10)) - 1
2903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj <= -2:
2904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # argument <= 0.1
2905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str((-1-adj)*23//10)) - 1
2906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
2907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        c, e = op.int, op.exp
2908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj == 0:
2909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # 1 < self < 10
2910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            num = str(c-10**-e)
2911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            den = str(c)
2912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(num) - len(den) - (num < den)
2913353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adj == -1, 0.1 <= self < 1
2914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return e + len(str(10**-e - c)) - 1
2915353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2917353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def ln(self, context=None):
2918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the natural (base e) logarithm of self."""
2919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
2921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
2922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(NaN) = NaN
2924353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
2925353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
2926353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
2927353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2928353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(0.0) == -Infinity
2929353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
2930353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return negInf
2931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(Infinity) = Infinity
2933353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
2934353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Inf
2935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(1.0) == 0.0
2937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self == Dec_p1:
2938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Dec_0
2939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # ln(negative) raises InvalidOperation
2941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 1:
2942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
2943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'ln of a negative value')
2944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # result is irrational, so necessarily inexact
2946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
2947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        c, e = op.int, op.exp
2948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        p = context.prec
2949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # correctly rounded result: repeatedly increase precision by 3
2951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # until we get an unambiguously roundable result
2952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        places = p - self._ln_exp_bound() + 2 # at least p+3 places
2953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        while True:
2954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            coeff = _dlog(c, e, places)
2955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # assert len(str(abs(coeff)))-p >= 1
2956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
2957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                break
2958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            places += 3
295972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
2960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
2962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
2963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
2964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
2965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
2966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _log10_exp_bound(self):
2968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compute a lower bound for the adjusted exponent of self.log10().
2969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        In other words, find r such that self.log10() >= 10**r.
2970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Assumes that self is finite and positive and that self != 1.
2971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
2972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # For x >= 10 or x < 0.1 we only need a bound on the integer
2974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # part of log10(self), and this comes directly from the
2975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # exponent of x.  For 0.1 <= x <= 10 we use the inequalities
2976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
2977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # (1-1/x)/2.31 > 0.  If x < 1 then |log10(x)| > (1-x)/2.31 > 0
2978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        adj = self._exp + len(self._int) - 1
2980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj >= 1:
2981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self >= 10
2982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str(adj))-1
2983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj <= -2:
2984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # self < 0.1
2985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(str(-1-adj))-1
2986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        op = _WorkRep(self)
2987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        c, e = op.int, op.exp
2988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if adj == 0:
2989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # 1 < self < 10
2990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            num = str(c-10**-e)
2991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            den = str(231*c)
2992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return len(num) - len(den) - (num < den) + 2
2993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # adj == -1, 0.1 <= self < 1
2994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        num = str(10**-e-c)
2995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return len(num) + e - (num < "231") - 1
2996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
2997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def log10(self, context=None):
2998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the base 10 logarithm of self."""
2999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(NaN) = NaN
3004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(0.0) == -Infinity
3009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
3010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return negInf
3011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(Infinity) = Infinity
3013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
3014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Inf
3015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(negative or -Infinity) raises InvalidOperation
3017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign == 1:
3018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation,
3019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                        'log10 of a negative value')
3020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # log10(10**n) = n
302272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
3023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # answer may need rounding
3024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = Decimal(self._exp + len(self._int) - 1)
3025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result is irrational, so necessarily inexact
3027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            op = _WorkRep(self)
3028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c, e = op.int, op.exp
3029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            p = context.prec
3030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # correctly rounded result: repeatedly increase precision
3032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # until result is unambiguously roundable
3033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            places = p-self._log10_exp_bound()+2
3034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            while True:
3035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                coeff = _dlog10(c, e, places)
3036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                # assert len(str(abs(coeff)))-p >= 1
3037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                    break
3039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                places += 3
304072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
3041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context._shallow_copy()
3043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rounding = context._set_rounding(ROUND_HALF_EVEN)
3044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = ans._fix(context)
3045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.rounding = rounding
3046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
3047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logb(self, context=None):
3049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """ Returns the exponent of the magnitude of self's MSD.
3050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the integer which is the exponent of the magnitude
3052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        of the most significant digit of self (as though it were truncated
3053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        to a single digit while maintaining the value of that digit and
3054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        without limiting the resulting exponent).
3055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # logb(NaN) = NaN
3057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # logb(+/-Inf) = +Inf
3065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
3066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Inf
3067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # logb(0) = -Inf, DivisionByZero
3069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self:
3070cce8df2f678b1e1ec11c86cf2fabf12c2077577dFacundo Batista            return context._raise_error(DivisionByZero, 'logb(0)', 1)
3071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # otherwise, simply return the adjusted exponent of self, as a
3073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # Decimal.  Note that no attempt is made to fit the result
3074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # into the current context.
3075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return Decimal(self.adjusted())
3076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _islogical(self):
3078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Return True if self is a logical operand.
3079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3080c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling        For being logical, it must be a finite number with a sign of 0,
3081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        an exponent of 0, and a coefficient whose digits must all be
3082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        either 0 or 1.
3083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign != 0 or self._exp != 0:
3085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return False
3086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        for dig in self._int:
308772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            if dig not in '01':
3088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return False
3089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return True
3090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def _fill_logical(self, context, opa, opb):
3092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        dif = context.prec - len(opa)
3093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if dif > 0:
309472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            opa = '0'*dif + opa
3095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif dif < 0:
3096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            opa = opa[-context.prec:]
3097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        dif = context.prec - len(opb)
3098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if dif > 0:
309972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            opb = '0'*dif + opb
3100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif dif < 0:
3101353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            opb = opb[-context.prec:]
3102353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return opa, opb
3103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_and(self, other, context=None):
3105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies an 'and' operation between self and other's digits."""
3106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._islogical() or not other._islogical():
3109353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fill to context.prec
3112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (opa, opb) = self._fill_logical(context, self._int, other._int)
3113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3114353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # make the operation, and clean starting zeroes
311572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
311672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
3117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_invert(self, context=None):
3119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Invert all its digits."""
3120353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
312272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
312372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                context)
3124353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_or(self, other, context=None):
3126353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies an 'or' operation between self and other's digits."""
3127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3128353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._islogical() or not other._islogical():
3130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fill to context.prec
3133353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (opa, opb) = self._fill_logical(context, self._int, other._int)
3134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # make the operation, and clean starting zeroes
313672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        result = "".join(str(int(a)|int(b)) for a,b in zip(opa,opb))
313772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
3138353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_xor(self, other, context=None):
3140353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies an 'xor' operation between self and other's digits."""
3141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not self._islogical() or not other._islogical():
3144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # fill to context.prec
3147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (opa, opb) = self._fill_logical(context, self._int, other._int)
3148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # make the operation, and clean starting zeroes
315072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        result = "".join(str(int(a)^int(b)) for a,b in zip(opa,opb))
315172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
3152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def max_mag(self, other, context=None):
3154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
3155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
3156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
31576c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
31586c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
31596c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
3160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special or other._is_special:
3161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
3162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # number is always returned
3163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sn = self._isnan()
3164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            on = other._isnan()
3165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sn or on:
3166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if on == 1 and sn != 2:
31676c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return self._fix_nan(context)
3168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if sn == 1 and on != 2:
31696c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return other._fix_nan(context)
3170353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._check_nans(other, context)
3171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
31722fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self.copy_abs()._cmp(other.copy_abs())
3173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == 0:
3174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
3175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
3177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = other
3178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
3180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3181e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
3182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def min_mag(self, other, context=None):
3184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
3185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
3186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
31876c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        if context is None:
31886c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            context = getcontext()
31896c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista
3190353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._is_special or other._is_special:
3191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # If one operand is a quiet NaN and the other is number, then the
3192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # number is always returned
3193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            sn = self._isnan()
3194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            on = other._isnan()
3195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if sn or on:
3196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if on == 1 and sn != 2:
31976c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return self._fix_nan(context)
3198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                if sn == 1 and on != 2:
31996c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista                    return other._fix_nan(context)
3200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return self._check_nans(other, context)
3201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
32022fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        c = self.copy_abs()._cmp(other.copy_abs())
3203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == 0:
3204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = self.compare_total(other)
3205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if c == -1:
3207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self
3208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = other
3210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3211e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        return ans._fix(context)
3212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_minus(self, context=None):
3214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the largest representable number smaller than itself."""
3215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == -1:
3223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return negInf
3224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
322572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(0, '9'*context.prec, context.Etop())
3226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context.copy()
3228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._set_rounding(ROUND_FLOOR)
3229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._ignore_all_flags()
3230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        new_self = self._fix(context)
3231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if new_self != self:
3232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return new_self
323372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
323472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                            context)
3235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_plus(self, context=None):
3237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the smallest representable number larger than itself."""
3238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(context=context)
3242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == 1:
3246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return Inf
3247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity() == -1:
324872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return _dec_from_triple(1, '9'*context.prec, context.Etop())
3249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context = context.copy()
3251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._set_rounding(ROUND_CEILING)
3252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context._ignore_all_flags()
3253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        new_self = self._fix(context)
3254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if new_self != self:
3255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return new_self
325672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
325772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                            context)
3258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_toward(self, other, context=None):
3260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the number closest to self, in the direction towards other.
3261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the closest representable number to self
3263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        (excluding self) that is in the direction towards other,
3264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        unless both have the same value.  If the two operands are
3265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        numerically equal, then the result is a copy of self with the
3266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        sign set to be the same as the sign of other.
3267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        other = _convert_other(other, raiseit=True)
3269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3273353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
32772fc9263df56d28a6c1def6c8a0517bbddfa899afMark Dickinson        comparison = self._cmp(other)
3278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if comparison == 0:
327972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            return self.copy_sign(other)
3280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3281353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if comparison == -1:
3282353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self.next_plus(context)
3283353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else: # comparison == 1
3284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            ans = self.next_minus(context)
3285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3286353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # decide which flags to raise using value of ans
3287353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans._isinfinity():
3288353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Overflow,
3289353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                 'Infinite result from next_toward',
3290353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                 ans._sign)
3291353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
3292353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
3293353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        elif ans.adjusted() < context.Emin:
3294353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Underflow)
3295353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Subnormal)
3296353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Rounded)
3297353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context._raise_error(Inexact)
3298353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # if precision == 1 then we don't raise Clamped for a
3299353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            # result 0E-Etiny.
3300353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if not ans:
3301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                context._raise_error(Clamped)
3302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return ans
3304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3305353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def number_class(self, context=None):
3306353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns an indication of the class of self.
3307353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3308353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The class is one of the following strings:
33090f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista          sNaN
33100f5e7bf3049408d6f4c1855807204c9f13ae98f9Facundo Batista          NaN
3311353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Infinity
3312353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Normal
3313353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Subnormal
3314353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Zero
3315353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Zero
3316353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Subnormal
3317353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Normal
3318353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Infinity
3319353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3320353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_snan():
3321353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "sNaN"
3322353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_qnan():
3323353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "NaN"
3324353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        inf = self._isinfinity()
3325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if inf == 1:
3326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "+Infinity"
3327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if inf == -1:
3328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "-Infinity"
3329353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_zero():
3330353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self._sign:
3331353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "-Zero"
3332353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
3333353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "+Zero"
3334353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3335353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3336353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self.is_subnormal(context=context):
3337353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            if self._sign:
3338353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "-Subnormal"
3339353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            else:
3340353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                return "+Subnormal"
3341353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # just a normal, regular, boring number, :)
3342353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._sign:
3343353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "-Normal"
3344353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
3345353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return "+Normal"
3346353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3347353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def radix(self):
3348353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Just returns 10, as this is Decimal, :)"""
3349353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return Decimal(10)
3350353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3351353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def rotate(self, other, context=None):
3352353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a rotated copy of self, value-of-other times."""
3353353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3354353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3355353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3356353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3357353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3358353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3359353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3360353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._exp != 0:
3361353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3362353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (-context.prec <= int(other) <= context.prec):
3363353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3364353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3365353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
33666c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # get values, pad if necessary
3369353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        torot = int(other)
3370353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotdig = self._int
3371353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        topad = context.prec - len(rotdig)
3372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if topad:
337372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            rotdig = '0'*topad + rotdig
3374353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3375353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # let's rotate!
3376353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotated = rotdig[torot:] + rotdig[:torot]
337772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(self._sign,
337872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                rotated.lstrip('0') or '0', self._exp)
3379353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3380353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def scaleb (self, other, context=None):
3381353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns self operand after adding the second value to its exp."""
3382353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3383353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3384353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3385353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3386353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3387353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3388353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3389353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._exp != 0:
3390353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3391353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        liminf = -2 * (context.Emax + context.prec)
3392353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        limsup =  2 * (context.Emax + context.prec)
3393353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (liminf <= int(other) <= limsup):
3394353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3396353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
33976c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
339972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
3400353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        d = d._fix(context)
3401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return d
3402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def shift(self, other, context=None):
3404353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a shifted copy of self, value-of-other times."""
3405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if context is None:
3406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            context = getcontext()
3407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3408353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        ans = self._check_nans(other, context)
3409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ans:
3410353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return ans
3411353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3412353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if other._exp != 0:
3413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3414353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not (-context.prec <= int(other) <= context.prec):
3415353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return context._raise_error(InvalidOperation)
3416353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if self._isinfinity():
34186c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3420353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # get values, pad if necessary
3421353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        torot = int(other)
3422353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if not torot:
34236c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista            return Decimal(self)
3424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotdig = self._int
3425353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        topad = context.prec - len(rotdig)
3426353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if topad:
342772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            rotdig = '0'*topad + rotdig
3428353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3429353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # let's shift!
3430353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if torot < 0:
3431353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rotated = rotdig[:torot]
3432353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
343372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            rotated = rotdig + '0'*torot
3434353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            rotated = rotated[-context.prec:]
3435353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
343672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista        return _dec_from_triple(self._sign,
343772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista                                    rotated.lstrip('0') or '0', self._exp)
3438353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
343959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # Support for pickling, copy, and deepcopy
34407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __reduce__(self):
34417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return (self.__class__, (str(self),))
34427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
34437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __copy__(self):
34447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
3445cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis            return self     # I'm immutable; therefore I am my own clone
34467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
34477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
34487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __deepcopy__(self, memo):
34497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if type(self) == Decimal:
3450cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis            return self     # My components are also immutable
34517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return self.__class__(str(self))
34527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
34531ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # PEP 3101 support.  See also _parse_format_specifier and _format_align
34541ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    def __format__(self, specifier, context=None):
3455f4da77765f8581e31620e9f49c68028e57b0ae85Mark Dickinson        """Format a Decimal instance according to the given specifier.
34561ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
34571ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        The specifier should be a standard format specifier, with the
34581ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        form described in PEP 3101.  Formatting types 'e', 'E', 'f',
34591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        'F', 'g', 'G', and '%' are supported.  If the formatting type
34601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        is omitted it defaults to 'g' or 'G', depending on the value
34611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        of context.capitals.
34621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
34631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        At this time the 'n' format specifier type (which is supposed
34641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        to use the current locale) is not supported.
34651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        """
34661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
34671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # Note: PEP 3101 says that if the type is not present then
34681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # there should be at least one digit after the decimal point.
34691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # We take the liberty of ignoring this requirement for
34701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # Decimal---it's presumably there to make sure that
34711ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # format(float, '') behaves similarly to str(float).
34721ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if context is None:
34731ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            context = getcontext()
34741ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
34751ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        spec = _parse_format_specifier(specifier)
34761ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
34771ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # special values don't care about the type or precision...
34781ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if self._is_special:
34791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            return _format_align(str(self), spec)
34801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
34811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # a type of None defaults to 'g' or 'G', depending on context
34821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # if type is '%', adjust exponent of self accordingly
34831ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if spec['type'] is None:
34841ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            spec['type'] = ['g', 'G'][context.capitals]
34851ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif spec['type'] == '%':
34861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            self = _dec_from_triple(self._sign, self._int, self._exp+2)
34871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
34881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # round if necessary, taking rounding mode from the context
34891ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        rounding = context.rounding
34901ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        precision = spec['precision']
34911ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if precision is not None:
34921ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            if spec['type'] in 'eE':
34931ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                self = self._round(precision+1, rounding)
34941ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            elif spec['type'] in 'gG':
34951ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                if len(self._int) > precision:
34961ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                    self = self._round(precision, rounding)
34971ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            elif spec['type'] in 'fF%':
34981ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                self = self._rescale(-precision, rounding)
34991ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # special case: zeros with a positive exponent can't be
35001ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # represented in fixed point; rescale them to 0e0.
35011ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif not self and self._exp > 0 and spec['type'] in 'fF%':
35021ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            self = self._rescale(0, rounding)
35031ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35041ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # figure out placement of the decimal point
35051ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        leftdigits = self._exp + len(self._int)
35061ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if spec['type'] in 'fF%':
35071ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            dotplace = leftdigits
35081ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif spec['type'] in 'eE':
35091ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            if not self and precision is not None:
35101ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = 1 - precision
35111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            else:
35121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = 1
35131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif spec['type'] in 'gG':
35141ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            if self._exp <= 0 and leftdigits > -6:
35151ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = leftdigits
35161ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            else:
35171ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                dotplace = 1
35181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # figure out main part of numeric string...
35201ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if dotplace <= 0:
35211ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = '0.' + '0'*(-dotplace) + self._int
35221ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif dotplace >= len(self._int):
35231ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            # make sure we're not padding a '0' with extra zeros on the right
35241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            assert dotplace==len(self._int) or self._int != '0'
35251ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = self._int + '0'*(dotplace-len(self._int))
35261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        else:
35271ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = self._int[:dotplace] + '.' + self._int[dotplace:]
35281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35291ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # ...then the trailing exponent, or trailing '%'
35301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if leftdigits != dotplace or spec['type'] in 'eE':
35311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
35321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = num + "{0}{1:+}".format(echar, leftdigits-dotplace)
35331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        elif spec['type'] == '%':
35341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = num + '%'
35351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # add sign
35371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if self._sign == 1:
35381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            num = '-' + num
35391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        return _format_align(num, spec)
35401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
35411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
354272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batistadef _dec_from_triple(sign, coefficient, exponent, special=False):
354372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    """Create a decimal instance directly, without any validation,
354472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    normalization (e.g. removal of leading zeros) or argument
354572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    conversion.
354672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
354772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    This function is for *internal use only*.
354872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    """
354972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
355072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self = object.__new__(Decimal)
355172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._sign = sign
355272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._int = coefficient
355372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._exp = exponent
355472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    self._is_special = special
355572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
355672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    return self
355772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista
355859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Context class #######################################################
3559cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis
35607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3561cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis# get rounding method function:
356259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batistarounding_functions = [name for name in Decimal.__dict__.keys()
356359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                                    if name.startswith('_round_')]
35647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerfor name in rounding_functions:
356559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
35667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    globalname = name[1:].upper()
35677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    val = globals()[globalname]
35687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Decimal._pick_rounding_function[val] = name
35697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
35709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettingerdel name, val, globalname, rounding_functions
35717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3572ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlanclass _ContextManager(object):
35738b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """Context manager class to support localcontext().
35741a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
3575ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan      Sets a copy of the supplied context in __enter__() and restores
35768b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan      the previous decimal context in __exit__()
35778b6999b4c5fab174090be263ba90f193bdede141Nick Coghlan    """
35781a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __init__(self, new_context):
3579ced1218dd1b69ac848f8c79d1afaada5669af33cNick Coghlan        self.new_context = new_context.copy()
35801a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __enter__(self):
35811a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        self.saved_context = getcontext()
35821a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        setcontext(self.new_context)
35831a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        return self.new_context
35841a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum    def __exit__(self, t, v, tb):
35851a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum        setcontext(self.saved_context)
35861a5e21e0334a6d4e1c756575023c7157fc9ee306Guido van Rossum
35877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass Context(object):
35887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Contains the context for a Decimal instance.
35897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
35907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Contains:
35917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    prec - precision (for use in rounding, division, square roots..)
359259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    rounding - rounding type (how you round)
3593bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger    traps - If traps[exception] = 1, then the exception is
35947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    raised when it is caused.  Otherwise, a value is
35957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    substituted in.
35961840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson    flags  - When an exception is caused, flags[exception] is set.
35977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             (Whether or not the trap_enabler is set)
35987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger             Should be reset by user of Decimal instance.
35990ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emin -   Minimum exponent
36000ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger    Emax -   Maximum exponent
36017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    capitals -      If 1, 1*10^1 is printed as 1E+1.
36027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                    If 0, printed as 1e1
3603e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger    _clamp - If 1, change exponents if too high (Default 0)
36047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
36059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger
36067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, prec=None, rounding=None,
3607abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger                 traps=None, flags=None,
36080ea241e9e2d2accb625c4b1d3af6dd1f8df23a75Raymond Hettinger                 Emin=None, Emax=None,
3609e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger                 capitals=None, _clamp=0,
3610abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger                 _ignored_flags=None):
3611abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger        if flags is None:
3612abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger            flags = []
3613abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger        if _ignored_flags is None:
3614abf8a56e68a38f5bcff1fa1aa3742ff35854dd45Raymond Hettinger            _ignored_flags = []
3615bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not isinstance(flags, dict):
361671f3b85497f25bad3b00555173c51378f64edbb5Mark Dickinson            flags = dict([(s, int(s in flags)) for s in _signals])
3617b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
3618bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if traps is not None and not isinstance(traps, dict):
361971f3b85497f25bad3b00555173c51378f64edbb5Mark Dickinson            traps = dict([(s, int(s in traps)) for s in _signals])
3620b91af521fddac47b14c57cd9ba736775334e6379Raymond Hettinger            del s
36217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for name, val in locals().items():
36227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            if val is None:
3623eb2608415ee4eb8aaea746f6a313937e264d0cdaRaymond Hettinger                setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
36247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            else:
36257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger                setattr(self, name, val)
36267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        del self.self
36277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3628b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger    def __repr__(self):
3629bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        """Show the current context."""
3630b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        s = []
363159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
363259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
363359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista                 % vars(self))
363459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        names = [f.__name__ for f, v in self.flags.items() if v]
363559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        s.append('flags=[' + ', '.join(names) + ']')
363659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        names = [t.__name__ for t, v in self.traps.items() if v]
363759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        s.append('traps=[' + ', '.join(names) + ']')
3638b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger        return ', '.join(s) + ')'
3639b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger
3640d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger    def clear_flags(self):
3641d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        """Reset all flags to zero"""
3642d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger        for flag in self.flags:
3643b1b605ef546c45eac3c53db369ea6e881f05dc8bRaymond Hettinger            self.flags[flag] = 0
3644d9c0a7ae94ef81e69d927d834131bad760d4d99dRaymond Hettinger
36459fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def _shallow_copy(self):
36469fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a shallow copy from self."""
3647e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        nc = Context(self.prec, self.rounding, self.traps,
3648e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.flags, self.Emin, self.Emax,
3649e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.capitals, self._clamp, self._ignored_flags)
36507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return nc
36519fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger
36529fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger    def copy(self):
36539fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        """Returns a deep copy from self."""
365459c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        nc = Context(self.prec, self.rounding, self.traps.copy(),
3655e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.flags.copy(), self.Emin, self.Emax,
3656e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista                     self.capitals, self._clamp, self._ignored_flags)
36579fce44bc8cfb57d247e81ed18ac521db0fa015f5Raymond Hettinger        return nc
36589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger    __copy__ = copy
36597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36605aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger    def _raise_error(self, condition, explanation = None, *args):
36617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Handles an error
36627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the flag is in _ignored_flags, returns the default response.
36641840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson        Otherwise, it sets the flag, then, if the corresponding
36657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        trap_enabler is set, it reaises the exception.  Otherwise, it returns
36661840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson        the default value after setting the flag.
36677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
36685aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger        error = _condition_map.get(condition, condition)
36697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if error in self._ignored_flags:
367059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # Don't touch the flag
36717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            return error().handle(self, *args)
36727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36731840c1abcade9215faf91b701ab4525ba948d9dcMark Dickinson        self.flags[error] = 1
3674bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        if not self.traps[error]:
367559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista            # The errors define how to handle themselves.
36765aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger            return condition().handle(self, *args)
36777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Errors should only be risked on copies of the context
367959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        # self._ignored_flags = []
36808aca9d032e7813da9a23fd0771c008aff5a5e62fMark Dickinson        raise error(explanation)
36817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_all_flags(self):
36837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore all flags, if they are raised"""
3684fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger        return self._ignore_flags(*_signals)
36857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _ignore_flags(self, *flags):
36877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Ignore the flags, if they are raised"""
36887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # Do not mutate-- This way, copies of a context leave the original
36897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # alone.
36907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self._ignored_flags = (self._ignored_flags + list(flags))
36917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return list(flags)
36927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
36937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _regard_flags(self, *flags):
36947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Stop ignoring the flags, if they are raised"""
36957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if flags and isinstance(flags[0], (tuple,list)):
36967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            flags = flags[0]
36977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        for flag in flags:
36987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self._ignored_flags.remove(flag)
36997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
370053663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan    # We inherit object.__hash__, so we must deny this explicitly
370153663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan    __hash__ = None
37025aa478badfabb005e6f17c98fcf007a0bc54eeccRaymond Hettinger
37037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etiny(self):
37047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns Etiny (= Emin - prec + 1)"""
37057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emin - self.prec + 1)
37067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def Etop(self):
3708e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """Returns maximum exponent (= Emax - prec + 1)"""
37097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return int(self.Emax - self.prec + 1)
37107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _set_rounding(self, type):
37127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Sets the rounding type.
37137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Sets the rounding type, and returns the current (previous)
37157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding type.  Often used like:
37167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context = context.copy()
37187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # so you don't change the calling context
37197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        # if an error occurs in the middle.
37207c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = context._set_rounding(ROUND_UP)
37217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        val = self.__sub__(other, context=context)
37227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        context._set_rounding(rounding)
37237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This will make it round up for that operation.
37257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
37267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        rounding = self.rounding
37277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        self.rounding= type
37287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return rounding
37297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3730fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger    def create_decimal(self, num='0'):
373159bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        """Creates a new Decimal instance but using self as context.
373259bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson
373359bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        This method implements the to-number operation of the
373459bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        IBM Decimal specification."""
373559bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson
373659bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson        if isinstance(num, basestring) and num != num.strip():
373759bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson            return self._raise_error(ConversionSyntax,
373859bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson                                     "no trailing or leading whitespace is "
373959bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson                                     "permitted.")
374059bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson
37417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        d = Decimal(num, context=self)
3742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if d._isnan() and len(d._int) > self.prec - self._clamp:
3743353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            return self._raise_error(ConversionSyntax,
3744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                                     "diagnostic info too long in NaN")
3745dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        return d._fix(self)
37467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
374759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista    # Methods
37487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def abs(self, a):
37497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the absolute value of the operand.
37507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the operand is negative, the result is the same as using the minus
375259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation on the operand.  Otherwise, the result is the same as using
37537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the plus operation on the operand.
37547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('2.1'))
3756abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
37579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-100'))
3758abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
37599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('101.5'))
3760abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('101.5')
37619ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.abs(Decimal('-101.5'))
3762abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('101.5')
37637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
37647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__abs__(context=self)
37657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def add(self, a, b):
37677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Return the sum of the two operands.
37687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37699ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
3770abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('19.00')
37719ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
3772abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.02E+4')
37737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
37747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__add__(b, context=self)
37757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def _apply(self, a):
3777dab988dd23e6328dadfe8408cd96abf4b017380dRaymond Hettinger        return str(a._fix(self))
37787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3779353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def canonical(self, a):
3780353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the same Decimal object.
3781353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3782353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        As we do not have different encodings for the same number, the
3783353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        received object already is in its canonical form.
3784353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3785353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.canonical(Decimal('2.50'))
3786abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.50')
3787353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3788353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.canonical(context=self)
3789353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
37907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def compare(self, a, b):
37917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Compares values numerically.
37927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the signs of the operands differ, a value representing each operand
37947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        ('-1' if the operand is less than zero, '0' if the operand is zero or
37957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        negative zero, or '1' if the operand is greater than zero) is used in
37967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        place of that operand for the comparison instead of the actual
37977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operand.
37987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
37997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The comparison is then effected by subtracting the second operand from
38007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the first and then returning a value according to the result of the
38017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        subtraction: '-1' if the result is less than zero, '0' if the result is
38027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        zero or negative zero, or '1' if the result is greater than zero.
38037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
38049ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
3805abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
38069ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
3807abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
38089ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
3809abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
38109ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
3811abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
38129ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
3813abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
38149ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
3815abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
38167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
38177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.compare(b, context=self)
38187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_signal(self, a, b):
3820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values of the two operands numerically.
3821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        It's pretty much like compare(), but all NaNs signal, with signaling
3823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        NaNs taking precedence over quiet NaNs.
3824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext
3826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
3827abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
3829abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
3830353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.flags[InvalidOperation] = 0
3831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3832353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        0
3833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
3834abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
3835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3836353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        1
3837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.flags[InvalidOperation] = 0
3838353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        0
3840353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
3841abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
3842353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> print c.flags[InvalidOperation]
3843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        1
3844353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.compare_signal(b, context=self)
3846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total(self, a, b):
3848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares two operands using their abstract representation.
3849353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3850353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        This is not like the standard compare, which use their numerical
3851353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value. Note that a total ordering is defined for all possible abstract
3852353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        representations.
3853353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3854353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
3855abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3856353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('-127'),  Decimal('12'))
3857abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3858353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
3859abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3860353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
3861abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
3862353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('12.300'))
3863abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
3864353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('NaN'))
3865abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
3866353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.compare_total(b)
3868353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def compare_total_mag(self, a, b):
3870353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares two operands using their abstract representation ignoring sign.
3871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3872353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Like compare_total, but with operand's sign ignored and assumed to be 0.
3873353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.compare_total_mag(b)
3875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_abs(self, a):
3877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy of the operand with the sign set to 0.
3878353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3879353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_abs(Decimal('2.1'))
3880abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
3881353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_abs(Decimal('-100'))
3882abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
3883353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3884353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.copy_abs()
3885353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3886353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_decimal(self, a):
3887353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy of the decimal objet.
3888353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3889353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_decimal(Decimal('2.1'))
3890abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
3891353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
3892abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00')
3893353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
38946c398da0e79cbd68ec4625f00f37a8f2a0a26e5cFacundo Batista        return Decimal(a)
3895353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3896353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_negate(self, a):
3897353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a copy of the operand with the sign inverted.
3898353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3899353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_negate(Decimal('101.5'))
3900abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-101.5')
3901353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_negate(Decimal('-101.5'))
3902abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('101.5')
3903353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3904353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.copy_negate()
3905353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3906353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def copy_sign(self, a, b):
3907353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Copies the second operand's sign to the first one.
3908353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3909353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        In detail, it returns a copy of the first operand with the sign
3910353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        equal to the sign of the second operand.
3911353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
3913abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.50')
3914353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
3915abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.50')
3916353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
3917abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.50')
3918353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
3919abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.50')
3920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.copy_sign(b)
3922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
39237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide(self, a, b):
39247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Decimal division in a specified context.
39257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
39269ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
3927abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.333333333')
39289ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
3929abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.666666667')
39309ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
3931abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.5')
39329ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
3933abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.1')
39349ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
3935abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
39369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
3937abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('4.00')
39389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
3939abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.20')
39409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
3941abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
39429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
3943abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1000')
39449ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
3945abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.20E+6')
39467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
39477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__div__(b, context=self)
39487c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
39497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divide_int(self, a, b):
39507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Divides two numbers and returns the integer part of the result.
39517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
39529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
3953abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
39549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
3955abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
39569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
3957abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
39587c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
39597c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__floordiv__(b, context=self)
39607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
39617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def divmod(self, a, b):
39627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__divmod__(b, context=self)
39637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
3964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def exp(self, a):
3965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns e ** a.
3966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
3968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
3969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
3970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('-Infinity'))
3971abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
3972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('-1'))
3973abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.367879441')
3974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('0'))
3975abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
3976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('1'))
3977abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.71828183')
3978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('0.693147181'))
3979abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.00000000')
3980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.exp(Decimal('+Infinity'))
3981abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
3982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.exp(context=self)
3984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def fma(self, a, b, c):
3986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a multiplied by b, plus c.
3987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The first two operands are multiplied together, using multiply,
3989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the third operand is then added to the result of that
3990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        multiplication, using add, all with only one final rounding.
3991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
3992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
3993abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('22')
3994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
3995abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-8')
3996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
3997abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.38435736E+12')
3998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
3999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.fma(b, c, context=self)
4000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_canonical(self, a):
40021a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is canonical; otherwise return False.
40031a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista
40041a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        Currently, the encoding of a Decimal instance is always
40051a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        canonical, so this method returns True for any Decimal.
4006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_canonical(Decimal('2.50'))
40081a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
40101a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        return a.is_canonical()
4011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_finite(self, a):
40131a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is finite; otherwise return False.
4014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
40151a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        A Decimal instance is considered finite if it is neither
40161a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        infinite nor a NaN.
4017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('2.50'))
40191a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('-0.3'))
40211a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('0'))
40231a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('Inf'))
40251a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_finite(Decimal('NaN'))
40271a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_finite()
4030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_infinite(self, a):
40321a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is infinite; otherwise return False.
4033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_infinite(Decimal('2.50'))
40351a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_infinite(Decimal('-Inf'))
40371a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_infinite(Decimal('NaN'))
40391a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_infinite()
4042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_nan(self, a):
40441a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a qNaN or sNaN;
40451a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        otherwise return False.
4046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_nan(Decimal('2.50'))
40481a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_nan(Decimal('NaN'))
40501a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_nan(Decimal('-sNaN'))
40521a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_nan()
4055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_normal(self, a):
40571a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a normal number;
40581a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        otherwise return False.
4059353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('2.50'))
40641a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('0.1E-999'))
40661a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('0.00'))
40681a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('-Inf'))
40701a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_normal(Decimal('NaN'))
40721a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_normal(context=self)
4075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_qnan(self, a):
40771a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a quiet NaN; otherwise return False.
4078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_qnan(Decimal('2.50'))
40801a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_qnan(Decimal('NaN'))
40821a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_qnan(Decimal('sNaN'))
40841a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_qnan()
4087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_signed(self, a):
40891a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is negative; otherwise return False.
4090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_signed(Decimal('2.50'))
40921a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_signed(Decimal('-12'))
40941a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_signed(Decimal('-0'))
40961a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4097353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_signed()
4099353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4100353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_snan(self, a):
41011a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a signaling NaN;
41021a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        otherwise return False.
4103353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_snan(Decimal('2.50'))
41051a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_snan(Decimal('NaN'))
41071a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_snan(Decimal('sNaN'))
41091a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_snan()
4112353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4113353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_subnormal(self, a):
41141a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is subnormal; otherwise return False.
4115353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4116353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4117353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4118353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4119353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('2.50'))
41201a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4121353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('0.1E-999'))
41221a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4123353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('0.00'))
41241a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4125353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('-Inf'))
41261a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4127353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.is_subnormal(Decimal('NaN'))
41281a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4129353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4130353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_subnormal(context=self)
4131353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4132353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def is_zero(self, a):
41331a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        """Return True if the operand is a zero; otherwise return False.
4134353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4135353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_zero(Decimal('0'))
41361a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4137353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_zero(Decimal('2.50'))
41381a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        False
4139353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.is_zero(Decimal('-0E+2'))
41401a191df14dc2f37933ef32f553fcaa7a5ac77cf7Facundo Batista        True
4141353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4142353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.is_zero()
4143353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4144353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def ln(self, a):
4145353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the natural (base e) logarithm of the operand.
4146353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4147353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4148353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('0'))
4151abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('1.000'))
4153abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('2.71828183'))
4155abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.00000000')
4156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('10'))
4157abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.30258509')
4158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.ln(Decimal('+Infinity'))
4159abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.ln(context=self)
4162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def log10(self, a):
4164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the base 10 logarithm of the operand.
4165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('0'))
4170abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('0.001'))
4172abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-3')
4173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('1.000'))
4174abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('2'))
4176abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.301029996')
4177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('10'))
4178abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('70'))
4180abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.84509804')
4181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.log10(Decimal('+Infinity'))
4182abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.log10(context=self)
4185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logb(self, a):
4187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """ Returns the exponent of the magnitude of the operand's MSD.
4188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the integer which is the exponent of the magnitude
4190353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        of the most significant digit of the operand (as though the
4191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        operand were truncated to a single digit while maintaining the
4192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value of that digit and without limiting the resulting exponent).
4193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('250'))
4195abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
4196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('2.50'))
4197abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('0.03'))
4199abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-2')
4200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logb(Decimal('0'))
4201abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4203353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logb(context=self)
4204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_and(self, a, b):
4206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies the logical operation 'and' between each operand's digits.
4207353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operands must be both logical numbers.
4209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
4211abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
4213abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4214353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
4215abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
4217abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
4219abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1000')
4220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
4221abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
4222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_and(b, context=self)
4224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_invert(self, a):
4226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Invert all the digits in the operand.
4227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operand must be a logical number.
4229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('0'))
4231abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('111111111')
4232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('1'))
4233abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('111111110')
4234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('111111111'))
4235abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_invert(Decimal('101010101'))
4237abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10101010')
4238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_invert(context=self)
4240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_or(self, a, b):
4242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies the logical operation 'or' between each operand's digits.
4243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operands must be both logical numbers.
4245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
4247abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
4249abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
4251abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
4253abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
4255abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1110')
4256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
4257abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1110')
4258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_or(b, context=self)
4260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def logical_xor(self, a, b):
4262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Applies the logical operation 'xor' between each operand's digits.
4263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The operands must be both logical numbers.
4265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
4267abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
4269abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
4271abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
4273abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4274353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
4275abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('110')
4276353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
4277abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1101')
4278353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4279353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.logical_xor(b, context=self)
4280353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
42817c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def max(self, a,b):
42827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """max compares two values numerically and returns the maximum.
42837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
42847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
4285c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling        Otherwise, the operands are compared as though by the compare
428659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation.  If they are numerically equal then the left-hand operand
428759c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        is chosen as the result.  Otherwise the maximum (closer to positive
42887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
42897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
42909ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
4291abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
42929ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
4293abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3')
42949ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
4295abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4296d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
4297abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7')
42987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
42997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.max(b, context=self)
43007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4301353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def max_mag(self, a, b):
4302353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
4303353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.max_mag(b, context=self)
4304353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
43057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def min(self, a,b):
43067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """min compares two values numerically and returns the minimum.
43077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If either operand is a NaN then the general rules apply.
4309c8acc882a92c1fe5df95ae73b7b8004737ed9222Andrew M. Kuchling        Otherwise, the operands are compared as though by the compare
431059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation.  If they are numerically equal then the left-hand operand
431159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        is chosen as the result.  Otherwise the minimum (closer to negative
43127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        infinity) of the two operands is chosen as the result.
43137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43149ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
4315abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
43169ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
4317abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-10')
43189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
4319abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
4320d6c700a320eacd6f04cbcc60996b84e765766890Raymond Hettinger        >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
4321abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7')
43227c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
43237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.min(b, context=self)
43247c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4325353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def min_mag(self, a, b):
4326353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Compares the values numerically with their sign ignored."""
4327353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.min_mag(b, context=self)
4328353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
43297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def minus(self, a):
43307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Minus corresponds to unary prefix minus in Python.
43317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43327c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as subtract; the
43337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation minus(a) is calculated as subtract('0', a) where the '0'
43347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
43357c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('1.3'))
4337abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.3')
43389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.minus(Decimal('-1.3'))
4339abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.3')
43407c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
43417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__neg__(context=self)
43427c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def multiply(self, a, b):
43447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """multiply multiplies two operands.
43457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4346cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        If either operand is a special value then the general rules apply.
4347cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        Otherwise, the operands are multiplied together ('long multiplication'),
4348cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        resulting in a number which may be as long as the sum of the lengths
4349cfe3128cd58c4a59d236527184b40352ae35e44aMartin v. Löwis        of the two operands.
43507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
43519ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
4352abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.60')
43539ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
4354abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('21')
43559ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
4356abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.72')
43579ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
4358abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.0')
43599ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
4360abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('4.28135971E+11')
43617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
43627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mul__(b, context=self)
43637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4364353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_minus(self, a):
4365353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the largest representable number smaller than a.
4366353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4367353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4368353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4369353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4370353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_minus(Decimal('1'))
4371abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.999999999')
4372353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_minus(Decimal('1E-1007'))
4373abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0E-1007')
4374353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
4375abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000004')
4376353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_minus(Decimal('Infinity'))
4377abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('9.99999999E+999')
4378353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4379353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.next_minus(context=self)
4380353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4381353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_plus(self, a):
4382353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the smallest representable number larger than a.
4383353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4384353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4385353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4386353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4387353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_plus(Decimal('1'))
4388abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.00000001')
4389353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_plus(Decimal('-1E-1007'))
4390abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0E-1007')
4391353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
4392abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000002')
4393353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_plus(Decimal('-Infinity'))
4394abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-9.99999999E+999')
4395353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4396353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.next_plus(context=self)
4397353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4398353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def next_toward(self, a, b):
4399353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the number closest to a, in direction towards b.
4400353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4401353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result is the closest representable number from the first
4402353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        operand (but not the first operand) that is in the direction
4403353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        towards the second operand, unless the operands have the same
4404353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        value.
4405353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4406353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4407353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4408353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4409353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('1'), Decimal('2'))
4410abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.00000001')
4411353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
4412abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0E-1007')
4413353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
4414abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000002')
4415353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('1'), Decimal('0'))
4416abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.999999999')
4417353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
4418abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0E-1007')
4419353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
4420abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.00000004')
4421353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
4422abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.00')
4423353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4424353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.next_toward(b, context=self)
4425353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
44267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def normalize(self, a):
4427e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        """normalize reduces an operand to its simplest form.
44287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44297c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Essentially a plus operation with all trailing zeros removed from the
44307c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        result.
44317c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44329ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('2.1'))
4433abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
44349ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-2.0'))
4435abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-2')
44369ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('1.200'))
4437abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.2')
44389ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('-120'))
4439abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.2E+2')
44409ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('120.00'))
4441abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.2E+2')
44429ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.normalize(Decimal('0.00'))
4443abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
44447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
44457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.normalize(context=self)
44467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4447353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def number_class(self, a):
4448353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns an indication of the class of the operand.
4449353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4450353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The class is one of the following strings:
4451353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -sNaN
4452353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -NaN
4453353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Infinity
4454353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Normal
4455353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Subnormal
4456353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          -Zero
4457353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Zero
4458353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Subnormal
4459353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Normal
4460353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista          +Infinity
4461353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4462353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = Context(ExtendedContext)
4463353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4464353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4465353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('Infinity'))
4466353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Infinity'
4467353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('1E-10'))
4468353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Normal'
4469353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('2.50'))
4470353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Normal'
4471353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('0.1E-999'))
4472353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Subnormal'
4473353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('0'))
4474353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '+Zero'
4475353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-0'))
4476353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Zero'
4477353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-0.1E-999'))
4478353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Subnormal'
4479353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-1E-10'))
4480353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Normal'
4481353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-2.50'))
4482353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Normal'
4483353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-Infinity'))
4484353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '-Infinity'
4485353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('NaN'))
4486353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'NaN'
4487353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('-NaN'))
4488353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'NaN'
4489353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.number_class(Decimal('sNaN'))
4490353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'sNaN'
4491353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4492353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.number_class(context=self)
4493353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
44947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def plus(self, a):
44957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Plus corresponds to unary prefix plus in Python.
44967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
44977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is evaluated using the same rules as add; the
44987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        operation plus(a) is calculated as add('0', a) where the '0'
44997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        has the same exponent as the operand.
45007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('1.3'))
4502abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.3')
45039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.plus(Decimal('-1.3'))
4504abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1.3')
45057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
45067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pos__(context=self)
45077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def power(self, a, b, modulo=None):
45097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Raises a to the power of b, to modulo if given.
45107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4511353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With two arguments, compute a**b.  If a is negative then b
4512353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        must be integral.  The result will be inexact unless b is
4513353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        integral and the result is finite and can be expressed exactly
4514353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        in 'precision' digits.
4515353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4516353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        With three arguments, compute (a**b) % modulo.  For the
4517353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        three argument form, the following restrictions on the
4518353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        arguments hold:
4519353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4520353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - all three arguments must be integral
4521353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - b must be nonnegative
4522353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - at least one of a or b must be nonzero
4523353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista         - modulo must be nonzero and have at most 'precision' digits
4524353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4525353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The result of pow(a, b, modulo) is identical to the result
4526353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        that would be obtained by computing (a**b) % modulo with
4527353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        unbounded precision, but is computed more efficiently.  It is
4528353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        always exact.
4529353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4530353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c = ExtendedContext.copy()
4531353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emin = -999
4532353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.Emax = 999
4533353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('2'), Decimal('3'))
4534abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('8')
4535353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-2'), Decimal('3'))
4536abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-8')
4537353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('2'), Decimal('-3'))
4538abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.125')
4539353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('1.7'), Decimal('8'))
4540abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('69.7575744')
4541353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('10'), Decimal('0.301029996'))
4542abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.00000000')
4543353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('Infinity'), Decimal('-1'))
4544abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4545353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('Infinity'), Decimal('0'))
4546abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4547353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('Infinity'), Decimal('1'))
4548abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4549353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('-1'))
4550abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
4551353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('0'))
4552abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4553353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('1'))
4554abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4555353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-Infinity'), Decimal('2'))
4556abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('Infinity')
4557353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('0'), Decimal('0'))
4558abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
4559353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4560353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
4561abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('11')
4562353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
4563abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-11')
4564353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
4565abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
4566353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
4567abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('11')
4568353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
4569abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('11729830')
4570353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
4571abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
4572353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
4573abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
45747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
45757c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__pow__(b, modulo, context=self)
45767c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45777c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def quantize(self, a, b):
457859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
45797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The coefficient of the result is derived from that of the left-hand
458159c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operand.  It may be rounded using the current rounding setting (if the
45827c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        exponent is being increased), multiplied by a positive power of ten (if
45837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        the exponent is being decreased), or is unchanged (if the exponent is
45847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        already equal to that of the right-hand operand).
45857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Unlike other operations, if the length of the coefficient after the
45877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        quantize operation would be greater than precision then an Invalid
458859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        operation condition is raised.  This guarantees that, unless there is
458959c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        an error condition, the exponent of the result of a quantize is always
45907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        equal to that of the right-hand operand.
45917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        Also unlike other operations, quantize will never raise Underflow, even
45937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if the result is subnormal and inexact.
45947c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
45959ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
4596abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.170')
45979ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
4598abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.17')
45999ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
4600abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.2')
46019ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
4602abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
46039ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
4604abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0E+1')
46059ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
4606abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
46079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
4608abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
46099ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
4610abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
46119ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
4612abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0E+5')
46139ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
4614abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
46159ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
4616abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('NaN')
46179ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
4618abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('217.0')
46199ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
4620abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('217')
46219ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
4622abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.2E+2')
46239ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
4624abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2E+2')
46257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
46267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.quantize(b, context=self)
46277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4628353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def radix(self):
4629353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Just returns 10, as this is Decimal, :)
4630353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4631353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.radix()
4632abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
4633353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4634353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return Decimal(10)
4635353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
46367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder(self, a, b):
46377c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns the remainder from integer division.
46387c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is the residue of the dividend after the operation of
464059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        calculating integer division as described for divide-integer, rounded
46410d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz        to precision digits if necessary.  The sign of the result, if
464259c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        non-zero, is the same as that of the original dividend.
46437c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46447c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
46457c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
46467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
46477c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46489ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
4649abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.1')
46509ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
4651abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
46529ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
4653abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
46549ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
4655abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.2')
46569ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
4657abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.1')
46589ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
4659abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
46607c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
46617c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__mod__(b, context=self)
46627c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46637c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def remainder_near(self, a, b):
46647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns to be "a - b * n", where n is the integer nearest the exact
46657c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        value of "x / b" (if two integers are equally near then the even one
466659c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        is chosen).  If the result is equal to 0 then its sign will be the
46677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        sign of a.
46687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        This operation will fail under the same conditions as integer division
46707c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        (that is, if integer division on the same two operands would fail, the
46717c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        remainder cannot be calculated).
46727c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
46739ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
4674abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.9')
46759ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
4676abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-2')
46779ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
4678abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
46799ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
4680abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-1')
46819ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
4682abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.2')
46839ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
4684abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.1')
46859ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
4686abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.3')
46877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
46887c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.remainder_near(b, context=self)
46897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4690353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def rotate(self, a, b):
4691353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a rotated copy of a, b times.
4692353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4693353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The coefficient of the result is a rotated copy of the digits in
4694353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        the coefficient of the first operand.  The number of places of
4695353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        rotation is taken from the absolute value of the second operand,
4696353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        with the rotation being to the left if the second operand is
4697353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        positive or to the right otherwise.
4698353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4699353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
4700abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('400000003')
4701353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
4702abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('12')
4703353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
4704abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('891234567')
4705353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
4706abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('123456789')
4707353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
4708abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('345678912')
4709353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4710353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.rotate(b, context=self)
4711353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
47127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def same_quantum(self, a, b):
47137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Returns True if the two operands have the same exponent.
47147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The result is never affected by either the sign or the coefficient of
47167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        either operand.
47177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47189ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
47197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
47209ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
47217c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
47229ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
47237c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        False
47249ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
47257c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        True
47267c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
47277c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.same_quantum(b)
47287c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4729353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def scaleb (self, a, b):
4730353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns the first operand after adding the second value its exp.
4731353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4732353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
4733abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.0750')
4734353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
4735abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.50')
4736353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
4737abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.50E+3')
4738353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4739353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.scaleb (b, context=self)
4740353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4741353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def shift(self, a, b):
4742353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Returns a shifted copy of a, b times.
4743353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4744353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        The coefficient of the result is a shifted copy of the digits
4745353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        in the coefficient of the first operand.  The number of places
4746353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        to shift is taken from the absolute value of the second operand,
4747353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        with the shift being to the left if the second operand is
4748353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        positive or to the right otherwise.  Digits shifted into the
4749353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        coefficient are zeros.
4750353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4751353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
4752abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('400000000')
4753353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
4754abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
4755353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
4756abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1234567')
4757353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
4758abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('123456789')
4759353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
4760abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('345678900')
4761353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4762353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.shift(b, context=self)
4763353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
47647c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def sqrt(self, a):
476559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        """Square root of a non-negative number to context precision.
47667c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47677c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        If the result must be inexact, it is rounded using the round-half-even
47687c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        algorithm.
47697c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47709ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0'))
4771abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0')
47729ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('-0'))
4773abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0')
47749ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('0.39'))
4775abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.624499800')
47769ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('100'))
4777abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('10')
47789ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1'))
4779abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1')
47809ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.0'))
4781abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
47829ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('1.00'))
4783abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0')
47849ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('7'))
4785abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2.64575131')
47869ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.sqrt(Decimal('10'))
4787abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('3.16227766')
47889ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.prec
47896ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        9
47907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
47917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.sqrt(context=self)
47927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def subtract(self, a, b):
4794f33d01d304c349a7f555779c7c99930f1203adb7Georg Brandl        """Return the difference between the two operands.
47957c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
47969ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
4797abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.23')
47989ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
4799abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('0.00')
48009ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond Hettinger        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
4801abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-0.77')
48027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__sub__(b, context=self)
48047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_eng_string(self, a):
48067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
48077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
48097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.to_eng_string(context=self)
48117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def to_sci_string(self, a):
48137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Converts a number to a string, using scientific notation.
48147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        The operation is not affected by the context.
48167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
48177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return a.__str__(context=self)
48187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4819353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_exact(self, a):
4820353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """Rounds to an integer.
4821353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4822353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        When the operand has a negative exponent, the result is the same
4823353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        as using the quantize() operation using the given operand as the
4824353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
4825353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        of the operand as the precision setting; Inexact and Rounded flags
4826353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        are allowed in this operation.  The rounding mode is taken from the
4827353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        context.
4828353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4829353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
4830abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
4831353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('100'))
4832abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4833353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
4834abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4835353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
4836abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('102')
4837353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
4838abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-102')
4839353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
4840abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0E+6')
4841353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
4842abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.89E+77')
4843353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
4844abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
4845353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        """
4846353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.to_integral_exact(context=self)
4847353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4848353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    def to_integral_value(self, a):
48497c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """Rounds to an integer.
48507c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48517c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        When the operand has a negative exponent, the result is the same
48527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        as using the quantize() operation using the given operand as the
48537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
48547c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        of the operand as the precision setting, except that no flags will
485559c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista        be set.  The rounding mode is taken from the context.
48567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4857353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('2.1'))
4858abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('2')
4859353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('100'))
4860abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4861353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('100.0'))
4862abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('100')
4863353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('101.5'))
4864abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('102')
4865353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
4866abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-102')
4867353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
4868abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('1.0E+6')
4869353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
4870abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('7.89E+77')
4871353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
4872abe32371878dcaea31c835e10144fdaa2eca6492Raymond Hettinger        Decimal('-Infinity')
48737c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        """
4874353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        return a.to_integral_value(context=self)
4875353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4876353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # the method name changed, but we provide also the old one, for compatibility
4877353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    to_integral = to_integral_value
48787c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48797c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerclass _WorkRep(object):
48807c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __slots__ = ('sign','int','exp')
488117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger    # sign: 0 or 1
4882636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    # int:  int or long
48837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    # exp:  None, int, or string
48847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
48857c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __init__(self, value=None):
48867c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        if value is None:
48877c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = None
4888636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger            self.int = 0
48897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = None
489017931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        elif isinstance(value, Decimal):
489117931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            self.sign = value._sign
489272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista            self.int = int(value._int)
48937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value._exp
489417931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger        else:
489517931de110ac84e6b0eb88d77a95798f8670765aRaymond Hettinger            # assert isinstance(value, tuple)
48967c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.sign = value[0]
48977c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.int = value[1]
48987c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger            self.exp = value[2]
48997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    def __repr__(self):
49017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
49027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    __str__ = __repr__
49047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4907e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batistadef _normalize(op1, op2, prec = 0):
49087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """Normalizes op1, op2 to have the same exp and length of coefficient.
49097c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
49107c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    Done during addition.
49117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    """
4912353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if op1.exp < op2.exp:
49137c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op2
49147c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op1
49157c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    else:
49167c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        tmp = op1
49177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        other = op2
49187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4919353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
4920353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Then adding 10**exp to tmp has the same effect (after rounding)
4921353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # as adding any positive quantity smaller than 10**exp; similarly
4922353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # for subtraction.  So if other is smaller than 10**exp we replace
4923353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # it with 10**exp.  This avoids tmp.exp - other.exp getting too large.
4924e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    tmp_len = len(str(tmp.int))
4925e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    other_len = len(str(other.int))
4926e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    exp = tmp.exp + min(-1, tmp_len - prec - 2)
4927e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista    if other_len + other.exp - 1 < exp:
4928e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        other.int = 1
4929e64acfad3dd13809943eecf50f11c40c510dedbeFacundo Batista        other.exp = exp
4930636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
4931353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    tmp.int *= 10 ** (tmp.exp - other.exp)
4932353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    tmp.exp = other.exp
49337c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    return op1, op2
49347c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
4935353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
4936353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4937353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# This function from Tim Peters was taken from here:
4938353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# http://mail.python.org/pipermail/python-list/1999-July/007758.html
4939353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# The correction being in the function definition is for speed, and
4940353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# the whole function is not resolved with math.log because of avoiding
4941353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista# the use of floats.
4942353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _nbits(n, correction = {
4943353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '0': 4, '1': 3, '2': 2, '3': 2,
4944353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '4': 1, '5': 1, '6': 1, '7': 1,
4945353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '8': 0, '9': 0, 'a': 0, 'b': 0,
4946353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        'c': 0, 'd': 0, 'e': 0, 'f': 0}):
4947353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Number of bits in binary representation of the positive integer n,
4948353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    or 0 if n == 0.
4949353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
4950353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if n < 0:
4951353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise ValueError("The argument to _nbits should be nonnegative.")
4952353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    hex_n = "%x" % n
4953353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return 4*len(hex_n) - correction[hex_n[0]]
4954353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4955353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _sqrt_nearest(n, a):
4956353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Closest integer to the square root of the positive integer n.  a is
4957353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    an initial approximation to the square root.  Any positive integer
4958353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    will do for a, but the closer a is to the square root of n the
4959353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    faster convergence will be.
4960353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4961353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
4962353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if n <= 0 or a <= 0:
4963353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise ValueError("Both arguments to _sqrt_nearest should be positive.")
4964353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4965353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    b=0
4966353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    while a != b:
4967353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        b, a = a, a--n//a>>1
4968353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return a
4969353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4970353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _rshift_nearest(x, shift):
4971353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given an integer x and a nonnegative integer shift, return closest
4972353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    integer to x / 2**shift; use round-to-even in case of a tie.
4973353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4974353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
4975353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    b, q = 1L << shift, x >> shift
4976353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return q + (2*(x & (b-1)) + (q&1) > b)
4977353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4978353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _div_nearest(a, b):
4979353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Closest integer to a/b, a and b positive integers; rounds to even
4980353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    in the case of a tie.
4981353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4982353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
4983353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    q, r = divmod(a, b)
4984353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return q + (2*r + (q&1) > b)
4985353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4986353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _ilog(x, M, L = 8):
4987353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Integer approximation to M*log(x/M), with absolute error boundable
4988353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    in terms only of x/M.
4989353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4990353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    Given positive integers x and M, return an integer approximation to
4991353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    M * log(x/M).  For L = 8 and 0.1 <= x/M <= 10 the difference
4992353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    between the approximation and the exact result is at most 22.  For
4993353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15.  In
4994353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    both cases these are upper bounds on the error; it will usually be
4995353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    much smaller."""
4996353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
4997353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # The basic algorithm is the following: let log1p be the function
4998353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # log1p(x) = log(1+x).  Then log(x/M) = log1p((x-M)/M).  We use
4999353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # the reduction
5000353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5001353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #    log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
5002353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5003353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # repeatedly until the argument to log1p is small (< 2**-L in
5004353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # absolute value).  For small y we can use the Taylor series
5005353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # expansion
5006353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5007353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #    log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
5008353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5009353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # truncating at T such that y**T is small enough.  The whole
5010353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # computation is carried out in a form of fixed-point arithmetic,
5011353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # with a real number z being represented by an integer
5012353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # approximation to z*M.  To avoid loss of precision, the y below
5013353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # is actually an integer approximation to 2**R*y*M, where R is the
5014353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # number of reductions performed so far.
5015353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5016353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    y = x-M
5017353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # argument reduction; R = number of reductions performed
5018353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    R = 0
5019353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    while (R <= L and long(abs(y)) << L-R >= M or
5020353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista           R > L and abs(y) >> R-L >= M):
5021353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _div_nearest(long(M*y) << 1,
5022353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista                         M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
5023353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        R += 1
5024353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5025353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Taylor series with T terms
5026353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    T = -int(-10*len(str(M))//(3*L))
5027353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    yshift = _rshift_nearest(y, R)
5028353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    w = _div_nearest(M, T)
5029353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    for k in xrange(T-1, 0, -1):
5030353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
5031353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5032353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(w*y, M)
5033353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5034353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dlog10(c, e, p):
5035353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers c, e and p with c > 0, p >= 0, compute an integer
5036353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    approximation to 10**p * log10(c*10**e), with an absolute error of
5037353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    at most 1.  Assumes that c*10**e is not exactly 1."""
5038353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5039353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # increase precision by 2; compensate for this by dividing
5040353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # final result by 100
5041353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    p += 2
5042353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5043353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # write c*10**e as d*10**f with either:
5044353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   f >= 0 and 1 <= d <= 10, or
5045353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #   f <= 0 and 0.1 <= d <= 1.
5046353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Thus for c*10**e close to 1, f = 0
5047353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    l = len(str(c))
5048353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    f = e+l - (e+l >= 1)
5049353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5050353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if p > 0:
5051353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        M = 10**p
5052353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        k = e+p-f
5053353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if k >= 0:
5054353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c *= 10**k
5055353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5056353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = _div_nearest(c, 10**-k)
5057353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5058353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = _ilog(c, M) # error < 5 + 22 = 27
5059be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        log_10 = _log10_digits(p) # error < 1
5060353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = _div_nearest(log_d*M, log_10)
5061353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_tenpower = f*M # exact
5062353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5063353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = 0  # error < 2.31
5064353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_tenpower = div_nearest(f, 10**-p) # error < 0.5
5065353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5066353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(log_tenpower+log_d, 100)
5067353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5068353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dlog(c, e, p):
5069353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers c, e and p with c > 0, compute an integer
5070353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    approximation to 10**p * log(c*10**e), with an absolute error of
5071353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    at most 1.  Assumes that c*10**e is not exactly 1."""
5072353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5073353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Increase precision by 2. The precision increase is compensated
5074353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # for at the end with a division by 100.
5075353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    p += 2
5076353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5077353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
5078353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # or f <= 0 and 0.1 <= d <= 1.  Then we can compute 10**p * log(c*10**e)
5079353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # as 10**p * log(d) + 10**p*f * log(10).
5080353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    l = len(str(c))
5081353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    f = e+l - (e+l >= 1)
5082353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5083353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # compute approximation to 10**p*log(d), with error < 27
5084353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if p > 0:
5085353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        k = e+p-f
5086353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if k >= 0:
5087353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c *= 10**k
5088353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5089353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            c = _div_nearest(c, 10**-k)  # error of <= 0.5 in c
5090353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5091353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # _ilog magnifies existing error in c by a factor of at most 10
5092353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
5093353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5094353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # p <= 0: just approximate the whole thing by 0; error < 2.31
5095353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        log_d = 0
5096353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5097be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # compute approximation to f*10**p*log(10), with error < 11.
5098353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if f:
5099be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        extra = len(str(abs(f)))-1
5100be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        if p + extra >= 0:
5101be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
5102be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
5103be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
5104353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5105353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            f_log_ten = 0
5106353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5107353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        f_log_ten = 0
5108353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5109be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
5110353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(f_log_ten + log_d, 100)
5111353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5112be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batistaclass _Log10Memoize(object):
5113be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    """Class to compute, store, and allow retrieval of, digits of the
5114be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    constant log(10) = 2.302585....  This constant is needed by
5115be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
5116be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    def __init__(self):
5117be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        self.digits = "23025850929940456840179914546843642076011014886"
5118be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5119be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    def getdigits(self, p):
5120be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        """Given an integer p >= 0, return floor(10**p)*log(10).
5121be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5122be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        For example, self.getdigits(3) returns 2302.
5123be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        """
5124be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # digits are stored as a string, for quick conversion to
5125be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # integer in the case that we've already computed enough
5126be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # digits; the stored digits should always be correct
5127be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        # (truncated, not rounded to nearest).
5128be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        if p < 0:
5129be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            raise ValueError("p should be nonnegative")
5130be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5131be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        if p >= len(self.digits):
5132be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # compute p+3, p+6, p+9, ... digits; continue until at
5133be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # least one of the extra digits is nonzero
5134be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            extra = 3
5135be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            while True:
5136be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                # compute p+extra digits, correct to within 1ulp
5137be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                M = 10**(p+extra+2)
5138be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                digits = str(_div_nearest(_ilog(10*M, M), 100))
5139be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                if digits[-extra:] != '0'*extra:
5140be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                    break
5141be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista                extra += 3
5142be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # keep all reliable digits so far; remove trailing zeros
5143be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            # and next nonzero digit
5144be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista            self.digits = digits.rstrip('0')[:-1]
5145be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista        return int(self.digits[:p+1])
5146be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5147be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista_log10_digits = _Log10Memoize().getdigits
5148be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista
5149353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _iexp(x, M, L=8):
5150353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers x and M, M > 0, such that x/M is small in absolute
5151353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    value, compute an integer approximation to M*exp(x/M).  For 0 <=
5152353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    x/M <= 2.4, the absolute error in the result is bounded by 60 (and
5153353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    is usually much smaller)."""
5154353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5155353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Algorithm: to compute exp(z) for a real number z, first divide z
5156353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # by a suitable power R of 2 so that |z/2**R| < 2**-L.  Then
5157353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
5158353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # series
5159353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5160353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #     expm1(x) = x + x**2/2! + x**3/3! + ...
5161353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5162353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Now use the identity
5163353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5164353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #     expm1(2x) = expm1(x)*(expm1(x)+2)
5165353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    #
5166353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # R times to compute the sequence expm1(z/2**R),
5167353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
5168353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5169353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Find R such that x/2**R/M <= 2**-L
5170353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    R = _nbits((long(x)<<L)//M)
5171353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5172353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Taylor series.  (2**L)**T > M
5173353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    T = -int(-10*len(str(M))//(3*L))
5174353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    y = _div_nearest(x, T)
5175353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    Mshift = long(M)<<R
5176353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    for i in xrange(T-1, 0, -1):
5177353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _div_nearest(x*(Mshift + y), Mshift * i)
5178353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5179353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Expansion
5180353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    for k in xrange(R-1, -1, -1):
5181353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        Mshift = long(M)<<(k+2)
5182353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        y = _div_nearest(y*(y+Mshift), Mshift)
5183353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5184353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return M+y
5185353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5186353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dexp(c, e, p):
5187353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Compute an approximation to exp(c*10**e), with p decimal places of
5188353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    precision.
5189353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5190be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    Returns integers d, f such that:
5191353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5192353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      10**(p-1) <= d <= 10**p, and
5193353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
5194353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5195353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    In other words, d*10**f is an approximation to exp(c*10**e) with p
5196353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    digits of precision, and with an error in d of at most 1.  This is
5197353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    almost, but not quite, the same as the error being < 1ulp: when d
5198353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    = 10**(p-1) the error could be up to 10 ulp."""
5199353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5200353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
5201353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    p += 2
5202353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5203be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # compute log(10) with extra precision = adjusted exponent of c*10**e
5204353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    extra = max(0, e + len(str(c)) - 1)
5205353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    q = p + extra
5206353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5207be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
5208353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # rounding down
5209353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    shift = e+q
5210353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if shift >= 0:
5211353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        cshift = c*10**shift
5212353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5213353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        cshift = c//10**-shift
5214be6c7ba72ad2bc3087a7df20871387b11756e140Facundo Batista    quot, rem = divmod(cshift, _log10_digits(q))
5215353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5216353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # reduce remainder back to original precision
5217353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    rem = _div_nearest(rem, 10**extra)
5218353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5219353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # error in result of _iexp < 120;  error after division < 0.62
5220353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
5221353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5222353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _dpower(xc, xe, yc, ye, p):
5223353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
5224353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    y = yc*10**ye, compute x**y.  Returns a pair of integers (c, e) such that:
5225353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5226353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      10**(p-1) <= c <= 10**p, and
5227353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista      (c-1)*10**e < x**y < (c+1)*10**e
5228353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5229353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    in other words, c*10**e is an approximation to x**y with p digits
5230353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    of precision, and with an error in c of at most 1.  (This is
5231353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    almost, but not quite, the same as the error being < 1ulp: when c
5232353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    == 10**(p-1) we can only guarantee error < 10ulp.)
5233353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5234353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    We assume that: x is positive and not equal to 1, and y is nonzero.
5235353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """
5236353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5237353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # Find b such that 10**(b-1) <= |y| <= 10**b
5238353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    b = len(str(abs(yc))) + ye
5239353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5240353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
5241353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    lxc = _dlog(xc, xe, p+b+1)
5242353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5243353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
5244353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    shift = ye-b
5245353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if shift >= 0:
5246353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        pc = lxc*yc*10**shift
5247353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5248353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        pc = _div_nearest(lxc*yc, 10**-shift)
5249353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5250353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if pc == 0:
5251353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # we prefer a result that isn't exactly 1; this makes it
5252353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        # easier to compute a correctly rounded result in __pow__
5253353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
5254353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            coeff, exp = 10**(p-1)+1, 1-p
5255353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        else:
5256353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista            coeff, exp = 10**p-1, -p
5257353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    else:
5258353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        coeff, exp = _dexp(pc, -(p+1), p+1)
5259353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        coeff = _div_nearest(coeff, 10)
5260353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        exp += 1
5261353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5262353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return coeff, exp
5263353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
5264353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _log10_lb(c, correction = {
5265353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
5266353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        '6': 23, '7': 16, '8': 10, '9': 5}):
5267353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    """Compute a lower bound for 100*log10(c) for a positive integer c."""
5268353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if c <= 0:
5269353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise ValueError("The argument to _log10_lb should be nonnegative.")
5270353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    str_c = str(c)
5271353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    return 100*len(str_c) - correction[str_c[0]]
5272353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista
527359c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Helper Functions ####################################################
52747c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
5275353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batistadef _convert_other(other, raiseit=False):
5276636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    """Convert other to Decimal.
5277636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
5278636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    Verifies that it's ok to use in an implicit construction.
5279636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    """
5280636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    if isinstance(other, Decimal):
5281636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        return other
5282636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger    if isinstance(other, (int, long)):
5283636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger        return Decimal(other)
5284353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista    if raiseit:
5285353750c405c9099d0be69c6af1d17037b38c4ddfFacundo Batista        raise TypeError("Unable to convert %s to Decimal" % other)
5286267b868f23a85c6a63a06452c85487355cf9ab8aRaymond Hettinger    return NotImplemented
5287636a6b100fe6083388bc5315758326078abe65b4Raymond Hettinger
528859c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### Setup Specific Contexts ############################################
52897c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
52907c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# The default context prototype used by Context()
5291fed52963fcf97154e0b7d1d82514767d95eb27e5Raymond Hettinger# Is mutable, so that new contexts can have different default values
52927c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
52937c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond HettingerDefaultContext = Context(
52946ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=28, rounding=ROUND_HALF_EVEN,
5295bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation],
5296bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
529799148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emax=999999999,
529899148e7eaad7741fbfb0822009b7c9b216ecc227Raymond Hettinger        Emin=-999999999,
5299e0f1581babe682552d7eadc4e54636b1c2775f0bRaymond Hettinger        capitals=1
53007c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
53017c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Pre-made alternate contexts offered by the specification
53037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# Don't change these; the user should be able to select these
53047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# contexts and be able to reproduce results from other implementations
53057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger# of the spec.
53067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53079ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerBasicContext = Context(
53087c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger        prec=9, rounding=ROUND_HALF_UP,
5309bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
5310bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
53117c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
53127c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53139ec3e3b6eb4b36870bd28682e6c7a6c36911e5e0Raymond HettingerExtendedContext = Context(
53146ea484582238a65d44a76e3a831e3ba7c77a1a25Raymond Hettinger        prec=9, rounding=ROUND_HALF_EVEN,
5315bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        traps=[],
5316bf4406971ce34434ed914d17fab70370948d2aabRaymond Hettinger        flags=[],
53177c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger)
53187c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53197c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
532059c5884b4c37b6288911ff2aed218cfbb41f06abFacundo Batista##### crud for parsing strings #############################################
53216a123cb7827859748a0096570dfbb5ceba0e59dcMark Dickinson#
532272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Regular expression used for parsing numeric strings.  Additional
532372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# comments:
532472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista#
532572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
532672bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# whitespace.  But note that the specification disallows whitespace in
532772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# a numeric string.
532872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista#
532972bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# 2. For finite numbers (not infinities and NaNs) the body of the
533072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# number between the optional sign and the optional exponent must have
533172bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# at least one decimal digit, possibly after the decimal point.  The
533272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# lookahead expression '(?=\d|\.\d)' checks this.
533372bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista#
533472bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# As the flag UNICODE is not enabled here, we're explicitly avoiding any
533572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# other meaning for \d than the numbers [0-9].
53367c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
533772bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batistaimport re
533870c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson_parser = re.compile(r"""        # A numeric string consists of:
53397c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
534070c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson    (?P<sign>[-+])?              # an optional sign, followed by either...
53417c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    (
534270c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (?=[0-9]|\.[0-9])        # ...a number (with at least one digit)
534370c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (?P<int>[0-9]*)          # having a (possibly empty) integer part
534470c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (\.(?P<frac>[0-9]*))?    # followed by an optional fractional part
534570c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (E(?P<exp>[-+]?[0-9]+))? # followed by an optional exponent, or...
53467c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    |
534770c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        Inf(inity)?              # ...an infinity, or...
534872bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista    |
534970c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (?P<signal>s)?           # ...an (optionally signaling)
535070c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        NaN                      # NaN
535170c3289085d08d97edbfaa626efc2d2c2ac21859Mark Dickinson        (?P<diag>[0-9]*)         # with (possibly empty) diagnostic info.
53527c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    )
53537c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger#    \s*
535459bc20bb273055e2cd48a467524d21340c1771ccMark Dickinson    \Z
535572bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista""", re.VERBOSE | re.IGNORECASE).match
53567c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53572ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista_all_zeros = re.compile('0*$').match
53582ec7415db5ad63c4e4b27ee793214071454f6fe5Facundo Batista_exact_half = re.compile('50*$').match
53591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
53601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson##### PEP3101 support functions ##############################################
53611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# The functions parse_format_specifier and format_align have little to do
53621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# with the Decimal class, and could potentially be reused for other pure
53631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# Python numeric classes that want to implement __format__
53641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson#
53651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson# A format specifier for Decimal looks like:
53661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson#
53671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson#   [[fill]align][sign][0][minimumwidth][.precision][type]
53681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson#
53691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
53701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson_parse_format_specifier_regex = re.compile(r"""\A
53711ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?:
53721ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson   (?P<fill>.)?
53731ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson   (?P<align>[<>=^])
53741ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson)?
53751ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<sign>[-+ ])?
53761ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<zeropad>0)?
53771ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<minimumwidth>(?!0)\d+)?
53781ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?:\.(?P<precision>0|(?!0)\d+))?
53791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson(?P<type>[eEfFgG%])?
53801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson\Z
53811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson""", re.VERBOSE)
53821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
53837c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerdel re
53847c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
53851ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinsondef _parse_format_specifier(format_spec):
53861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """Parse and validate a format specifier.
53871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
53881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    Turns a standard numeric format specifier into a dict, with the
53891ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    following entries:
53901ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
53911ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      fill: fill character to pad field to minimum width
53921ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      align: alignment type, either '<', '>', '=' or '^'
53931ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      sign: either '+', '-' or ' '
53941ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      minimumwidth: nonnegative integer giving minimum width
53951ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      precision: nonnegative integer giving precision, or None
53961ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      type: one of the characters 'eEfFgG%', or None
53971ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson      unicode: either True or False (always True for Python 3.x)
53981ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
53991ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """
54001ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    m = _parse_format_specifier_regex.match(format_spec)
54011ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if m is None:
54021ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        raise ValueError("Invalid format specifier: " + format_spec)
54031ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54041ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # get the dictionary
54051ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict = m.groupdict()
54061ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54071ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # defaults for fill and alignment
54081ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    fill = format_dict['fill']
54091ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    align = format_dict['align']
54101ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict.pop('zeropad') is not None:
54111ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        # in the face of conflict, refuse the temptation to guess
54121ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if fill is not None and fill != '0':
54131ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            raise ValueError("Fill character conflicts with '0'"
54141ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                             " in format specifier: " + format_spec)
54151ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if align is not None and align != '=':
54161ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            raise ValueError("Alignment conflicts with '0' in "
54171ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson                             "format specifier: " + format_spec)
54181ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        fill = '0'
54191ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        align = '='
54201ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['fill'] = fill or ' '
54211ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['align'] = align or '<'
54221ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54231ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict['sign'] is None:
54241ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        format_dict['sign'] = '-'
54251ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54261ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # turn minimumwidth and precision entries into integers.
54271ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # minimumwidth defaults to 0; precision remains None if not given
54281ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
54291ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict['precision'] is not None:
54301ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        format_dict['precision'] = int(format_dict['precision'])
54311ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54321ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # if format type is 'g' or 'G' then a precision of 0 makes little
54331ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # sense; convert it to 1.  Same if format type is unspecified.
54341ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if format_dict['precision'] == 0:
54351ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if format_dict['type'] in 'gG' or format_dict['type'] is None:
54361ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            format_dict['precision'] = 1
54371ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54381ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # record whether return type should be str or unicode
54391ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    format_dict['unicode'] = isinstance(format_spec, unicode)
54401ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54411ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    return format_dict
54421ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54431ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinsondef _format_align(body, spec_dict):
54441ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """Given an unpadded, non-aligned numeric string, add padding and
54451ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    aligment to conform with the given format specifier dictionary (as
54461ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    output from parse_format_specifier).
54471ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54481ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    It's assumed that if body is negative then it starts with '-'.
54491ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    Any leading sign ('-' or '+') is stripped from the body before
54501ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    applying the alignment and padding rules, and replaced in the
54511ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    appropriate position.
54521ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54531ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    """
54541ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # figure out the sign; we only examine the first character, so if
54551ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # body has leading whitespace the results may be surprising.
54561ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if len(body) > 0 and body[0] in '-+':
54571ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        sign = body[0]
54581ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        body = body[1:]
54591ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    else:
54601ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        sign = ''
54611ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54621ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if sign != '-':
54631ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        if spec_dict['sign'] in ' +':
54641ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            sign = spec_dict['sign']
54651ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        else:
54661ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson            sign = ''
54671ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54681ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # how much extra space do we have to play with?
54691ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    minimumwidth = spec_dict['minimumwidth']
54701ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    fill = spec_dict['fill']
54711ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    padding = fill*(max(minimumwidth - (len(sign+body)), 0))
54721ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54731ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    align = spec_dict['align']
54741ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if align == '<':
54751ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = padding + sign + body
54761ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    elif align == '>':
54771ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = sign + body + padding
54781ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    elif align == '=':
54791ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = sign + padding + body
54801ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    else: #align == '^'
54811ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        half = len(padding)//2
54821ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = padding[:half] + sign + body + padding[half:]
54831ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54841ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    # make sure that result is unicode if necessary
54851ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    if spec_dict['unicode']:
54861ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson        result = unicode(result)
54871ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson
54881ddf1d8482f4fd8ae034bfd0221696ee2068c144Mark Dickinson    return result
54890d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz
549072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista##### Useful Constants (internal use only) ################################
54917c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
549272bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Reusable defaults
549372bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaInf = Decimal('Inf')
549472bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistanegInf = Decimal('-Inf')
549572bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaNaN = Decimal('NaN')
549672bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaDec_0 = Decimal(0)
549772bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaDec_p1 = Decimal(1)
549872bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaDec_n1 = Decimal(-1)
54997c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
550072bc54faed8f12dc89ecc989fc7921002db3427fFacundo Batista# Infsign[sign] is infinity w/ that sign
550172bc54faed8f12dc89ecc989fc7921002db3427fFacundo BatistaInfsign = (Inf, negInf)
55027c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
55037c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
55047c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger
55057c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettingerif __name__ == '__main__':
55067c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    import doctest, sys
55077c85fa4a5203912aca564ce719a0fdd0fd5411e5Raymond Hettinger    doctest.testmod(sys.modules[__name__])
5508