Home | History | Annotate | Download | only in Lib
      1 # Copyright (c) 2004 Python Software Foundation.

      2 # All rights reserved.

      3 
      4 # Written by Eric Price <eprice at tjhsst.edu>

      5 #    and Facundo Batista <facundo at taniquetil.com.ar>

      6 #    and Raymond Hettinger <python at rcn.com>

      7 #    and Aahz <aahz at pobox.com>

      8 #    and Tim Peters

      9 
     10 # This module is currently Py2.3 compatible and should be kept that way

     11 # unless a major compelling advantage arises.  IOW, 2.3 compatibility is

     12 # strongly preferred, but not guaranteed.

     13 
     14 # Also, this module should be kept in sync with the latest updates of

     15 # the IBM specification as it evolves.  Those updates will be treated

     16 # as bug fixes (deviation from the spec is a compatibility, usability

     17 # bug) and will be backported.  At this point the spec is stabilizing

     18 # and the updates are becoming fewer, smaller, and less significant.

     19 
     20 """
     21 This is a Py2.3 implementation of decimal floating point arithmetic based on
     22 the General Decimal Arithmetic Specification:
     23 
     24     www2.hursley.ibm.com/decimal/decarith.html
     25 
     26 and IEEE standard 854-1987:
     27 
     28     www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
     29 
     30 Decimal floating point has finite precision with arbitrarily large bounds.
     31 
     32 The purpose of this module is to support arithmetic using familiar
     33 "schoolhouse" rules and to avoid some of the tricky representation
     34 issues associated with binary floating point.  The package is especially
     35 useful for financial applications or for contexts where users have
     36 expectations that are at odds with binary floating point (for instance,
     37 in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
     38 of the expected Decimal('0.00') returned by decimal floating point).
     39 
     40 Here are some examples of using the decimal module:
     41 
     42 >>> from decimal import *
     43 >>> setcontext(ExtendedContext)
     44 >>> Decimal(0)
     45 Decimal('0')
     46 >>> Decimal('1')
     47 Decimal('1')
     48 >>> Decimal('-.0123')
     49 Decimal('-0.0123')
     50 >>> Decimal(123456)
     51 Decimal('123456')
     52 >>> Decimal('123.45e12345678901234567890')
     53 Decimal('1.2345E+12345678901234567892')
     54 >>> Decimal('1.33') + Decimal('1.27')
     55 Decimal('2.60')
     56 >>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41')
     57 Decimal('-2.20')
     58 >>> dig = Decimal(1)
     59 >>> print dig / Decimal(3)
     60 0.333333333
     61 >>> getcontext().prec = 18
     62 >>> print dig / Decimal(3)
     63 0.333333333333333333
     64 >>> print dig.sqrt()
     65 1
     66 >>> print Decimal(3).sqrt()
     67 1.73205080756887729
     68 >>> print Decimal(3) ** 123
     69 4.85192780976896427E+58
     70 >>> inf = Decimal(1) / Decimal(0)
     71 >>> print inf
     72 Infinity
     73 >>> neginf = Decimal(-1) / Decimal(0)
     74 >>> print neginf
     75 -Infinity
     76 >>> print neginf + inf
     77 NaN
     78 >>> print neginf * inf
     79 -Infinity
     80 >>> print dig / 0
     81 Infinity
     82 >>> getcontext().traps[DivisionByZero] = 1
     83 >>> print dig / 0
     84 Traceback (most recent call last):
     85   ...
     86   ...
     87   ...
     88 DivisionByZero: x / 0
     89 >>> c = Context()
     90 >>> c.traps[InvalidOperation] = 0
     91 >>> print c.flags[InvalidOperation]
     92 0
     93 >>> c.divide(Decimal(0), Decimal(0))
     94 Decimal('NaN')
     95 >>> c.traps[InvalidOperation] = 1
     96 >>> print c.flags[InvalidOperation]
     97 1
     98 >>> c.flags[InvalidOperation] = 0
     99 >>> print c.flags[InvalidOperation]
    100 0
    101 >>> print c.divide(Decimal(0), Decimal(0))
    102 Traceback (most recent call last):
    103   ...
    104   ...
    105   ...
    106 InvalidOperation: 0 / 0
    107 >>> print c.flags[InvalidOperation]
    108 1
    109 >>> c.flags[InvalidOperation] = 0
    110 >>> c.traps[InvalidOperation] = 0
    111 >>> print c.divide(Decimal(0), Decimal(0))
    112 NaN
    113 >>> print c.flags[InvalidOperation]
    114 1
    115 >>>
    116 """
    117 
    118 __all__ = [
    119     # Two major classes

    120     'Decimal', 'Context',
    121 
    122     # Contexts

    123     'DefaultContext', 'BasicContext', 'ExtendedContext',
    124 
    125     # Exceptions

    126     'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
    127     'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
    128 
    129     # Constants for use in setting up contexts

    130     'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
    131     'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP',
    132 
    133     # Functions for manipulating contexts

    134     'setcontext', 'getcontext', 'localcontext'
    135 ]
    136 
    137 __version__ = '1.70'    # Highest version of the spec this complies with

    138 
    139 import copy as _copy
    140 import math as _math
    141 import numbers as _numbers
    142 
    143 try:
    144     from collections import namedtuple as _namedtuple
    145     DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
    146 except ImportError:
    147     DecimalTuple = lambda *args: args
    148 
    149 # Rounding

    150 ROUND_DOWN = 'ROUND_DOWN'
    151 ROUND_HALF_UP = 'ROUND_HALF_UP'
    152 ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
    153 ROUND_CEILING = 'ROUND_CEILING'
    154 ROUND_FLOOR = 'ROUND_FLOOR'
    155 ROUND_UP = 'ROUND_UP'
    156 ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
    157 ROUND_05UP = 'ROUND_05UP'
    158 
    159 # Errors

    160 
    161 class DecimalException(ArithmeticError):
    162     """Base exception class.
    163 
    164     Used exceptions derive from this.
    165     If an exception derives from another exception besides this (such as
    166     Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
    167     called if the others are present.  This isn't actually used for
    168     anything, though.
    169 
    170     handle  -- Called when context._raise_error is called and the
    171                trap_enabler is not set.  First argument is self, second is the
    172                context.  More arguments can be given, those being after
    173                the explanation in _raise_error (For example,
    174                context._raise_error(NewError, '(-x)!', self._sign) would
    175                call NewError().handle(context, self._sign).)
    176 
    177     To define a new exception, it should be sufficient to have it derive
    178     from DecimalException.
    179     """
    180     def handle(self, context, *args):
    181         pass
    182 
    183 
    184 class Clamped(DecimalException):
    185     """Exponent of a 0 changed to fit bounds.
    186 
    187     This occurs and signals clamped if the exponent of a result has been
    188     altered in order to fit the constraints of a specific concrete
    189     representation.  This may occur when the exponent of a zero result would
    190     be outside the bounds of a representation, or when a large normal
    191     number would have an encoded exponent that cannot be represented.  In
    192     this latter case, the exponent is reduced to fit and the corresponding
    193     number of zero digits are appended to the coefficient ("fold-down").
    194     """
    195 
    196 class InvalidOperation(DecimalException):
    197     """An invalid operation was performed.
    198 
    199     Various bad things cause this:
    200 
    201     Something creates a signaling NaN
    202     -INF + INF
    203     0 * (+-)INF
    204     (+-)INF / (+-)INF
    205     x % 0
    206     (+-)INF % x
    207     x._rescale( non-integer )
    208     sqrt(-x) , x > 0
    209     0 ** 0
    210     x ** (non-integer)
    211     x ** (+-)INF
    212     An operand is invalid
    213 
    214     The result of the operation after these is a quiet positive NaN,
    215     except when the cause is a signaling NaN, in which case the result is
    216     also a quiet NaN, but with the original sign, and an optional
    217     diagnostic information.
    218     """
    219     def handle(self, context, *args):
    220         if args:
    221             ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
    222             return ans._fix_nan(context)
    223         return _NaN
    224 
    225 class ConversionSyntax(InvalidOperation):
    226     """Trying to convert badly formed string.
    227 
    228     This occurs and signals invalid-operation if an string is being
    229     converted to a number and it does not conform to the numeric string
    230     syntax.  The result is [0,qNaN].
    231     """
    232     def handle(self, context, *args):
    233         return _NaN
    234 
    235 class DivisionByZero(DecimalException, ZeroDivisionError):
    236     """Division by 0.
    237 
    238     This occurs and signals division-by-zero if division of a finite number
    239     by zero was attempted (during a divide-integer or divide operation, or a
    240     power operation with negative right-hand operand), and the dividend was
    241     not zero.
    242 
    243     The result of the operation is [sign,inf], where sign is the exclusive
    244     or of the signs of the operands for divide, or is 1 for an odd power of
    245     -0, for power.
    246     """
    247 
    248     def handle(self, context, sign, *args):
    249         return _SignedInfinity[sign]
    250 
    251 class DivisionImpossible(InvalidOperation):
    252     """Cannot perform the division adequately.
    253 
    254     This occurs and signals invalid-operation if the integer result of a
    255     divide-integer or remainder operation had too many digits (would be
    256     longer than precision).  The result is [0,qNaN].
    257     """
    258 
    259     def handle(self, context, *args):
    260         return _NaN
    261 
    262 class DivisionUndefined(InvalidOperation, ZeroDivisionError):
    263     """Undefined result of division.
    264 
    265     This occurs and signals invalid-operation if division by zero was
    266     attempted (during a divide-integer, divide, or remainder operation), and
    267     the dividend is also zero.  The result is [0,qNaN].
    268     """
    269 
    270     def handle(self, context, *args):
    271         return _NaN
    272 
    273 class Inexact(DecimalException):
    274     """Had to round, losing information.
    275 
    276     This occurs and signals inexact whenever the result of an operation is
    277     not exact (that is, it needed to be rounded and any discarded digits
    278     were non-zero), or if an overflow or underflow condition occurs.  The
    279     result in all cases is unchanged.
    280 
    281     The inexact signal may be tested (or trapped) to determine if a given
    282     operation (or sequence of operations) was inexact.
    283     """
    284 
    285 class InvalidContext(InvalidOperation):
    286     """Invalid context.  Unknown rounding, for example.
    287 
    288     This occurs and signals invalid-operation if an invalid context was
    289     detected during an operation.  This can occur if contexts are not checked
    290     on creation and either the precision exceeds the capability of the
    291     underlying concrete representation or an unknown or unsupported rounding
    292     was specified.  These aspects of the context need only be checked when
    293     the values are required to be used.  The result is [0,qNaN].
    294     """
    295 
    296     def handle(self, context, *args):
    297         return _NaN
    298 
    299 class Rounded(DecimalException):
    300     """Number got rounded (not  necessarily changed during rounding).
    301 
    302     This occurs and signals rounded whenever the result of an operation is
    303     rounded (that is, some zero or non-zero digits were discarded from the
    304     coefficient), or if an overflow or underflow condition occurs.  The
    305     result in all cases is unchanged.
    306 
    307     The rounded signal may be tested (or trapped) to determine if a given
    308     operation (or sequence of operations) caused a loss of precision.
    309     """
    310 
    311 class Subnormal(DecimalException):
    312     """Exponent < Emin before rounding.
    313 
    314     This occurs and signals subnormal whenever the result of a conversion or
    315     operation is subnormal (that is, its adjusted exponent is less than
    316     Emin, before any rounding).  The result in all cases is unchanged.
    317 
    318     The subnormal signal may be tested (or trapped) to determine if a given
    319     or operation (or sequence of operations) yielded a subnormal result.
    320     """
    321 
    322 class Overflow(Inexact, Rounded):
    323     """Numerical overflow.
    324 
    325     This occurs and signals overflow if the adjusted exponent of a result
    326     (from a conversion or from an operation that is not an attempt to divide
    327     by zero), after rounding, would be greater than the largest value that
    328     can be handled by the implementation (the value Emax).
    329 
    330     The result depends on the rounding mode:
    331 
    332     For round-half-up and round-half-even (and for round-half-down and
    333     round-up, if implemented), the result of the operation is [sign,inf],
    334     where sign is the sign of the intermediate result.  For round-down, the
    335     result is the largest finite number that can be represented in the
    336     current precision, with the sign of the intermediate result.  For
    337     round-ceiling, the result is the same as for round-down if the sign of
    338     the intermediate result is 1, or is [0,inf] otherwise.  For round-floor,
    339     the result is the same as for round-down if the sign of the intermediate
    340     result is 0, or is [1,inf] otherwise.  In all cases, Inexact and Rounded
    341     will also be raised.
    342     """
    343 
    344     def handle(self, context, sign, *args):
    345         if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
    346                                 ROUND_HALF_DOWN, ROUND_UP):
    347             return _SignedInfinity[sign]
    348         if sign == 0:
    349             if context.rounding == ROUND_CEILING:
    350                 return _SignedInfinity[sign]
    351             return _dec_from_triple(sign, '9'*context.prec,
    352                             context.Emax-context.prec+1)
    353         if sign == 1:
    354             if context.rounding == ROUND_FLOOR:
    355                 return _SignedInfinity[sign]
    356             return _dec_from_triple(sign, '9'*context.prec,
    357                              context.Emax-context.prec+1)
    358 
    359 
    360 class Underflow(Inexact, Rounded, Subnormal):
    361     """Numerical underflow with result rounded to 0.
    362 
    363     This occurs and signals underflow if a result is inexact and the
    364     adjusted exponent of the result would be smaller (more negative) than
    365     the smallest value that can be handled by the implementation (the value
    366     Emin).  That is, the result is both inexact and subnormal.
    367 
    368     The result after an underflow will be a subnormal number rounded, if
    369     necessary, so that its exponent is not less than Etiny.  This may result
    370     in 0 with the sign of the intermediate result and an exponent of Etiny.
    371 
    372     In all cases, Inexact, Rounded, and Subnormal will also be raised.
    373     """
    374 
    375 # List of public traps and flags

    376 _signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
    377            Underflow, InvalidOperation, Subnormal]
    378 
    379 # Map conditions (per the spec) to signals

    380 _condition_map = {ConversionSyntax:InvalidOperation,
    381                   DivisionImpossible:InvalidOperation,
    382                   DivisionUndefined:InvalidOperation,
    383                   InvalidContext:InvalidOperation}
    384 
    385 ##### Context Functions ##################################################

    386 
    387 # The getcontext() and setcontext() function manage access to a thread-local

    388 # current context.  Py2.4 offers direct support for thread locals.  If that

    389 # is not available, use threading.currentThread() which is slower but will

    390 # work for older Pythons.  If threads are not part of the build, create a

    391 # mock threading object with threading.local() returning the module namespace.

    392 
    393 try:
    394     import threading
    395 except ImportError:
    396     # Python was compiled without threads; create a mock object instead

    397     import sys
    398     class MockThreading(object):
    399         def local(self, sys=sys):
    400             return sys.modules[__name__]
    401     threading = MockThreading()
    402     del sys, MockThreading
    403 
    404 try:
    405     threading.local
    406 
    407 except AttributeError:
    408 
    409     # To fix reloading, force it to create a new context

    410     # Old contexts have different exceptions in their dicts, making problems.

    411     if hasattr(threading.currentThread(), '__decimal_context__'):
    412         del threading.currentThread().__decimal_context__
    413 
    414     def setcontext(context):
    415         """Set this thread's context to context."""
    416         if context in (DefaultContext, BasicContext, ExtendedContext):
    417             context = context.copy()
    418             context.clear_flags()
    419         threading.currentThread().__decimal_context__ = context
    420 
    421     def getcontext():
    422         """Returns this thread's context.
    423 
    424         If this thread does not yet have a context, returns
    425         a new context and sets this thread's context.
    426         New contexts are copies of DefaultContext.
    427         """
    428         try:
    429             return threading.currentThread().__decimal_context__
    430         except AttributeError:
    431             context = Context()
    432             threading.currentThread().__decimal_context__ = context
    433             return context
    434 
    435 else:
    436 
    437     local = threading.local()
    438     if hasattr(local, '__decimal_context__'):
    439         del local.__decimal_context__
    440 
    441     def getcontext(_local=local):
    442         """Returns this thread's context.
    443 
    444         If this thread does not yet have a context, returns
    445         a new context and sets this thread's context.
    446         New contexts are copies of DefaultContext.
    447         """
    448         try:
    449             return _local.__decimal_context__
    450         except AttributeError:
    451             context = Context()
    452             _local.__decimal_context__ = context
    453             return context
    454 
    455     def setcontext(context, _local=local):
    456         """Set this thread's context to context."""
    457         if context in (DefaultContext, BasicContext, ExtendedContext):
    458             context = context.copy()
    459             context.clear_flags()
    460         _local.__decimal_context__ = context
    461 
    462     del threading, local        # Don't contaminate the namespace

    463 
    464 def localcontext(ctx=None):
    465     """Return a context manager for a copy of the supplied context
    466 
    467     Uses a copy of the current context if no context is specified
    468     The returned context manager creates a local decimal context
    469     in a with statement:
    470         def sin(x):
    471              with localcontext() as ctx:
    472                  ctx.prec += 2
    473                  # Rest of sin calculation algorithm
    474                  # uses a precision 2 greater than normal
    475              return +s  # Convert result to normal precision
    476 
    477          def sin(x):
    478              with localcontext(ExtendedContext):
    479                  # Rest of sin calculation algorithm
    480                  # uses the Extended Context from the
    481                  # General Decimal Arithmetic Specification
    482              return +s  # Convert result to normal context
    483 
    484     >>> setcontext(DefaultContext)
    485     >>> print getcontext().prec
    486     28
    487     >>> with localcontext():
    488     ...     ctx = getcontext()
    489     ...     ctx.prec += 2
    490     ...     print ctx.prec
    491     ...
    492     30
    493     >>> with localcontext(ExtendedContext):
    494     ...     print getcontext().prec
    495     ...
    496     9
    497     >>> print getcontext().prec
    498     28
    499     """
    500     if ctx is None: ctx = getcontext()
    501     return _ContextManager(ctx)
    502 
    503 
    504 ##### Decimal class #######################################################

    505 
    506 class Decimal(object):
    507     """Floating point class for decimal arithmetic."""
    508 
    509     __slots__ = ('_exp','_int','_sign', '_is_special')
    510     # Generally, the value of the Decimal instance is given by

    511     #  (-1)**_sign * _int * 10**_exp

    512     # Special values are signified by _is_special == True

    513 
    514     # We're immutable, so use __new__ not __init__

    515     def __new__(cls, value="0", context=None):
    516         """Create a decimal point instance.
    517 
    518         >>> Decimal('3.14')              # string input
    519         Decimal('3.14')
    520         >>> Decimal((0, (3, 1, 4), -2))  # tuple (sign, digit_tuple, exponent)
    521         Decimal('3.14')
    522         >>> Decimal(314)                 # int or long
    523         Decimal('314')
    524         >>> Decimal(Decimal(314))        # another decimal instance
    525         Decimal('314')
    526         >>> Decimal('  3.14  \\n')        # leading and trailing whitespace okay
    527         Decimal('3.14')
    528         """
    529 
    530         # Note that the coefficient, self._int, is actually stored as

    531         # a string rather than as a tuple of digits.  This speeds up

    532         # the "digits to integer" and "integer to digits" conversions

    533         # that are used in almost every arithmetic operation on

    534         # Decimals.  This is an internal detail: the as_tuple function

    535         # and the Decimal constructor still deal with tuples of

    536         # digits.

    537 
    538         self = object.__new__(cls)
    539 
    540         # From a string

    541         # REs insist on real strings, so we can too.

    542         if isinstance(value, basestring):
    543             m = _parser(value.strip())
    544             if m is None:
    545                 if context is None:
    546                     context = getcontext()
    547                 return context._raise_error(ConversionSyntax,
    548                                 "Invalid literal for Decimal: %r" % value)
    549 
    550             if m.group('sign') == "-":
    551                 self._sign = 1
    552             else:
    553                 self._sign = 0
    554             intpart = m.group('int')
    555             if intpart is not None:
    556                 # finite number

    557                 fracpart = m.group('frac') or ''
    558                 exp = int(m.group('exp') or '0')
    559                 self._int = str(int(intpart+fracpart))
    560                 self._exp = exp - len(fracpart)
    561                 self._is_special = False
    562             else:
    563                 diag = m.group('diag')
    564                 if diag is not None:
    565                     # NaN

    566                     self._int = str(int(diag or '0')).lstrip('0')
    567                     if m.group('signal'):
    568                         self._exp = 'N'
    569                     else:
    570                         self._exp = 'n'
    571                 else:
    572                     # infinity

    573                     self._int = '0'
    574                     self._exp = 'F'
    575                 self._is_special = True
    576             return self
    577 
    578         # From an integer

    579         if isinstance(value, (int,long)):
    580             if value >= 0:
    581                 self._sign = 0
    582             else:
    583                 self._sign = 1
    584             self._exp = 0
    585             self._int = str(abs(value))
    586             self._is_special = False
    587             return self
    588 
    589         # From another decimal

    590         if isinstance(value, Decimal):
    591             self._exp  = value._exp
    592             self._sign = value._sign
    593             self._int  = value._int
    594             self._is_special  = value._is_special
    595             return self
    596 
    597         # From an internal working value

    598         if isinstance(value, _WorkRep):
    599             self._sign = value.sign
    600             self._int = str(value.int)
    601             self._exp = int(value.exp)
    602             self._is_special = False
    603             return self
    604 
    605         # tuple/list conversion (possibly from as_tuple())

    606         if isinstance(value, (list,tuple)):
    607             if len(value) != 3:
    608                 raise ValueError('Invalid tuple size in creation of Decimal '
    609                                  'from list or tuple.  The list or tuple '
    610                                  'should have exactly three elements.')
    611             # process sign.  The isinstance test rejects floats

    612             if not (isinstance(value[0], (int, long)) and value[0] in (0,1)):
    613                 raise ValueError("Invalid sign.  The first value in the tuple "
    614                                  "should be an integer; either 0 for a "
    615                                  "positive number or 1 for a negative number.")
    616             self._sign = value[0]
    617             if value[2] == 'F':
    618                 # infinity: value[1] is ignored

    619                 self._int = '0'
    620                 self._exp = value[2]
    621                 self._is_special = True
    622             else:
    623                 # process and validate the digits in value[1]

    624                 digits = []
    625                 for digit in value[1]:
    626                     if isinstance(digit, (int, long)) and 0 <= digit <= 9:
    627                         # skip leading zeros

    628                         if digits or digit != 0:
    629                             digits.append(digit)
    630                     else:
    631                         raise ValueError("The second value in the tuple must "
    632                                          "be composed of integers in the range "
    633                                          "0 through 9.")
    634                 if value[2] in ('n', 'N'):
    635                     # NaN: digits form the diagnostic

    636                     self._int = ''.join(map(str, digits))
    637                     self._exp = value[2]
    638                     self._is_special = True
    639                 elif isinstance(value[2], (int, long)):
    640                     # finite number: digits give the coefficient

    641                     self._int = ''.join(map(str, digits or [0]))
    642                     self._exp = value[2]
    643                     self._is_special = False
    644                 else:
    645                     raise ValueError("The third value in the tuple must "
    646                                      "be an integer, or one of the "
    647                                      "strings 'F', 'n', 'N'.")
    648             return self
    649 
    650         if isinstance(value, float):
    651             value = Decimal.from_float(value)
    652             self._exp  = value._exp
    653             self._sign = value._sign
    654             self._int  = value._int
    655             self._is_special  = value._is_special
    656             return self
    657 
    658         raise TypeError("Cannot convert %r to Decimal" % value)
    659 
    660     # @classmethod, but @decorator is not valid Python 2.3 syntax, so

    661     # don't use it (see notes on Py2.3 compatibility at top of file)

    662     def from_float(cls, f):
    663         """Converts a float to a decimal number, exactly.
    664 
    665         Note that Decimal.from_float(0.1) is not the same as Decimal('0.1').
    666         Since 0.1 is not exactly representable in binary floating point, the
    667         value is stored as the nearest representable value which is
    668         0x1.999999999999ap-4.  The exact equivalent of the value in decimal
    669         is 0.1000000000000000055511151231257827021181583404541015625.
    670 
    671         >>> Decimal.from_float(0.1)
    672         Decimal('0.1000000000000000055511151231257827021181583404541015625')
    673         >>> Decimal.from_float(float('nan'))
    674         Decimal('NaN')
    675         >>> Decimal.from_float(float('inf'))
    676         Decimal('Infinity')
    677         >>> Decimal.from_float(-float('inf'))
    678         Decimal('-Infinity')
    679         >>> Decimal.from_float(-0.0)
    680         Decimal('-0')
    681 
    682         """
    683         if isinstance(f, (int, long)):        # handle integer inputs

    684             return cls(f)
    685         if _math.isinf(f) or _math.isnan(f):  # raises TypeError if not a float

    686             return cls(repr(f))
    687         if _math.copysign(1.0, f) == 1.0:
    688             sign = 0
    689         else:
    690             sign = 1
    691         n, d = abs(f).as_integer_ratio()
    692         k = d.bit_length() - 1
    693         result = _dec_from_triple(sign, str(n*5**k), -k)
    694         if cls is Decimal:
    695             return result
    696         else:
    697             return cls(result)
    698     from_float = classmethod(from_float)
    699 
    700     def _isnan(self):
    701         """Returns whether the number is not actually one.
    702 
    703         0 if a number
    704         1 if NaN
    705         2 if sNaN
    706         """
    707         if self._is_special:
    708             exp = self._exp
    709             if exp == 'n':
    710                 return 1
    711             elif exp == 'N':
    712                 return 2
    713         return 0
    714 
    715     def _isinfinity(self):
    716         """Returns whether the number is infinite
    717 
    718         0 if finite or not a number
    719         1 if +INF
    720         -1 if -INF
    721         """
    722         if self._exp == 'F':
    723             if self._sign:
    724                 return -1
    725             return 1
    726         return 0
    727 
    728     def _check_nans(self, other=None, context=None):
    729         """Returns whether the number is not actually one.
    730 
    731         if self, other are sNaN, signal
    732         if self, other are NaN return nan
    733         return 0
    734 
    735         Done before operations.
    736         """
    737 
    738         self_is_nan = self._isnan()
    739         if other is None:
    740             other_is_nan = False
    741         else:
    742             other_is_nan = other._isnan()
    743 
    744         if self_is_nan or other_is_nan:
    745             if context is None:
    746                 context = getcontext()
    747 
    748             if self_is_nan == 2:
    749                 return context._raise_error(InvalidOperation, 'sNaN',
    750                                         self)
    751             if other_is_nan == 2:
    752                 return context._raise_error(InvalidOperation, 'sNaN',
    753                                         other)
    754             if self_is_nan:
    755                 return self._fix_nan(context)
    756 
    757             return other._fix_nan(context)
    758         return 0
    759 
    760     def _compare_check_nans(self, other, context):
    761         """Version of _check_nans used for the signaling comparisons
    762         compare_signal, __le__, __lt__, __ge__, __gt__.
    763 
    764         Signal InvalidOperation if either self or other is a (quiet
    765         or signaling) NaN.  Signaling NaNs take precedence over quiet
    766         NaNs.
    767 
    768         Return 0 if neither operand is a NaN.
    769 
    770         """
    771         if context is None:
    772             context = getcontext()
    773 
    774         if self._is_special or other._is_special:
    775             if self.is_snan():
    776                 return context._raise_error(InvalidOperation,
    777                                             'comparison involving sNaN',
    778                                             self)
    779             elif other.is_snan():
    780                 return context._raise_error(InvalidOperation,
    781                                             'comparison involving sNaN',
    782                                             other)
    783             elif self.is_qnan():
    784                 return context._raise_error(InvalidOperation,
    785                                             'comparison involving NaN',
    786                                             self)
    787             elif other.is_qnan():
    788                 return context._raise_error(InvalidOperation,
    789                                             'comparison involving NaN',
    790                                             other)
    791         return 0
    792 
    793     def __nonzero__(self):
    794         """Return True if self is nonzero; otherwise return False.
    795 
    796         NaNs and infinities are considered nonzero.
    797         """
    798         return self._is_special or self._int != '0'
    799 
    800     def _cmp(self, other):
    801         """Compare the two non-NaN decimal instances self and other.
    802 
    803         Returns -1 if self < other, 0 if self == other and 1
    804         if self > other.  This routine is for internal use only."""
    805 
    806         if self._is_special or other._is_special:
    807             self_inf = self._isinfinity()
    808             other_inf = other._isinfinity()
    809             if self_inf == other_inf:
    810                 return 0
    811             elif self_inf < other_inf:
    812                 return -1
    813             else:
    814                 return 1
    815 
    816         # check for zeros;  Decimal('0') == Decimal('-0')

    817         if not self:
    818             if not other:
    819                 return 0
    820             else:
    821                 return -((-1)**other._sign)
    822         if not other:
    823             return (-1)**self._sign
    824 
    825         # If different signs, neg one is less

    826         if other._sign < self._sign:
    827             return -1
    828         if self._sign < other._sign:
    829             return 1
    830 
    831         self_adjusted = self.adjusted()
    832         other_adjusted = other.adjusted()
    833         if self_adjusted == other_adjusted:
    834             self_padded = self._int + '0'*(self._exp - other._exp)
    835             other_padded = other._int + '0'*(other._exp - self._exp)
    836             if self_padded == other_padded:
    837                 return 0
    838             elif self_padded < other_padded:
    839                 return -(-1)**self._sign
    840             else:
    841                 return (-1)**self._sign
    842         elif self_adjusted > other_adjusted:
    843             return (-1)**self._sign
    844         else: # self_adjusted < other_adjusted

    845             return -((-1)**self._sign)
    846 
    847     # Note: The Decimal standard doesn't cover rich comparisons for

    848     # Decimals.  In particular, the specification is silent on the

    849     # subject of what should happen for a comparison involving a NaN.

    850     # We take the following approach:

    851     #

    852     #   == comparisons involving a quiet NaN always return False

    853     #   != comparisons involving a quiet NaN always return True

    854     #   == or != comparisons involving a signaling NaN signal

    855     #      InvalidOperation, and return False or True as above if the

    856     #      InvalidOperation is not trapped.

    857     #   <, >, <= and >= comparisons involving a (quiet or signaling)

    858     #      NaN signal InvalidOperation, and return False if the

    859     #      InvalidOperation is not trapped.

    860     #

    861     # This behavior is designed to conform as closely as possible to

    862     # that specified by IEEE 754.

    863 
    864     def __eq__(self, other, context=None):
    865         other = _convert_other(other, allow_float=True)
    866         if other is NotImplemented:
    867             return other
    868         if self._check_nans(other, context):
    869             return False
    870         return self._cmp(other) == 0
    871 
    872     def __ne__(self, other, context=None):
    873         other = _convert_other(other, allow_float=True)
    874         if other is NotImplemented:
    875             return other
    876         if self._check_nans(other, context):
    877             return True
    878         return self._cmp(other) != 0
    879 
    880     def __lt__(self, other, context=None):
    881         other = _convert_other(other, allow_float=True)
    882         if other is NotImplemented:
    883             return other
    884         ans = self._compare_check_nans(other, context)
    885         if ans:
    886             return False
    887         return self._cmp(other) < 0
    888 
    889     def __le__(self, other, context=None):
    890         other = _convert_other(other, allow_float=True)
    891         if other is NotImplemented:
    892             return other
    893         ans = self._compare_check_nans(other, context)
    894         if ans:
    895             return False
    896         return self._cmp(other) <= 0
    897 
    898     def __gt__(self, other, context=None):
    899         other = _convert_other(other, allow_float=True)
    900         if other is NotImplemented:
    901             return other
    902         ans = self._compare_check_nans(other, context)
    903         if ans:
    904             return False
    905         return self._cmp(other) > 0
    906 
    907     def __ge__(self, other, context=None):
    908         other = _convert_other(other, allow_float=True)
    909         if other is NotImplemented:
    910             return other
    911         ans = self._compare_check_nans(other, context)
    912         if ans:
    913             return False
    914         return self._cmp(other) >= 0
    915 
    916     def compare(self, other, context=None):
    917         """Compares one to another.
    918 
    919         -1 => a < b
    920         0  => a = b
    921         1  => a > b
    922         NaN => one is NaN
    923         Like __cmp__, but returns Decimal instances.
    924         """
    925         other = _convert_other(other, raiseit=True)
    926 
    927         # Compare(NaN, NaN) = NaN

    928         if (self._is_special or other and other._is_special):
    929             ans = self._check_nans(other, context)
    930             if ans:
    931                 return ans
    932 
    933         return Decimal(self._cmp(other))
    934 
    935     def __hash__(self):
    936         """x.__hash__() <==> hash(x)"""
    937         # Decimal integers must hash the same as the ints

    938         #

    939         # The hash of a nonspecial noninteger Decimal must depend only

    940         # on the value of that Decimal, and not on its representation.

    941         # For example: hash(Decimal('100E-1')) == hash(Decimal('10')).

    942 
    943         # Equality comparisons involving signaling nans can raise an

    944         # exception; since equality checks are implicitly and

    945         # unpredictably used when checking set and dict membership, we

    946         # prevent signaling nans from being used as set elements or

    947         # dict keys by making __hash__ raise an exception.

    948         if self._is_special:
    949             if self.is_snan():
    950                 raise TypeError('Cannot hash a signaling NaN value.')
    951             elif self.is_nan():
    952                 # 0 to match hash(float('nan'))

    953                 return 0
    954             else:
    955                 # values chosen to match hash(float('inf')) and

    956                 # hash(float('-inf')).

    957                 if self._sign:
    958                     return -271828
    959                 else:
    960                     return 314159
    961 
    962         # In Python 2.7, we're allowing comparisons (but not

    963         # arithmetic operations) between floats and Decimals;  so if

    964         # a Decimal instance is exactly representable as a float then

    965         # its hash should match that of the float.

    966         self_as_float = float(self)
    967         if Decimal.from_float(self_as_float) == self:
    968             return hash(self_as_float)
    969 
    970         if self._isinteger():
    971             op = _WorkRep(self.to_integral_value())
    972             # to make computation feasible for Decimals with large

    973             # exponent, we use the fact that hash(n) == hash(m) for

    974             # any two nonzero integers n and m such that (i) n and m

    975             # have the same sign, and (ii) n is congruent to m modulo

    976             # 2**64-1.  So we can replace hash((-1)**s*c*10**e) with

    977             # hash((-1)**s*c*pow(10, e, 2**64-1).

    978             return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1))
    979         # The value of a nonzero nonspecial Decimal instance is

    980         # faithfully represented by the triple consisting of its sign,

    981         # its adjusted exponent, and its coefficient with trailing

    982         # zeros removed.

    983         return hash((self._sign,
    984                      self._exp+len(self._int),
    985                      self._int.rstrip('0')))
    986 
    987     def as_tuple(self):
    988         """Represents the number as a triple tuple.
    989 
    990         To show the internals exactly as they are.
    991         """
    992         return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
    993 
    994     def __repr__(self):
    995         """Represents the number as an instance of Decimal."""
    996         # Invariant:  eval(repr(d)) == d

    997         return "Decimal('%s')" % str(self)
    998 
    999     def __str__(self, eng=False, context=None):
   1000         """Return string representation of the number in scientific notation.
   1001 
   1002         Captures all of the information in the underlying representation.
   1003         """
   1004 
   1005         sign = ['', '-'][self._sign]
   1006         if self._is_special:
   1007             if self._exp == 'F':
   1008                 return sign + 'Infinity'
   1009             elif self._exp == 'n':
   1010                 return sign + 'NaN' + self._int
   1011             else: # self._exp == 'N'

   1012                 return sign + 'sNaN' + self._int
   1013 
   1014         # number of digits of self._int to left of decimal point

   1015         leftdigits = self._exp + len(self._int)
   1016 
   1017         # dotplace is number of digits of self._int to the left of the

   1018         # decimal point in the mantissa of the output string (that is,

   1019         # after adjusting the exponent)

   1020         if self._exp <= 0 and leftdigits > -6:
   1021             # no exponent required

   1022             dotplace = leftdigits
   1023         elif not eng:
   1024             # usual scientific notation: 1 digit on left of the point

   1025             dotplace = 1
   1026         elif self._int == '0':
   1027             # engineering notation, zero

   1028             dotplace = (leftdigits + 1) % 3 - 1
   1029         else:
   1030             # engineering notation, nonzero

   1031             dotplace = (leftdigits - 1) % 3 + 1
   1032 
   1033         if dotplace <= 0:
   1034             intpart = '0'
   1035             fracpart = '.' + '0'*(-dotplace) + self._int
   1036         elif dotplace >= len(self._int):
   1037             intpart = self._int+'0'*(dotplace-len(self._int))
   1038             fracpart = ''
   1039         else:
   1040             intpart = self._int[:dotplace]
   1041             fracpart = '.' + self._int[dotplace:]
   1042         if leftdigits == dotplace:
   1043             exp = ''
   1044         else:
   1045             if context is None:
   1046                 context = getcontext()
   1047             exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
   1048 
   1049         return sign + intpart + fracpart + exp
   1050 
   1051     def to_eng_string(self, context=None):
   1052         """Convert to engineering-type string.
   1053 
   1054         Engineering notation has an exponent which is a multiple of 3, so there
   1055         are up to 3 digits left of the decimal place.
   1056 
   1057         Same rules for when in exponential and when as a value as in __str__.
   1058         """
   1059         return self.__str__(eng=True, context=context)
   1060 
   1061     def __neg__(self, context=None):
   1062         """Returns a copy with the sign switched.
   1063 
   1064         Rounds, if it has reason.
   1065         """
   1066         if self._is_special:
   1067             ans = self._check_nans(context=context)
   1068             if ans:
   1069                 return ans
   1070 
   1071         if context is None:
   1072             context = getcontext()
   1073 
   1074         if not self and context.rounding != ROUND_FLOOR:
   1075             # -Decimal('0') is Decimal('0'), not Decimal('-0'), except

   1076             # in ROUND_FLOOR rounding mode.

   1077             ans = self.copy_abs()
   1078         else:
   1079             ans = self.copy_negate()
   1080 
   1081         return ans._fix(context)
   1082 
   1083     def __pos__(self, context=None):
   1084         """Returns a copy, unless it is a sNaN.
   1085 
   1086         Rounds the number (if more then precision digits)
   1087         """
   1088         if self._is_special:
   1089             ans = self._check_nans(context=context)
   1090             if ans:
   1091                 return ans
   1092 
   1093         if context is None:
   1094             context = getcontext()
   1095 
   1096         if not self and context.rounding != ROUND_FLOOR:
   1097             # + (-0) = 0, except in ROUND_FLOOR rounding mode.

   1098             ans = self.copy_abs()
   1099         else:
   1100             ans = Decimal(self)
   1101 
   1102         return ans._fix(context)
   1103 
   1104     def __abs__(self, round=True, context=None):
   1105         """Returns the absolute value of self.
   1106 
   1107         If the keyword argument 'round' is false, do not round.  The
   1108         expression self.__abs__(round=False) is equivalent to
   1109         self.copy_abs().
   1110         """
   1111         if not round:
   1112             return self.copy_abs()
   1113 
   1114         if self._is_special:
   1115             ans = self._check_nans(context=context)
   1116             if ans:
   1117                 return ans
   1118 
   1119         if self._sign:
   1120             ans = self.__neg__(context=context)
   1121         else:
   1122             ans = self.__pos__(context=context)
   1123 
   1124         return ans
   1125 
   1126     def __add__(self, other, context=None):
   1127         """Returns self + other.
   1128 
   1129         -INF + INF (or the reverse) cause InvalidOperation errors.
   1130         """
   1131         other = _convert_other(other)
   1132         if other is NotImplemented:
   1133             return other
   1134 
   1135         if context is None:
   1136             context = getcontext()
   1137 
   1138         if self._is_special or other._is_special:
   1139             ans = self._check_nans(other, context)
   1140             if ans:
   1141                 return ans
   1142 
   1143             if self._isinfinity():
   1144                 # If both INF, same sign => same as both, opposite => error.

   1145                 if self._sign != other._sign and other._isinfinity():
   1146                     return context._raise_error(InvalidOperation, '-INF + INF')
   1147                 return Decimal(self)
   1148             if other._isinfinity():
   1149                 return Decimal(other)  # Can't both be infinity here

   1150 
   1151         exp = min(self._exp, other._exp)
   1152         negativezero = 0
   1153         if context.rounding == ROUND_FLOOR and self._sign != other._sign:
   1154             # If the answer is 0, the sign should be negative, in this case.

   1155             negativezero = 1
   1156 
   1157         if not self and not other:
   1158             sign = min(self._sign, other._sign)
   1159             if negativezero:
   1160                 sign = 1
   1161             ans = _dec_from_triple(sign, '0', exp)
   1162             ans = ans._fix(context)
   1163             return ans
   1164         if not self:
   1165             exp = max(exp, other._exp - context.prec-1)
   1166             ans = other._rescale(exp, context.rounding)
   1167             ans = ans._fix(context)
   1168             return ans
   1169         if not other:
   1170             exp = max(exp, self._exp - context.prec-1)
   1171             ans = self._rescale(exp, context.rounding)
   1172             ans = ans._fix(context)
   1173             return ans
   1174 
   1175         op1 = _WorkRep(self)
   1176         op2 = _WorkRep(other)
   1177         op1, op2 = _normalize(op1, op2, context.prec)
   1178 
   1179         result = _WorkRep()
   1180         if op1.sign != op2.sign:
   1181             # Equal and opposite

   1182             if op1.int == op2.int:
   1183                 ans = _dec_from_triple(negativezero, '0', exp)
   1184                 ans = ans._fix(context)
   1185                 return ans
   1186             if op1.int < op2.int:
   1187                 op1, op2 = op2, op1
   1188                 # OK, now abs(op1) > abs(op2)

   1189             if op1.sign == 1:
   1190                 result.sign = 1
   1191                 op1.sign, op2.sign = op2.sign, op1.sign
   1192             else:
   1193                 result.sign = 0
   1194                 # So we know the sign, and op1 > 0.

   1195         elif op1.sign == 1:
   1196             result.sign = 1
   1197             op1.sign, op2.sign = (0, 0)
   1198         else:
   1199             result.sign = 0
   1200         # Now, op1 > abs(op2) > 0

   1201 
   1202         if op2.sign == 0:
   1203             result.int = op1.int + op2.int
   1204         else:
   1205             result.int = op1.int - op2.int
   1206 
   1207         result.exp = op1.exp
   1208         ans = Decimal(result)
   1209         ans = ans._fix(context)
   1210         return ans
   1211 
   1212     __radd__ = __add__
   1213 
   1214     def __sub__(self, other, context=None):
   1215         """Return self - other"""
   1216         other = _convert_other(other)
   1217         if other is NotImplemented:
   1218             return other
   1219 
   1220         if self._is_special or other._is_special:
   1221             ans = self._check_nans(other, context=context)
   1222             if ans:
   1223                 return ans
   1224 
   1225         # self - other is computed as self + other.copy_negate()

   1226         return self.__add__(other.copy_negate(), context=context)
   1227 
   1228     def __rsub__(self, other, context=None):
   1229         """Return other - self"""
   1230         other = _convert_other(other)
   1231         if other is NotImplemented:
   1232             return other
   1233 
   1234         return other.__sub__(self, context=context)
   1235 
   1236     def __mul__(self, other, context=None):
   1237         """Return self * other.
   1238 
   1239         (+-) INF * 0 (or its reverse) raise InvalidOperation.
   1240         """
   1241         other = _convert_other(other)
   1242         if other is NotImplemented:
   1243             return other
   1244 
   1245         if context is None:
   1246             context = getcontext()
   1247 
   1248         resultsign = self._sign ^ other._sign
   1249 
   1250         if self._is_special or other._is_special:
   1251             ans = self._check_nans(other, context)
   1252             if ans:
   1253                 return ans
   1254 
   1255             if self._isinfinity():
   1256                 if not other:
   1257                     return context._raise_error(InvalidOperation, '(+-)INF * 0')
   1258                 return _SignedInfinity[resultsign]
   1259 
   1260             if other._isinfinity():
   1261                 if not self:
   1262                     return context._raise_error(InvalidOperation, '0 * (+-)INF')
   1263                 return _SignedInfinity[resultsign]
   1264 
   1265         resultexp = self._exp + other._exp
   1266 
   1267         # Special case for multiplying by zero

   1268         if not self or not other:
   1269             ans = _dec_from_triple(resultsign, '0', resultexp)
   1270             # Fixing in case the exponent is out of bounds

   1271             ans = ans._fix(context)
   1272             return ans
   1273 
   1274         # Special case for multiplying by power of 10

   1275         if self._int == '1':
   1276             ans = _dec_from_triple(resultsign, other._int, resultexp)
   1277             ans = ans._fix(context)
   1278             return ans
   1279         if other._int == '1':
   1280             ans = _dec_from_triple(resultsign, self._int, resultexp)
   1281             ans = ans._fix(context)
   1282             return ans
   1283 
   1284         op1 = _WorkRep(self)
   1285         op2 = _WorkRep(other)
   1286 
   1287         ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
   1288         ans = ans._fix(context)
   1289 
   1290         return ans
   1291     __rmul__ = __mul__
   1292 
   1293     def __truediv__(self, other, context=None):
   1294         """Return self / other."""
   1295         other = _convert_other(other)
   1296         if other is NotImplemented:
   1297             return NotImplemented
   1298 
   1299         if context is None:
   1300             context = getcontext()
   1301 
   1302         sign = self._sign ^ other._sign
   1303 
   1304         if self._is_special or other._is_special:
   1305             ans = self._check_nans(other, context)
   1306             if ans:
   1307                 return ans
   1308 
   1309             if self._isinfinity() and other._isinfinity():
   1310                 return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
   1311 
   1312             if self._isinfinity():
   1313                 return _SignedInfinity[sign]
   1314 
   1315             if other._isinfinity():
   1316                 context._raise_error(Clamped, 'Division by infinity')
   1317                 return _dec_from_triple(sign, '0', context.Etiny())
   1318 
   1319         # Special cases for zeroes

   1320         if not other:
   1321             if not self:
   1322                 return context._raise_error(DivisionUndefined, '0 / 0')
   1323             return context._raise_error(DivisionByZero, 'x / 0', sign)
   1324 
   1325         if not self:
   1326             exp = self._exp - other._exp
   1327             coeff = 0
   1328         else:
   1329             # OK, so neither = 0, INF or NaN

   1330             shift = len(other._int) - len(self._int) + context.prec + 1
   1331             exp = self._exp - other._exp - shift
   1332             op1 = _WorkRep(self)
   1333             op2 = _WorkRep(other)
   1334             if shift >= 0:
   1335                 coeff, remainder = divmod(op1.int * 10**shift, op2.int)
   1336             else:
   1337                 coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
   1338             if remainder:
   1339                 # result is not exact; adjust to ensure correct rounding

   1340                 if coeff % 5 == 0:
   1341                     coeff += 1
   1342             else:
   1343                 # result is exact; get as close to ideal exponent as possible

   1344                 ideal_exp = self._exp - other._exp
   1345                 while exp < ideal_exp and coeff % 10 == 0:
   1346                     coeff //= 10
   1347                     exp += 1
   1348 
   1349         ans = _dec_from_triple(sign, str(coeff), exp)
   1350         return ans._fix(context)
   1351 
   1352     def _divide(self, other, context):
   1353         """Return (self // other, self % other), to context.prec precision.
   1354 
   1355         Assumes that neither self nor other is a NaN, that self is not
   1356         infinite and that other is nonzero.
   1357         """
   1358         sign = self._sign ^ other._sign
   1359         if other._isinfinity():
   1360             ideal_exp = self._exp
   1361         else:
   1362             ideal_exp = min(self._exp, other._exp)
   1363 
   1364         expdiff = self.adjusted() - other.adjusted()
   1365         if not self or other._isinfinity() or expdiff <= -2:
   1366             return (_dec_from_triple(sign, '0', 0),
   1367                     self._rescale(ideal_exp, context.rounding))
   1368         if expdiff <= context.prec:
   1369             op1 = _WorkRep(self)
   1370             op2 = _WorkRep(other)
   1371             if op1.exp >= op2.exp:
   1372                 op1.int *= 10**(op1.exp - op2.exp)
   1373             else:
   1374                 op2.int *= 10**(op2.exp - op1.exp)
   1375             q, r = divmod(op1.int, op2.int)
   1376             if q < 10**context.prec:
   1377                 return (_dec_from_triple(sign, str(q), 0),
   1378                         _dec_from_triple(self._sign, str(r), ideal_exp))
   1379 
   1380         # Here the quotient is too large to be representable

   1381         ans = context._raise_error(DivisionImpossible,
   1382                                    'quotient too large in //, % or divmod')
   1383         return ans, ans
   1384 
   1385     def __rtruediv__(self, other, context=None):
   1386         """Swaps self/other and returns __truediv__."""
   1387         other = _convert_other(other)
   1388         if other is NotImplemented:
   1389             return other
   1390         return other.__truediv__(self, context=context)
   1391 
   1392     __div__ = __truediv__
   1393     __rdiv__ = __rtruediv__
   1394 
   1395     def __divmod__(self, other, context=None):
   1396         """
   1397         Return (self // other, self % other)
   1398         """
   1399         other = _convert_other(other)
   1400         if other is NotImplemented:
   1401             return other
   1402 
   1403         if context is None:
   1404             context = getcontext()
   1405 
   1406         ans = self._check_nans(other, context)
   1407         if ans:
   1408             return (ans, ans)
   1409 
   1410         sign = self._sign ^ other._sign
   1411         if self._isinfinity():
   1412             if other._isinfinity():
   1413                 ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
   1414                 return ans, ans
   1415             else:
   1416                 return (_SignedInfinity[sign],
   1417                         context._raise_error(InvalidOperation, 'INF % x'))
   1418 
   1419         if not other:
   1420             if not self:
   1421                 ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
   1422                 return ans, ans
   1423             else:
   1424                 return (context._raise_error(DivisionByZero, 'x // 0', sign),
   1425                         context._raise_error(InvalidOperation, 'x % 0'))
   1426 
   1427         quotient, remainder = self._divide(other, context)
   1428         remainder = remainder._fix(context)
   1429         return quotient, remainder
   1430 
   1431     def __rdivmod__(self, other, context=None):
   1432         """Swaps self/other and returns __divmod__."""
   1433         other = _convert_other(other)
   1434         if other is NotImplemented:
   1435             return other
   1436         return other.__divmod__(self, context=context)
   1437 
   1438     def __mod__(self, other, context=None):
   1439         """
   1440         self % other
   1441         """
   1442         other = _convert_other(other)
   1443         if other is NotImplemented:
   1444             return other
   1445 
   1446         if context is None:
   1447             context = getcontext()
   1448 
   1449         ans = self._check_nans(other, context)
   1450         if ans:
   1451             return ans
   1452 
   1453         if self._isinfinity():
   1454             return context._raise_error(InvalidOperation, 'INF % x')
   1455         elif not other:
   1456             if self:
   1457                 return context._raise_error(InvalidOperation, 'x % 0')
   1458             else:
   1459                 return context._raise_error(DivisionUndefined, '0 % 0')
   1460 
   1461         remainder = self._divide(other, context)[1]
   1462         remainder = remainder._fix(context)
   1463         return remainder
   1464 
   1465     def __rmod__(self, other, context=None):
   1466         """Swaps self/other and returns __mod__."""
   1467         other = _convert_other(other)
   1468         if other is NotImplemented:
   1469             return other
   1470         return other.__mod__(self, context=context)
   1471 
   1472     def remainder_near(self, other, context=None):
   1473         """
   1474         Remainder nearest to 0-  abs(remainder-near) <= other/2
   1475         """
   1476         if context is None:
   1477             context = getcontext()
   1478 
   1479         other = _convert_other(other, raiseit=True)
   1480 
   1481         ans = self._check_nans(other, context)
   1482         if ans:
   1483             return ans
   1484 
   1485         # self == +/-infinity -> InvalidOperation

   1486         if self._isinfinity():
   1487             return context._raise_error(InvalidOperation,
   1488                                         'remainder_near(infinity, x)')
   1489 
   1490         # other == 0 -> either InvalidOperation or DivisionUndefined

   1491         if not other:
   1492             if self:
   1493                 return context._raise_error(InvalidOperation,
   1494                                             'remainder_near(x, 0)')
   1495             else:
   1496                 return context._raise_error(DivisionUndefined,
   1497                                             'remainder_near(0, 0)')
   1498 
   1499         # other = +/-infinity -> remainder = self

   1500         if other._isinfinity():
   1501             ans = Decimal(self)
   1502             return ans._fix(context)
   1503 
   1504         # self = 0 -> remainder = self, with ideal exponent

   1505         ideal_exponent = min(self._exp, other._exp)
   1506         if not self:
   1507             ans = _dec_from_triple(self._sign, '0', ideal_exponent)
   1508             return ans._fix(context)
   1509 
   1510         # catch most cases of large or small quotient

   1511         expdiff = self.adjusted() - other.adjusted()
   1512         if expdiff >= context.prec + 1:
   1513             # expdiff >= prec+1 => abs(self/other) > 10**prec

   1514             return context._raise_error(DivisionImpossible)
   1515         if expdiff <= -2:
   1516             # expdiff <= -2 => abs(self/other) < 0.1

   1517             ans = self._rescale(ideal_exponent, context.rounding)
   1518             return ans._fix(context)
   1519 
   1520         # adjust both arguments to have the same exponent, then divide

   1521         op1 = _WorkRep(self)
   1522         op2 = _WorkRep(other)
   1523         if op1.exp >= op2.exp:
   1524             op1.int *= 10**(op1.exp - op2.exp)
   1525         else:
   1526             op2.int *= 10**(op2.exp - op1.exp)
   1527         q, r = divmod(op1.int, op2.int)
   1528         # remainder is r*10**ideal_exponent; other is +/-op2.int *

   1529         # 10**ideal_exponent.   Apply correction to ensure that

   1530         # abs(remainder) <= abs(other)/2

   1531         if 2*r + (q&1) > op2.int:
   1532             r -= op2.int
   1533             q += 1
   1534 
   1535         if q >= 10**context.prec:
   1536             return context._raise_error(DivisionImpossible)
   1537 
   1538         # result has same sign as self unless r is negative

   1539         sign = self._sign
   1540         if r < 0:
   1541             sign = 1-sign
   1542             r = -r
   1543 
   1544         ans = _dec_from_triple(sign, str(r), ideal_exponent)
   1545         return ans._fix(context)
   1546 
   1547     def __floordiv__(self, other, context=None):
   1548         """self // other"""
   1549         other = _convert_other(other)
   1550         if other is NotImplemented:
   1551             return other
   1552 
   1553         if context is None:
   1554             context = getcontext()
   1555 
   1556         ans = self._check_nans(other, context)
   1557         if ans:
   1558             return ans
   1559 
   1560         if self._isinfinity():
   1561             if other._isinfinity():
   1562                 return context._raise_error(InvalidOperation, 'INF // INF')
   1563             else:
   1564                 return _SignedInfinity[self._sign ^ other._sign]
   1565 
   1566         if not other:
   1567             if self:
   1568                 return context._raise_error(DivisionByZero, 'x // 0',
   1569                                             self._sign ^ other._sign)
   1570             else:
   1571                 return context._raise_error(DivisionUndefined, '0 // 0')
   1572 
   1573         return self._divide(other, context)[0]
   1574 
   1575     def __rfloordiv__(self, other, context=None):
   1576         """Swaps self/other and returns __floordiv__."""
   1577         other = _convert_other(other)
   1578         if other is NotImplemented:
   1579             return other
   1580         return other.__floordiv__(self, context=context)
   1581 
   1582     def __float__(self):
   1583         """Float representation."""
   1584         return float(str(self))
   1585 
   1586     def __int__(self):
   1587         """Converts self to an int, truncating if necessary."""
   1588         if self._is_special:
   1589             if self._isnan():
   1590                 raise ValueError("Cannot convert NaN to integer")
   1591             elif self._isinfinity():
   1592                 raise OverflowError("Cannot convert infinity to integer")
   1593         s = (-1)**self._sign
   1594         if self._exp >= 0:
   1595             return s*int(self._int)*10**self._exp
   1596         else:
   1597             return s*int(self._int[:self._exp] or '0')
   1598 
   1599     __trunc__ = __int__
   1600 
   1601     def real(self):
   1602         return self
   1603     real = property(real)
   1604 
   1605     def imag(self):
   1606         return Decimal(0)
   1607     imag = property(imag)
   1608 
   1609     def conjugate(self):
   1610         return self
   1611 
   1612     def __complex__(self):
   1613         return complex(float(self))
   1614 
   1615     def __long__(self):
   1616         """Converts to a long.
   1617 
   1618         Equivalent to long(int(self))
   1619         """
   1620         return long(self.__int__())
   1621 
   1622     def _fix_nan(self, context):
   1623         """Decapitate the payload of a NaN to fit the context"""
   1624         payload = self._int
   1625 
   1626         # maximum length of payload is precision if _clamp=0,

   1627         # precision-1 if _clamp=1.

   1628         max_payload_len = context.prec - context._clamp
   1629         if len(payload) > max_payload_len:
   1630             payload = payload[len(payload)-max_payload_len:].lstrip('0')
   1631             return _dec_from_triple(self._sign, payload, self._exp, True)
   1632         return Decimal(self)
   1633 
   1634     def _fix(self, context):
   1635         """Round if it is necessary to keep self within prec precision.
   1636 
   1637         Rounds and fixes the exponent.  Does not raise on a sNaN.
   1638 
   1639         Arguments:
   1640         self - Decimal instance
   1641         context - context used.
   1642         """
   1643 
   1644         if self._is_special:
   1645             if self._isnan():
   1646                 # decapitate payload if necessary

   1647                 return self._fix_nan(context)
   1648             else:
   1649                 # self is +/-Infinity; return unaltered

   1650                 return Decimal(self)
   1651 
   1652         # if self is zero then exponent should be between Etiny and

   1653         # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.

   1654         Etiny = context.Etiny()
   1655         Etop = context.Etop()
   1656         if not self:
   1657             exp_max = [context.Emax, Etop][context._clamp]
   1658             new_exp = min(max(self._exp, Etiny), exp_max)
   1659             if new_exp != self._exp:
   1660                 context._raise_error(Clamped)
   1661                 return _dec_from_triple(self._sign, '0', new_exp)
   1662             else:
   1663                 return Decimal(self)
   1664 
   1665         # exp_min is the smallest allowable exponent of the result,

   1666         # equal to max(self.adjusted()-context.prec+1, Etiny)

   1667         exp_min = len(self._int) + self._exp - context.prec
   1668         if exp_min > Etop:
   1669             # overflow: exp_min > Etop iff self.adjusted() > Emax

   1670             ans = context._raise_error(Overflow, 'above Emax', self._sign)
   1671             context._raise_error(Inexact)
   1672             context._raise_error(Rounded)
   1673             return ans
   1674 
   1675         self_is_subnormal = exp_min < Etiny
   1676         if self_is_subnormal:
   1677             exp_min = Etiny
   1678 
   1679         # round if self has too many digits

   1680         if self._exp < exp_min:
   1681             digits = len(self._int) + self._exp - exp_min
   1682             if digits < 0:
   1683                 self = _dec_from_triple(self._sign, '1', exp_min-1)
   1684                 digits = 0
   1685             rounding_method = self._pick_rounding_function[context.rounding]
   1686             changed = rounding_method(self, digits)
   1687             coeff = self._int[:digits] or '0'
   1688             if changed > 0:
   1689                 coeff = str(int(coeff)+1)
   1690                 if len(coeff) > context.prec:
   1691                     coeff = coeff[:-1]
   1692                     exp_min += 1
   1693 
   1694             # check whether the rounding pushed the exponent out of range

   1695             if exp_min > Etop:
   1696                 ans = context._raise_error(Overflow, 'above Emax', self._sign)
   1697             else:
   1698                 ans = _dec_from_triple(self._sign, coeff, exp_min)
   1699 
   1700             # raise the appropriate signals, taking care to respect

   1701             # the precedence described in the specification

   1702             if changed and self_is_subnormal:
   1703                 context._raise_error(Underflow)
   1704             if self_is_subnormal:
   1705                 context._raise_error(Subnormal)
   1706             if changed:
   1707                 context._raise_error(Inexact)
   1708             context._raise_error(Rounded)
   1709             if not ans:
   1710                 # raise Clamped on underflow to 0

   1711                 context._raise_error(Clamped)
   1712             return ans
   1713 
   1714         if self_is_subnormal:
   1715             context._raise_error(Subnormal)
   1716 
   1717         # fold down if _clamp == 1 and self has too few digits

   1718         if context._clamp == 1 and self._exp > Etop:
   1719             context._raise_error(Clamped)
   1720             self_padded = self._int + '0'*(self._exp - Etop)
   1721             return _dec_from_triple(self._sign, self_padded, Etop)
   1722 
   1723         # here self was representable to begin with; return unchanged

   1724         return Decimal(self)
   1725 
   1726     # for each of the rounding functions below:

   1727     #   self is a finite, nonzero Decimal

   1728     #   prec is an integer satisfying 0 <= prec < len(self._int)

   1729     #

   1730     # each function returns either -1, 0, or 1, as follows:

   1731     #   1 indicates that self should be rounded up (away from zero)

   1732     #   0 indicates that self should be truncated, and that all the

   1733     #     digits to be truncated are zeros (so the value is unchanged)

   1734     #  -1 indicates that there are nonzero digits to be truncated

   1735 
   1736     def _round_down(self, prec):
   1737         """Also known as round-towards-0, truncate."""
   1738         if _all_zeros(self._int, prec):
   1739             return 0
   1740         else:
   1741             return -1
   1742 
   1743     def _round_up(self, prec):
   1744         """Rounds away from 0."""
   1745         return -self._round_down(prec)
   1746 
   1747     def _round_half_up(self, prec):
   1748         """Rounds 5 up (away from 0)"""
   1749         if self._int[prec] in '56789':
   1750             return 1
   1751         elif _all_zeros(self._int, prec):
   1752             return 0
   1753         else:
   1754             return -1
   1755 
   1756     def _round_half_down(self, prec):
   1757         """Round 5 down"""
   1758         if _exact_half(self._int, prec):
   1759             return -1
   1760         else:
   1761             return self._round_half_up(prec)
   1762 
   1763     def _round_half_even(self, prec):
   1764         """Round 5 to even, rest to nearest."""
   1765         if _exact_half(self._int, prec) and \
   1766                 (prec == 0 or self._int[prec-1] in '02468'):
   1767             return -1
   1768         else:
   1769             return self._round_half_up(prec)
   1770 
   1771     def _round_ceiling(self, prec):
   1772         """Rounds up (not away from 0 if negative.)"""
   1773         if self._sign:
   1774             return self._round_down(prec)
   1775         else:
   1776             return -self._round_down(prec)
   1777 
   1778     def _round_floor(self, prec):
   1779         """Rounds down (not towards 0 if negative)"""
   1780         if not self._sign:
   1781             return self._round_down(prec)
   1782         else:
   1783             return -self._round_down(prec)
   1784 
   1785     def _round_05up(self, prec):
   1786         """Round down unless digit prec-1 is 0 or 5."""
   1787         if prec and self._int[prec-1] not in '05':
   1788             return self._round_down(prec)
   1789         else:
   1790             return -self._round_down(prec)
   1791 
   1792     _pick_rounding_function = dict(
   1793         ROUND_DOWN = _round_down,
   1794         ROUND_UP = _round_up,
   1795         ROUND_HALF_UP = _round_half_up,
   1796         ROUND_HALF_DOWN = _round_half_down,
   1797         ROUND_HALF_EVEN = _round_half_even,
   1798         ROUND_CEILING = _round_ceiling,
   1799         ROUND_FLOOR = _round_floor,
   1800         ROUND_05UP = _round_05up,
   1801     )
   1802 
   1803     def fma(self, other, third, context=None):
   1804         """Fused multiply-add.
   1805 
   1806         Returns self*other+third with no rounding of the intermediate
   1807         product self*other.
   1808 
   1809         self and other are multiplied together, with no rounding of
   1810         the result.  The third operand is then added to the result,
   1811         and a single final rounding is performed.
   1812         """
   1813 
   1814         other = _convert_other(other, raiseit=True)
   1815 
   1816         # compute product; raise InvalidOperation if either operand is

   1817         # a signaling NaN or if the product is zero times infinity.

   1818         if self._is_special or other._is_special:
   1819             if context is None:
   1820                 context = getcontext()
   1821             if self._exp == 'N':
   1822                 return context._raise_error(InvalidOperation, 'sNaN', self)
   1823             if other._exp == 'N':
   1824                 return context._raise_error(InvalidOperation, 'sNaN', other)
   1825             if self._exp == 'n':
   1826                 product = self
   1827             elif other._exp == 'n':
   1828                 product = other
   1829             elif self._exp == 'F':
   1830                 if not other:
   1831                     return context._raise_error(InvalidOperation,
   1832                                                 'INF * 0 in fma')
   1833                 product = _SignedInfinity[self._sign ^ other._sign]
   1834             elif other._exp == 'F':
   1835                 if not self:
   1836                     return context._raise_error(InvalidOperation,
   1837                                                 '0 * INF in fma')
   1838                 product = _SignedInfinity[self._sign ^ other._sign]
   1839         else:
   1840             product = _dec_from_triple(self._sign ^ other._sign,
   1841                                        str(int(self._int) * int(other._int)),
   1842                                        self._exp + other._exp)
   1843 
   1844         third = _convert_other(third, raiseit=True)
   1845         return product.__add__(third, context)
   1846 
   1847     def _power_modulo(self, other, modulo, context=None):
   1848         """Three argument version of __pow__"""
   1849 
   1850         # if can't convert other and modulo to Decimal, raise

   1851         # TypeError; there's no point returning NotImplemented (no

   1852         # equivalent of __rpow__ for three argument pow)

   1853         other = _convert_other(other, raiseit=True)
   1854         modulo = _convert_other(modulo, raiseit=True)
   1855 
   1856         if context is None:
   1857             context = getcontext()
   1858 
   1859         # deal with NaNs: if there are any sNaNs then first one wins,

   1860         # (i.e. behaviour for NaNs is identical to that of fma)

   1861         self_is_nan = self._isnan()
   1862         other_is_nan = other._isnan()
   1863         modulo_is_nan = modulo._isnan()
   1864         if self_is_nan or other_is_nan or modulo_is_nan:
   1865             if self_is_nan == 2:
   1866                 return context._raise_error(InvalidOperation, 'sNaN',
   1867                                         self)
   1868             if other_is_nan == 2:
   1869                 return context._raise_error(InvalidOperation, 'sNaN',
   1870                                         other)
   1871             if modulo_is_nan == 2:
   1872                 return context._raise_error(InvalidOperation, 'sNaN',
   1873                                         modulo)
   1874             if self_is_nan:
   1875                 return self._fix_nan(context)
   1876             if other_is_nan:
   1877                 return other._fix_nan(context)
   1878             return modulo._fix_nan(context)
   1879 
   1880         # check inputs: we apply same restrictions as Python's pow()

   1881         if not (self._isinteger() and
   1882                 other._isinteger() and
   1883                 modulo._isinteger()):
   1884             return context._raise_error(InvalidOperation,
   1885                                         'pow() 3rd argument not allowed '
   1886                                         'unless all arguments are integers')
   1887         if other < 0:
   1888             return context._raise_error(InvalidOperation,
   1889                                         'pow() 2nd argument cannot be '
   1890                                         'negative when 3rd argument specified')
   1891         if not modulo:
   1892             return context._raise_error(InvalidOperation,
   1893                                         'pow() 3rd argument cannot be 0')
   1894 
   1895         # additional restriction for decimal: the modulus must be less

   1896         # than 10**prec in absolute value

   1897         if modulo.adjusted() >= context.prec:
   1898             return context._raise_error(InvalidOperation,
   1899                                         'insufficient precision: pow() 3rd '
   1900                                         'argument must not have more than '
   1901                                         'precision digits')
   1902 
   1903         # define 0**0 == NaN, for consistency with two-argument pow

   1904         # (even though it hurts!)

   1905         if not other and not self:
   1906             return context._raise_error(InvalidOperation,
   1907                                         'at least one of pow() 1st argument '
   1908                                         'and 2nd argument must be nonzero ;'
   1909                                         '0**0 is not defined')
   1910 
   1911         # compute sign of result

   1912         if other._iseven():
   1913             sign = 0
   1914         else:
   1915             sign = self._sign
   1916 
   1917         # convert modulo to a Python integer, and self and other to

   1918         # Decimal integers (i.e. force their exponents to be >= 0)

   1919         modulo = abs(int(modulo))
   1920         base = _WorkRep(self.to_integral_value())
   1921         exponent = _WorkRep(other.to_integral_value())
   1922 
   1923         # compute result using integer pow()

   1924         base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
   1925         for i in xrange(exponent.exp):
   1926             base = pow(base, 10, modulo)
   1927         base = pow(base, exponent.int, modulo)
   1928 
   1929         return _dec_from_triple(sign, str(base), 0)
   1930 
   1931     def _power_exact(self, other, p):
   1932         """Attempt to compute self**other exactly.
   1933 
   1934         Given Decimals self and other and an integer p, attempt to
   1935         compute an exact result for the power self**other, with p
   1936         digits of precision.  Return None if self**other is not
   1937         exactly representable in p digits.
   1938 
   1939         Assumes that elimination of special cases has already been
   1940         performed: self and other must both be nonspecial; self must
   1941         be positive and not numerically equal to 1; other must be
   1942         nonzero.  For efficiency, other._exp should not be too large,
   1943         so that 10**abs(other._exp) is a feasible calculation."""
   1944 
   1945         # In the comments below, we write x for the value of self and

   1946         # y for the value of other.  Write x = xc*10**xe and y =

   1947         # yc*10**ye.

   1948 
   1949         # The main purpose of this method is to identify the *failure*

   1950         # of x**y to be exactly representable with as little effort as

   1951         # possible.  So we look for cheap and easy tests that

   1952         # eliminate the possibility of x**y being exact.  Only if all

   1953         # these tests are passed do we go on to actually compute x**y.

   1954 
   1955         # Here's the main idea.  First normalize both x and y.  We

   1956         # express y as a rational m/n, with m and n relatively prime

   1957         # and n>0.  Then for x**y to be exactly representable (at

   1958         # *any* precision), xc must be the nth power of a positive

   1959         # integer and xe must be divisible by n.  If m is negative

   1960         # then additionally xc must be a power of either 2 or 5, hence

   1961         # a power of 2**n or 5**n.

   1962         #

   1963         # There's a limit to how small |y| can be: if y=m/n as above

   1964         # then:

   1965         #

   1966         #  (1) if xc != 1 then for the result to be representable we

   1967         #      need xc**(1/n) >= 2, and hence also xc**|y| >= 2.  So

   1968         #      if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=

   1969         #      2**(1/|y|), hence xc**|y| < 2 and the result is not

   1970         #      representable.

   1971         #

   1972         #  (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1.  Hence if

   1973         #      |y| < 1/|xe| then the result is not representable.

   1974         #

   1975         # Note that since x is not equal to 1, at least one of (1) and

   1976         # (2) must apply.  Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <

   1977         # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.

   1978         #

   1979         # There's also a limit to how large y can be, at least if it's

   1980         # positive: the normalized result will have coefficient xc**y,

   1981         # so if it's representable then xc**y < 10**p, and y <

   1982         # p/log10(xc).  Hence if y*log10(xc) >= p then the result is

   1983         # not exactly representable.

   1984 
   1985         # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,

   1986         # so |y| < 1/xe and the result is not representable.

   1987         # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|

   1988         # < 1/nbits(xc).

   1989 
   1990         x = _WorkRep(self)
   1991         xc, xe = x.int, x.exp
   1992         while xc % 10 == 0:
   1993             xc //= 10
   1994             xe += 1
   1995 
   1996         y = _WorkRep(other)
   1997         yc, ye = y.int, y.exp
   1998         while yc % 10 == 0:
   1999             yc //= 10
   2000             ye += 1
   2001 
   2002         # case where xc == 1: result is 10**(xe*y), with xe*y

   2003         # required to be an integer

   2004         if xc == 1:
   2005             xe *= yc
   2006             # result is now 10**(xe * 10**ye);  xe * 10**ye must be integral

   2007             while xe % 10 == 0:
   2008                 xe //= 10
   2009                 ye += 1
   2010             if ye < 0:
   2011                 return None
   2012             exponent = xe * 10**ye
   2013             if y.sign == 1:
   2014                 exponent = -exponent
   2015             # if other is a nonnegative integer, use ideal exponent

   2016             if other._isinteger() and other._sign == 0:
   2017                 ideal_exponent = self._exp*int(other)
   2018                 zeros = min(exponent-ideal_exponent, p-1)
   2019             else:
   2020                 zeros = 0
   2021             return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
   2022 
   2023         # case where y is negative: xc must be either a power

   2024         # of 2 or a power of 5.

   2025         if y.sign == 1:
   2026             last_digit = xc % 10
   2027             if last_digit in (2,4,6,8):
   2028                 # quick test for power of 2

   2029                 if xc & -xc != xc:
   2030                     return None
   2031                 # now xc is a power of 2; e is its exponent

   2032                 e = _nbits(xc)-1
   2033                 # find e*y and xe*y; both must be integers

   2034                 if ye >= 0:
   2035                     y_as_int = yc*10**ye
   2036                     e = e*y_as_int
   2037                     xe = xe*y_as_int
   2038                 else:
   2039                     ten_pow = 10**-ye
   2040                     e, remainder = divmod(e*yc, ten_pow)
   2041                     if remainder:
   2042                         return None
   2043                     xe, remainder = divmod(xe*yc, ten_pow)
   2044                     if remainder:
   2045                         return None
   2046 
   2047                 if e*65 >= p*93: # 93/65 > log(10)/log(5)

   2048                     return None
   2049                 xc = 5**e
   2050 
   2051             elif last_digit == 5:
   2052                 # e >= log_5(xc) if xc is a power of 5; we have

   2053                 # equality all the way up to xc=5**2658

   2054                 e = _nbits(xc)*28//65
   2055                 xc, remainder = divmod(5**e, xc)
   2056                 if remainder:
   2057                     return None
   2058                 while xc % 5 == 0:
   2059                     xc //= 5
   2060                     e -= 1
   2061                 if ye >= 0:
   2062                     y_as_integer = yc*10**ye
   2063                     e = e*y_as_integer
   2064                     xe = xe*y_as_integer
   2065                 else:
   2066                     ten_pow = 10**-ye
   2067                     e, remainder = divmod(e*yc, ten_pow)
   2068                     if remainder:
   2069                         return None
   2070                     xe, remainder = divmod(xe*yc, ten_pow)
   2071                     if remainder:
   2072                         return None
   2073                 if e*3 >= p*10: # 10/3 > log(10)/log(2)

   2074                     return None
   2075                 xc = 2**e
   2076             else:
   2077                 return None
   2078 
   2079             if xc >= 10**p:
   2080                 return None
   2081             xe = -e-xe
   2082             return _dec_from_triple(0, str(xc), xe)
   2083 
   2084         # now y is positive; find m and n such that y = m/n

   2085         if ye >= 0:
   2086             m, n = yc*10**ye, 1
   2087         else:
   2088             if xe != 0 and len(str(abs(yc*xe))) <= -ye:
   2089                 return None
   2090             xc_bits = _nbits(xc)
   2091             if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
   2092                 return None
   2093             m, n = yc, 10**(-ye)
   2094             while m % 2 == n % 2 == 0:
   2095                 m //= 2
   2096                 n //= 2
   2097             while m % 5 == n % 5 == 0:
   2098                 m //= 5
   2099                 n //= 5
   2100 
   2101         # compute nth root of xc*10**xe

   2102         if n > 1:
   2103             # if 1 < xc < 2**n then xc isn't an nth power

   2104             if xc != 1 and xc_bits <= n:
   2105                 return None
   2106 
   2107             xe, rem = divmod(xe, n)
   2108             if rem != 0:
   2109                 return None
   2110 
   2111             # compute nth root of xc using Newton's method

   2112             a = 1L << -(-_nbits(xc)//n) # initial estimate

   2113             while True:
   2114                 q, r = divmod(xc, a**(n-1))
   2115                 if a <= q:
   2116                     break
   2117                 else:
   2118                     a = (a*(n-1) + q)//n
   2119             if not (a == q and r == 0):
   2120                 return None
   2121             xc = a
   2122 
   2123         # now xc*10**xe is the nth root of the original xc*10**xe

   2124         # compute mth power of xc*10**xe

   2125 
   2126         # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >

   2127         # 10**p and the result is not representable.

   2128         if xc > 1 and m > p*100//_log10_lb(xc):
   2129             return None
   2130         xc = xc**m
   2131         xe *= m
   2132         if xc > 10**p:
   2133             return None
   2134 
   2135         # by this point the result *is* exactly representable

   2136         # adjust the exponent to get as close as possible to the ideal

   2137         # exponent, if necessary

   2138         str_xc = str(xc)
   2139         if other._isinteger() and other._sign == 0:
   2140             ideal_exponent = self._exp*int(other)
   2141             zeros = min(xe-ideal_exponent, p-len(str_xc))
   2142         else:
   2143             zeros = 0
   2144         return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
   2145 
   2146     def __pow__(self, other, modulo=None, context=None):
   2147         """Return self ** other [ % modulo].
   2148 
   2149         With two arguments, compute self**other.
   2150 
   2151         With three arguments, compute (self**other) % modulo.  For the
   2152         three argument form, the following restrictions on the
   2153         arguments hold:
   2154 
   2155          - all three arguments must be integral
   2156          - other must be nonnegative
   2157          - either self or other (or both) must be nonzero
   2158          - modulo must be nonzero and must have at most p digits,
   2159            where p is the context precision.
   2160 
   2161         If any of these restrictions is violated the InvalidOperation
   2162         flag is raised.
   2163 
   2164         The result of pow(self, other, modulo) is identical to the
   2165         result that would be obtained by computing (self**other) %
   2166         modulo with unbounded precision, but is computed more
   2167         efficiently.  It is always exact.
   2168         """
   2169 
   2170         if modulo is not None:
   2171             return self._power_modulo(other, modulo, context)
   2172 
   2173         other = _convert_other(other)
   2174         if other is NotImplemented:
   2175             return other
   2176 
   2177         if context is None:
   2178             context = getcontext()
   2179 
   2180         # either argument is a NaN => result is NaN

   2181         ans = self._check_nans(other, context)
   2182         if ans:
   2183             return ans
   2184 
   2185         # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)

   2186         if not other:
   2187             if not self:
   2188                 return context._raise_error(InvalidOperation, '0 ** 0')
   2189             else:
   2190                 return _One
   2191 
   2192         # result has sign 1 iff self._sign is 1 and other is an odd integer

   2193         result_sign = 0
   2194         if self._sign == 1:
   2195             if other._isinteger():
   2196                 if not other._iseven():
   2197                     result_sign = 1
   2198             else:
   2199                 # -ve**noninteger = NaN

   2200                 # (-0)**noninteger = 0**noninteger

   2201                 if self:
   2202                     return context._raise_error(InvalidOperation,
   2203                         'x ** y with x negative and y not an integer')
   2204             # negate self, without doing any unwanted rounding

   2205             self = self.copy_negate()
   2206 
   2207         # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity

   2208         if not self:
   2209             if other._sign == 0:
   2210                 return _dec_from_triple(result_sign, '0', 0)
   2211             else:
   2212                 return _SignedInfinity[result_sign]
   2213 
   2214         # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0

   2215         if self._isinfinity():
   2216             if other._sign == 0:
   2217                 return _SignedInfinity[result_sign]
   2218             else:
   2219                 return _dec_from_triple(result_sign, '0', 0)
   2220 
   2221         # 1**other = 1, but the choice of exponent and the flags

   2222         # depend on the exponent of self, and on whether other is a

   2223         # positive integer, a negative integer, or neither

   2224         if self == _One:
   2225             if other._isinteger():
   2226                 # exp = max(self._exp*max(int(other), 0),

   2227                 # 1-context.prec) but evaluating int(other) directly

   2228                 # is dangerous until we know other is small (other

   2229                 # could be 1e999999999)

   2230                 if other._sign == 1:
   2231                     multiplier = 0
   2232                 elif other > context.prec:
   2233                     multiplier = context.prec
   2234                 else:
   2235                     multiplier = int(other)
   2236 
   2237                 exp = self._exp * multiplier
   2238                 if exp < 1-context.prec:
   2239                     exp = 1-context.prec
   2240                     context._raise_error(Rounded)
   2241             else:
   2242                 context._raise_error(Inexact)
   2243                 context._raise_error(Rounded)
   2244                 exp = 1-context.prec
   2245 
   2246             return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
   2247 
   2248         # compute adjusted exponent of self

   2249         self_adj = self.adjusted()
   2250 
   2251         # self ** infinity is infinity if self > 1, 0 if self < 1

   2252         # self ** -infinity is infinity if self < 1, 0 if self > 1

   2253         if other._isinfinity():
   2254             if (other._sign == 0) == (self_adj < 0):
   2255                 return _dec_from_triple(result_sign, '0', 0)
   2256             else:
   2257                 return _SignedInfinity[result_sign]
   2258 
   2259         # from here on, the result always goes through the call

   2260         # to _fix at the end of this function.

   2261         ans = None
   2262         exact = False
   2263 
   2264         # crude test to catch cases of extreme overflow/underflow.  If

   2265         # log10(self)*other >= 10**bound and bound >= len(str(Emax))

   2266         # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence

   2267         # self**other >= 10**(Emax+1), so overflow occurs.  The test

   2268         # for underflow is similar.

   2269         bound = self._log10_exp_bound() + other.adjusted()
   2270         if (self_adj >= 0) == (other._sign == 0):
   2271             # self > 1 and other +ve, or self < 1 and other -ve

   2272             # possibility of overflow

   2273             if bound >= len(str(context.Emax)):
   2274                 ans = _dec_from_triple(result_sign, '1', context.Emax+1)
   2275         else:
   2276             # self > 1 and other -ve, or self < 1 and other +ve

   2277             # possibility of underflow to 0

   2278             Etiny = context.Etiny()
   2279             if bound >= len(str(-Etiny)):
   2280                 ans = _dec_from_triple(result_sign, '1', Etiny-1)
   2281 
   2282         # try for an exact result with precision +1

   2283         if ans is None:
   2284             ans = self._power_exact(other, context.prec + 1)
   2285             if ans is not None:
   2286                 if result_sign == 1:
   2287                     ans = _dec_from_triple(1, ans._int, ans._exp)
   2288                 exact = True
   2289 
   2290         # usual case: inexact result, x**y computed directly as exp(y*log(x))

   2291         if ans is None:
   2292             p = context.prec
   2293             x = _WorkRep(self)
   2294             xc, xe = x.int, x.exp
   2295             y = _WorkRep(other)
   2296             yc, ye = y.int, y.exp
   2297             if y.sign == 1:
   2298                 yc = -yc
   2299 
   2300             # compute correctly rounded result:  start with precision +3,

   2301             # then increase precision until result is unambiguously roundable

   2302             extra = 3
   2303             while True:
   2304                 coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
   2305                 if coeff % (5*10**(len(str(coeff))-p-1)):
   2306                     break
   2307                 extra += 3
   2308 
   2309             ans = _dec_from_triple(result_sign, str(coeff), exp)
   2310 
   2311         # unlike exp, ln and log10, the power function respects the

   2312         # rounding mode; no need to switch to ROUND_HALF_EVEN here

   2313 
   2314         # There's a difficulty here when 'other' is not an integer and

   2315         # the result is exact.  In this case, the specification

   2316         # requires that the Inexact flag be raised (in spite of

   2317         # exactness), but since the result is exact _fix won't do this

   2318         # for us.  (Correspondingly, the Underflow signal should also

   2319         # be raised for subnormal results.)  We can't directly raise

   2320         # these signals either before or after calling _fix, since

   2321         # that would violate the precedence for signals.  So we wrap

   2322         # the ._fix call in a temporary context, and reraise

   2323         # afterwards.

   2324         if exact and not other._isinteger():
   2325             # pad with zeros up to length context.prec+1 if necessary; this

   2326             # ensures that the Rounded signal will be raised.

   2327             if len(ans._int) <= context.prec:
   2328                 expdiff = context.prec + 1 - len(ans._int)
   2329                 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
   2330                                        ans._exp-expdiff)
   2331 
   2332             # create a copy of the current context, with cleared flags/traps

   2333             newcontext = context.copy()
   2334             newcontext.clear_flags()
   2335             for exception in _signals:
   2336                 newcontext.traps[exception] = 0
   2337 
   2338             # round in the new context

   2339             ans = ans._fix(newcontext)
   2340 
   2341             # raise Inexact, and if necessary, Underflow

   2342             newcontext._raise_error(Inexact)
   2343             if newcontext.flags[Subnormal]:
   2344                 newcontext._raise_error(Underflow)
   2345 
   2346             # propagate signals to the original context; _fix could

   2347             # have raised any of Overflow, Underflow, Subnormal,

   2348             # Inexact, Rounded, Clamped.  Overflow needs the correct

   2349             # arguments.  Note that the order of the exceptions is

   2350             # important here.

   2351             if newcontext.flags[Overflow]:
   2352                 context._raise_error(Overflow, 'above Emax', ans._sign)
   2353             for exception in Underflow, Subnormal, Inexact, Rounded, Clamped:
   2354                 if newcontext.flags[exception]:
   2355                     context._raise_error(exception)
   2356 
   2357         else:
   2358             ans = ans._fix(context)
   2359 
   2360         return ans
   2361 
   2362     def __rpow__(self, other, context=None):
   2363         """Swaps self/other and returns __pow__."""
   2364         other = _convert_other(other)
   2365         if other is NotImplemented:
   2366             return other
   2367         return other.__pow__(self, context=context)
   2368 
   2369     def normalize(self, context=None):
   2370         """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
   2371 
   2372         if context is None:
   2373             context = getcontext()
   2374 
   2375         if self._is_special:
   2376             ans = self._check_nans(context=context)
   2377             if ans:
   2378                 return ans
   2379 
   2380         dup = self._fix(context)
   2381         if dup._isinfinity():
   2382             return dup
   2383 
   2384         if not dup:
   2385             return _dec_from_triple(dup._sign, '0', 0)
   2386         exp_max = [context.Emax, context.Etop()][context._clamp]
   2387         end = len(dup._int)
   2388         exp = dup._exp
   2389         while dup._int[end-1] == '0' and exp < exp_max:
   2390             exp += 1
   2391             end -= 1
   2392         return _dec_from_triple(dup._sign, dup._int[:end], exp)
   2393 
   2394     def quantize(self, exp, rounding=None, context=None, watchexp=True):
   2395         """Quantize self so its exponent is the same as that of exp.
   2396 
   2397         Similar to self._rescale(exp._exp) but with error checking.
   2398         """
   2399         exp = _convert_other(exp, raiseit=True)
   2400 
   2401         if context is None:
   2402             context = getcontext()
   2403         if rounding is None:
   2404             rounding = context.rounding
   2405 
   2406         if self._is_special or exp._is_special:
   2407             ans = self._check_nans(exp, context)
   2408             if ans:
   2409                 return ans
   2410 
   2411             if exp._isinfinity() or self._isinfinity():
   2412                 if exp._isinfinity() and self._isinfinity():
   2413                     return Decimal(self)  # if both are inf, it is OK

   2414                 return context._raise_error(InvalidOperation,
   2415                                         'quantize with one INF')
   2416 
   2417         # if we're not watching exponents, do a simple rescale

   2418         if not watchexp:
   2419             ans = self._rescale(exp._exp, rounding)
   2420             # raise Inexact and Rounded where appropriate

   2421             if ans._exp > self._exp:
   2422                 context._raise_error(Rounded)
   2423                 if ans != self:
   2424                     context._raise_error(Inexact)
   2425             return ans
   2426 
   2427         # exp._exp should be between Etiny and Emax

   2428         if not (context.Etiny() <= exp._exp <= context.Emax):
   2429             return context._raise_error(InvalidOperation,
   2430                    'target exponent out of bounds in quantize')
   2431 
   2432         if not self:
   2433             ans = _dec_from_triple(self._sign, '0', exp._exp)
   2434             return ans._fix(context)
   2435 
   2436         self_adjusted = self.adjusted()
   2437         if self_adjusted > context.Emax:
   2438             return context._raise_error(InvalidOperation,
   2439                                         'exponent of quantize result too large for current context')
   2440         if self_adjusted - exp._exp + 1 > context.prec:
   2441             return context._raise_error(InvalidOperation,
   2442                                         'quantize result has too many digits for current context')
   2443 
   2444         ans = self._rescale(exp._exp, rounding)
   2445         if ans.adjusted() > context.Emax:
   2446             return context._raise_error(InvalidOperation,
   2447                                         'exponent of quantize result too large for current context')
   2448         if len(ans._int) > context.prec:
   2449             return context._raise_error(InvalidOperation,
   2450                                         'quantize result has too many digits for current context')
   2451 
   2452         # raise appropriate flags

   2453         if ans and ans.adjusted() < context.Emin:
   2454             context._raise_error(Subnormal)
   2455         if ans._exp > self._exp:
   2456             if ans != self:
   2457                 context._raise_error(Inexact)
   2458             context._raise_error(Rounded)
   2459 
   2460         # call to fix takes care of any necessary folddown, and

   2461         # signals Clamped if necessary

   2462         ans = ans._fix(context)
   2463         return ans
   2464 
   2465     def same_quantum(self, other):
   2466         """Return True if self and other have the same exponent; otherwise
   2467         return False.
   2468 
   2469         If either operand is a special value, the following rules are used:
   2470            * return True if both operands are infinities
   2471            * return True if both operands are NaNs
   2472            * otherwise, return False.
   2473         """
   2474         other = _convert_other(other, raiseit=True)
   2475         if self._is_special or other._is_special:
   2476             return (self.is_nan() and other.is_nan() or
   2477                     self.is_infinite() and other.is_infinite())
   2478         return self._exp == other._exp
   2479 
   2480     def _rescale(self, exp, rounding):
   2481         """Rescale self so that the exponent is exp, either by padding with zeros
   2482         or by truncating digits, using the given rounding mode.
   2483 
   2484         Specials are returned without change.  This operation is
   2485         quiet: it raises no flags, and uses no information from the
   2486         context.
   2487 
   2488         exp = exp to scale to (an integer)
   2489         rounding = rounding mode
   2490         """
   2491         if self._is_special:
   2492             return Decimal(self)
   2493         if not self:
   2494             return _dec_from_triple(self._sign, '0', exp)
   2495 
   2496         if self._exp >= exp:
   2497             # pad answer with zeros if necessary

   2498             return _dec_from_triple(self._sign,
   2499                                         self._int + '0'*(self._exp - exp), exp)
   2500 
   2501         # too many digits; round and lose data.  If self.adjusted() <

   2502         # exp-1, replace self by 10**(exp-1) before rounding

   2503         digits = len(self._int) + self._exp - exp
   2504         if digits < 0:
   2505             self = _dec_from_triple(self._sign, '1', exp-1)
   2506             digits = 0
   2507         this_function = self._pick_rounding_function[rounding]
   2508         changed = this_function(self, digits)
   2509         coeff = self._int[:digits] or '0'
   2510         if changed == 1:
   2511             coeff = str(int(coeff)+1)
   2512         return _dec_from_triple(self._sign, coeff, exp)
   2513 
   2514     def _round(self, places, rounding):
   2515         """Round a nonzero, nonspecial Decimal to a fixed number of
   2516         significant figures, using the given rounding mode.
   2517 
   2518         Infinities, NaNs and zeros are returned unaltered.
   2519 
   2520         This operation is quiet: it raises no flags, and uses no
   2521         information from the context.
   2522 
   2523         """
   2524         if places <= 0:
   2525             raise ValueError("argument should be at least 1 in _round")
   2526         if self._is_special or not self:
   2527             return Decimal(self)
   2528         ans = self._rescale(self.adjusted()+1-places, rounding)
   2529         # it can happen that the rescale alters the adjusted exponent;

   2530         # for example when rounding 99.97 to 3 significant figures.

   2531         # When this happens we end up with an extra 0 at the end of

   2532         # the number; a second rescale fixes this.

   2533         if ans.adjusted() != self.adjusted():
   2534             ans = ans._rescale(ans.adjusted()+1-places, rounding)
   2535         return ans
   2536 
   2537     def to_integral_exact(self, rounding=None, context=None):
   2538         """Rounds to a nearby integer.
   2539 
   2540         If no rounding mode is specified, take the rounding mode from
   2541         the context.  This method raises the Rounded and Inexact flags
   2542         when appropriate.
   2543 
   2544         See also: to_integral_value, which does exactly the same as
   2545         this method except that it doesn't raise Inexact or Rounded.
   2546         """
   2547         if self._is_special:
   2548             ans = self._check_nans(context=context)
   2549             if ans:
   2550                 return ans
   2551             return Decimal(self)
   2552         if self._exp >= 0:
   2553             return Decimal(self)
   2554         if not self:
   2555             return _dec_from_triple(self._sign, '0', 0)
   2556         if context is None:
   2557             context = getcontext()
   2558         if rounding is None:
   2559             rounding = context.rounding
   2560         ans = self._rescale(0, rounding)
   2561         if ans != self:
   2562             context._raise_error(Inexact)
   2563         context._raise_error(Rounded)
   2564         return ans
   2565 
   2566     def to_integral_value(self, rounding=None, context=None):
   2567         """Rounds to the nearest integer, without raising inexact, rounded."""
   2568         if context is None:
   2569             context = getcontext()
   2570         if rounding is None:
   2571             rounding = context.rounding
   2572         if self._is_special:
   2573             ans = self._check_nans(context=context)
   2574             if ans:
   2575                 return ans
   2576             return Decimal(self)
   2577         if self._exp >= 0:
   2578             return Decimal(self)
   2579         else:
   2580             return self._rescale(0, rounding)
   2581 
   2582     # the method name changed, but we provide also the old one, for compatibility

   2583     to_integral = to_integral_value
   2584 
   2585     def sqrt(self, context=None):
   2586         """Return the square root of self."""
   2587         if context is None:
   2588             context = getcontext()
   2589 
   2590         if self._is_special:
   2591             ans = self._check_nans(context=context)
   2592             if ans:
   2593                 return ans
   2594 
   2595             if self._isinfinity() and self._sign == 0:
   2596                 return Decimal(self)
   2597 
   2598         if not self:
   2599             # exponent = self._exp // 2.  sqrt(-0) = -0

   2600             ans = _dec_from_triple(self._sign, '0', self._exp // 2)
   2601             return ans._fix(context)
   2602 
   2603         if self._sign == 1:
   2604             return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
   2605 
   2606         # At this point self represents a positive number.  Let p be

   2607         # the desired precision and express self in the form c*100**e

   2608         # with c a positive real number and e an integer, c and e

   2609         # being chosen so that 100**(p-1) <= c < 100**p.  Then the

   2610         # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)

   2611         # <= sqrt(c) < 10**p, so the closest representable Decimal at

   2612         # precision p is n*10**e where n = round_half_even(sqrt(c)),

   2613         # the closest integer to sqrt(c) with the even integer chosen

   2614         # in the case of a tie.

   2615         #

   2616         # To ensure correct rounding in all cases, we use the

   2617         # following trick: we compute the square root to an extra

   2618         # place (precision p+1 instead of precision p), rounding down.

   2619         # Then, if the result is inexact and its last digit is 0 or 5,

   2620         # we increase the last digit to 1 or 6 respectively; if it's

   2621         # exact we leave the last digit alone.  Now the final round to

   2622         # p places (or fewer in the case of underflow) will round

   2623         # correctly and raise the appropriate flags.

   2624 
   2625         # use an extra digit of precision

   2626         prec = context.prec+1
   2627 
   2628         # write argument in the form c*100**e where e = self._exp//2

   2629         # is the 'ideal' exponent, to be used if the square root is

   2630         # exactly representable.  l is the number of 'digits' of c in

   2631         # base 100, so that 100**(l-1) <= c < 100**l.

   2632         op = _WorkRep(self)
   2633         e = op.exp >> 1
   2634         if op.exp & 1:
   2635             c = op.int * 10
   2636             l = (len(self._int) >> 1) + 1
   2637         else:
   2638             c = op.int
   2639             l = len(self._int)+1 >> 1
   2640 
   2641         # rescale so that c has exactly prec base 100 'digits'

   2642         shift = prec-l
   2643         if shift >= 0:
   2644             c *= 100**shift
   2645             exact = True
   2646         else:
   2647             c, remainder = divmod(c, 100**-shift)
   2648             exact = not remainder
   2649         e -= shift
   2650 
   2651         # find n = floor(sqrt(c)) using Newton's method

   2652         n = 10**prec
   2653         while True:
   2654             q = c//n
   2655             if n <= q:
   2656                 break
   2657             else:
   2658                 n = n + q >> 1
   2659         exact = exact and n*n == c
   2660 
   2661         if exact:
   2662             # result is exact; rescale to use ideal exponent e

   2663             if shift >= 0:
   2664                 # assert n % 10**shift == 0

   2665                 n //= 10**shift
   2666             else:
   2667                 n *= 10**-shift
   2668             e += shift
   2669         else:
   2670             # result is not exact; fix last digit as described above

   2671             if n % 5 == 0:
   2672                 n += 1
   2673 
   2674         ans = _dec_from_triple(0, str(n), e)
   2675 
   2676         # round, and fit to current context

   2677         context = context._shallow_copy()
   2678         rounding = context._set_rounding(ROUND_HALF_EVEN)
   2679         ans = ans._fix(context)
   2680         context.rounding = rounding
   2681 
   2682         return ans
   2683 
   2684     def max(self, other, context=None):
   2685         """Returns the larger value.
   2686 
   2687         Like max(self, other) except if one is not a number, returns
   2688         NaN (and signals if one is sNaN).  Also rounds.
   2689         """
   2690         other = _convert_other(other, raiseit=True)
   2691 
   2692         if context is None:
   2693             context = getcontext()
   2694 
   2695         if self._is_special or other._is_special:
   2696             # If one operand is a quiet NaN and the other is number, then the

   2697             # number is always returned

   2698             sn = self._isnan()
   2699             on = other._isnan()
   2700             if sn or on:
   2701                 if on == 1 and sn == 0:
   2702                     return self._fix(context)
   2703                 if sn == 1 and on == 0:
   2704                     return other._fix(context)
   2705                 return self._check_nans(other, context)
   2706 
   2707         c = self._cmp(other)
   2708         if c == 0:
   2709             # If both operands are finite and equal in numerical value

   2710             # then an ordering is applied:

   2711             #

   2712             # If the signs differ then max returns the operand with the

   2713             # positive sign and min returns the operand with the negative sign

   2714             #

   2715             # If the signs are the same then the exponent is used to select

   2716             # the result.  This is exactly the ordering used in compare_total.

   2717             c = self.compare_total(other)
   2718 
   2719         if c == -1:
   2720             ans = other
   2721         else:
   2722             ans = self
   2723 
   2724         return ans._fix(context)
   2725 
   2726     def min(self, other, context=None):
   2727         """Returns the smaller value.
   2728 
   2729         Like min(self, other) except if one is not a number, returns
   2730         NaN (and signals if one is sNaN).  Also rounds.
   2731         """
   2732         other = _convert_other(other, raiseit=True)
   2733 
   2734         if context is None:
   2735             context = getcontext()
   2736 
   2737         if self._is_special or other._is_special:
   2738             # If one operand is a quiet NaN and the other is number, then the

   2739             # number is always returned

   2740             sn = self._isnan()
   2741             on = other._isnan()
   2742             if sn or on:
   2743                 if on == 1 and sn == 0:
   2744                     return self._fix(context)
   2745                 if sn == 1 and on == 0:
   2746                     return other._fix(context)
   2747                 return self._check_nans(other, context)
   2748 
   2749         c = self._cmp(other)
   2750         if c == 0:
   2751             c = self.compare_total(other)
   2752 
   2753         if c == -1:
   2754             ans = self
   2755         else:
   2756             ans = other
   2757 
   2758         return ans._fix(context)
   2759 
   2760     def _isinteger(self):
   2761         """Returns whether self is an integer"""
   2762         if self._is_special:
   2763             return False
   2764         if self._exp >= 0:
   2765             return True
   2766         rest = self._int[self._exp:]
   2767         return rest == '0'*len(rest)
   2768 
   2769     def _iseven(self):
   2770         """Returns True if self is even.  Assumes self is an integer."""
   2771         if not self or self._exp > 0:
   2772             return True
   2773         return self._int[-1+self._exp] in '02468'
   2774 
   2775     def adjusted(self):
   2776         """Return the adjusted exponent of self"""
   2777         try:
   2778             return self._exp + len(self._int) - 1
   2779         # If NaN or Infinity, self._exp is string

   2780         except TypeError:
   2781             return 0
   2782 
   2783     def canonical(self, context=None):
   2784         """Returns the same Decimal object.
   2785 
   2786         As we do not have different encodings for the same number, the
   2787         received object already is in its canonical form.
   2788         """
   2789         return self
   2790 
   2791     def compare_signal(self, other, context=None):
   2792         """Compares self to the other operand numerically.
   2793 
   2794         It's pretty much like compare(), but all NaNs signal, with signaling
   2795         NaNs taking precedence over quiet NaNs.
   2796         """
   2797         other = _convert_other(other, raiseit = True)
   2798         ans = self._compare_check_nans(other, context)
   2799         if ans:
   2800             return ans
   2801         return self.compare(other, context=context)
   2802 
   2803     def compare_total(self, other):
   2804         """Compares self to other using the abstract representations.
   2805 
   2806         This is not like the standard compare, which use their numerical
   2807         value. Note that a total ordering is defined for all possible abstract
   2808         representations.
   2809         """
   2810         other = _convert_other(other, raiseit=True)
   2811 
   2812         # if one is negative and the other is positive, it's easy

   2813         if self._sign and not other._sign:
   2814             return _NegativeOne
   2815         if not self._sign and other._sign:
   2816             return _One
   2817         sign = self._sign
   2818 
   2819         # let's handle both NaN types

   2820         self_nan = self._isnan()
   2821         other_nan = other._isnan()
   2822         if self_nan or other_nan:
   2823             if self_nan == other_nan:
   2824                 # compare payloads as though they're integers

   2825                 self_key = len(self._int), self._int
   2826                 other_key = len(other._int), other._int
   2827                 if self_key < other_key:
   2828                     if sign:
   2829                         return _One
   2830                     else:
   2831                         return _NegativeOne
   2832                 if self_key > other_key:
   2833                     if sign:
   2834                         return _NegativeOne
   2835                     else:
   2836                         return _One
   2837                 return _Zero
   2838 
   2839             if sign:
   2840                 if self_nan == 1:
   2841                     return _NegativeOne
   2842                 if other_nan == 1:
   2843                     return _One
   2844                 if self_nan == 2:
   2845                     return _NegativeOne
   2846                 if other_nan == 2:
   2847                     return _One
   2848             else:
   2849                 if self_nan == 1:
   2850                     return _One
   2851                 if other_nan == 1:
   2852                     return _NegativeOne
   2853                 if self_nan == 2:
   2854                     return _One
   2855                 if other_nan == 2:
   2856                     return _NegativeOne
   2857 
   2858         if self < other:
   2859             return _NegativeOne
   2860         if self > other:
   2861             return _One
   2862 
   2863         if self._exp < other._exp:
   2864             if sign:
   2865                 return _One
   2866             else:
   2867                 return _NegativeOne
   2868         if self._exp > other._exp:
   2869             if sign:
   2870                 return _NegativeOne
   2871             else:
   2872                 return _One
   2873         return _Zero
   2874 
   2875 
   2876     def compare_total_mag(self, other):
   2877         """Compares self to other using abstract repr., ignoring sign.
   2878 
   2879         Like compare_total, but with operand's sign ignored and assumed to be 0.
   2880         """
   2881         other = _convert_other(other, raiseit=True)
   2882 
   2883         s = self.copy_abs()
   2884         o = other.copy_abs()
   2885         return s.compare_total(o)
   2886 
   2887     def copy_abs(self):
   2888         """Returns a copy with the sign set to 0. """
   2889         return _dec_from_triple(0, self._int, self._exp, self._is_special)
   2890 
   2891     def copy_negate(self):
   2892         """Returns a copy with the sign inverted."""
   2893         if self._sign:
   2894             return _dec_from_triple(0, self._int, self._exp, self._is_special)
   2895         else:
   2896             return _dec_from_triple(1, self._int, self._exp, self._is_special)
   2897 
   2898     def copy_sign(self, other):
   2899         """Returns self with the sign of other."""
   2900         other = _convert_other(other, raiseit=True)
   2901         return _dec_from_triple(other._sign, self._int,
   2902                                 self._exp, self._is_special)
   2903 
   2904     def exp(self, context=None):
   2905         """Returns e ** self."""
   2906 
   2907         if context is None:
   2908             context = getcontext()
   2909 
   2910         # exp(NaN) = NaN

   2911         ans = self._check_nans(context=context)
   2912         if ans:
   2913             return ans
   2914 
   2915         # exp(-Infinity) = 0

   2916         if self._isinfinity() == -1:
   2917             return _Zero
   2918 
   2919         # exp(0) = 1

   2920         if not self:
   2921             return _One
   2922 
   2923         # exp(Infinity) = Infinity

   2924         if self._isinfinity() == 1:
   2925             return Decimal(self)
   2926 
   2927         # the result is now guaranteed to be inexact (the true

   2928         # mathematical result is transcendental). There's no need to

   2929         # raise Rounded and Inexact here---they'll always be raised as

   2930         # a result of the call to _fix.

   2931         p = context.prec
   2932         adj = self.adjusted()
   2933 
   2934         # we only need to do any computation for quite a small range

   2935         # of adjusted exponents---for example, -29 <= adj <= 10 for

   2936         # the default context.  For smaller exponent the result is

   2937         # indistinguishable from 1 at the given precision, while for

   2938         # larger exponent the result either overflows or underflows.

   2939         if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
   2940             # overflow

   2941             ans = _dec_from_triple(0, '1', context.Emax+1)
   2942         elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
   2943             # underflow to 0

   2944             ans = _dec_from_triple(0, '1', context.Etiny()-1)
   2945         elif self._sign == 0 and adj < -p:
   2946             # p+1 digits; final round will raise correct flags

   2947             ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
   2948         elif self._sign == 1 and adj < -p-1:
   2949             # p+1 digits; final round will raise correct flags

   2950             ans = _dec_from_triple(0, '9'*(p+1), -p-1)
   2951         # general case

   2952         else:
   2953             op = _WorkRep(self)
   2954             c, e = op.int, op.exp
   2955             if op.sign == 1:
   2956                 c = -c
   2957 
   2958             # compute correctly rounded result: increase precision by

   2959             # 3 digits at a time until we get an unambiguously

   2960             # roundable result

   2961             extra = 3
   2962             while True:
   2963                 coeff, exp = _dexp(c, e, p+extra)
   2964                 if coeff % (5*10**(len(str(coeff))-p-1)):
   2965                     break
   2966                 extra += 3
   2967 
   2968             ans = _dec_from_triple(0, str(coeff), exp)
   2969 
   2970         # at this stage, ans should round correctly with *any*

   2971         # rounding mode, not just with ROUND_HALF_EVEN

   2972         context = context._shallow_copy()
   2973         rounding = context._set_rounding(ROUND_HALF_EVEN)
   2974         ans = ans._fix(context)
   2975         context.rounding = rounding
   2976 
   2977         return ans
   2978 
   2979     def is_canonical(self):
   2980         """Return True if self is canonical; otherwise return False.
   2981 
   2982         Currently, the encoding of a Decimal instance is always
   2983         canonical, so this method returns True for any Decimal.
   2984         """
   2985         return True
   2986 
   2987     def is_finite(self):
   2988         """Return True if self is finite; otherwise return False.
   2989 
   2990         A Decimal instance is considered finite if it is neither
   2991         infinite nor a NaN.
   2992         """
   2993         return not self._is_special
   2994 
   2995     def is_infinite(self):
   2996         """Return True if self is infinite; otherwise return False."""
   2997         return self._exp == 'F'
   2998 
   2999     def is_nan(self):
   3000         """Return True if self is a qNaN or sNaN; otherwise return False."""
   3001         return self._exp in ('n', 'N')
   3002 
   3003     def is_normal(self, context=None):
   3004         """Return True if self is a normal number; otherwise return False."""
   3005         if self._is_special or not self:
   3006             return False
   3007         if context is None:
   3008             context = getcontext()
   3009         return context.Emin <= self.adjusted()
   3010 
   3011     def is_qnan(self):
   3012         """Return True if self is a quiet NaN; otherwise return False."""
   3013         return self._exp == 'n'
   3014 
   3015     def is_signed(self):
   3016         """Return True if self is negative; otherwise return False."""
   3017         return self._sign == 1
   3018 
   3019     def is_snan(self):
   3020         """Return True if self is a signaling NaN; otherwise return False."""
   3021         return self._exp == 'N'
   3022 
   3023     def is_subnormal(self, context=None):
   3024         """Return True if self is subnormal; otherwise return False."""
   3025         if self._is_special or not self:
   3026             return False
   3027         if context is None:
   3028             context = getcontext()
   3029         return self.adjusted() < context.Emin
   3030 
   3031     def is_zero(self):
   3032         """Return True if self is a zero; otherwise return False."""
   3033         return not self._is_special and self._int == '0'
   3034 
   3035     def _ln_exp_bound(self):
   3036         """Compute a lower bound for the adjusted exponent of self.ln().
   3037         In other words, compute r such that self.ln() >= 10**r.  Assumes
   3038         that self is finite and positive and that self != 1.
   3039         """
   3040 
   3041         # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1

   3042         adj = self._exp + len(self._int) - 1
   3043         if adj >= 1:
   3044             # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)

   3045             return len(str(adj*23//10)) - 1
   3046         if adj <= -2:
   3047             # argument <= 0.1

   3048             return len(str((-1-adj)*23//10)) - 1
   3049         op = _WorkRep(self)
   3050         c, e = op.int, op.exp
   3051         if adj == 0:
   3052             # 1 < self < 10

   3053             num = str(c-10**-e)
   3054             den = str(c)
   3055             return len(num) - len(den) - (num < den)
   3056         # adj == -1, 0.1 <= self < 1

   3057         return e + len(str(10**-e - c)) - 1
   3058 
   3059 
   3060     def ln(self, context=None):
   3061         """Returns the natural (base e) logarithm of self."""
   3062 
   3063         if context is None:
   3064             context = getcontext()
   3065 
   3066         # ln(NaN) = NaN

   3067         ans = self._check_nans(context=context)
   3068         if ans:
   3069             return ans
   3070 
   3071         # ln(0.0) == -Infinity

   3072         if not self:
   3073             return _NegativeInfinity
   3074 
   3075         # ln(Infinity) = Infinity

   3076         if self._isinfinity() == 1:
   3077             return _Infinity
   3078 
   3079         # ln(1.0) == 0.0

   3080         if self == _One:
   3081             return _Zero
   3082 
   3083         # ln(negative) raises InvalidOperation

   3084         if self._sign == 1:
   3085             return context._raise_error(InvalidOperation,
   3086                                         'ln of a negative value')
   3087 
   3088         # result is irrational, so necessarily inexact

   3089         op = _WorkRep(self)
   3090         c, e = op.int, op.exp
   3091         p = context.prec
   3092 
   3093         # correctly rounded result: repeatedly increase precision by 3

   3094         # until we get an unambiguously roundable result

   3095         places = p - self._ln_exp_bound() + 2 # at least p+3 places

   3096         while True:
   3097             coeff = _dlog(c, e, places)
   3098             # assert len(str(abs(coeff)))-p >= 1

   3099             if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
   3100                 break
   3101             places += 3
   3102         ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
   3103 
   3104         context = context._shallow_copy()
   3105         rounding = context._set_rounding(ROUND_HALF_EVEN)
   3106         ans = ans._fix(context)
   3107         context.rounding = rounding
   3108         return ans
   3109 
   3110     def _log10_exp_bound(self):
   3111         """Compute a lower bound for the adjusted exponent of self.log10().
   3112         In other words, find r such that self.log10() >= 10**r.
   3113         Assumes that self is finite and positive and that self != 1.
   3114         """
   3115 
   3116         # For x >= 10 or x < 0.1 we only need a bound on the integer

   3117         # part of log10(self), and this comes directly from the

   3118         # exponent of x.  For 0.1 <= x <= 10 we use the inequalities

   3119         # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >

   3120         # (1-1/x)/2.31 > 0.  If x < 1 then |log10(x)| > (1-x)/2.31 > 0

   3121 
   3122         adj = self._exp + len(self._int) - 1
   3123         if adj >= 1:
   3124             # self >= 10

   3125             return len(str(adj))-1
   3126         if adj <= -2:
   3127             # self < 0.1

   3128             return len(str(-1-adj))-1
   3129         op = _WorkRep(self)
   3130         c, e = op.int, op.exp
   3131         if adj == 0:
   3132             # 1 < self < 10

   3133             num = str(c-10**-e)
   3134             den = str(231*c)
   3135             return len(num) - len(den) - (num < den) + 2
   3136         # adj == -1, 0.1 <= self < 1

   3137         num = str(10**-e-c)
   3138         return len(num) + e - (num < "231") - 1
   3139 
   3140     def log10(self, context=None):
   3141         """Returns the base 10 logarithm of self."""
   3142 
   3143         if context is None:
   3144             context = getcontext()
   3145 
   3146         # log10(NaN) = NaN

   3147         ans = self._check_nans(context=context)
   3148         if ans:
   3149             return ans
   3150 
   3151         # log10(0.0) == -Infinity

   3152         if not self:
   3153             return _NegativeInfinity
   3154 
   3155         # log10(Infinity) = Infinity

   3156         if self._isinfinity() == 1:
   3157             return _Infinity
   3158 
   3159         # log10(negative or -Infinity) raises InvalidOperation

   3160         if self._sign == 1:
   3161             return context._raise_error(InvalidOperation,
   3162                                         'log10 of a negative value')
   3163 
   3164         # log10(10**n) = n

   3165         if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
   3166             # answer may need rounding

   3167             ans = Decimal(self._exp + len(self._int) - 1)
   3168         else:
   3169             # result is irrational, so necessarily inexact

   3170             op = _WorkRep(self)
   3171             c, e = op.int, op.exp
   3172             p = context.prec
   3173 
   3174             # correctly rounded result: repeatedly increase precision

   3175             # until result is unambiguously roundable

   3176             places = p-self._log10_exp_bound()+2
   3177             while True:
   3178                 coeff = _dlog10(c, e, places)
   3179                 # assert len(str(abs(coeff)))-p >= 1

   3180                 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
   3181                     break
   3182                 places += 3
   3183             ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
   3184 
   3185         context = context._shallow_copy()
   3186         rounding = context._set_rounding(ROUND_HALF_EVEN)
   3187         ans = ans._fix(context)
   3188         context.rounding = rounding
   3189         return ans
   3190 
   3191     def logb(self, context=None):
   3192         """ Returns the exponent of the magnitude of self's MSD.
   3193 
   3194         The result is the integer which is the exponent of the magnitude
   3195         of the most significant digit of self (as though it were truncated
   3196         to a single digit while maintaining the value of that digit and
   3197         without limiting the resulting exponent).
   3198         """
   3199         # logb(NaN) = NaN

   3200         ans = self._check_nans(context=context)
   3201         if ans:
   3202             return ans
   3203 
   3204         if context is None:
   3205             context = getcontext()
   3206 
   3207         # logb(+/-Inf) = +Inf

   3208         if self._isinfinity():
   3209             return _Infinity
   3210 
   3211         # logb(0) = -Inf, DivisionByZero

   3212         if not self:
   3213             return context._raise_error(DivisionByZero, 'logb(0)', 1)
   3214 
   3215         # otherwise, simply return the adjusted exponent of self, as a

   3216         # Decimal.  Note that no attempt is made to fit the result

   3217         # into the current context.

   3218         ans = Decimal(self.adjusted())
   3219         return ans._fix(context)
   3220 
   3221     def _islogical(self):
   3222         """Return True if self is a logical operand.
   3223 
   3224         For being logical, it must be a finite number with a sign of 0,
   3225         an exponent of 0, and a coefficient whose digits must all be
   3226         either 0 or 1.
   3227         """
   3228         if self._sign != 0 or self._exp != 0:
   3229             return False
   3230         for dig in self._int:
   3231             if dig not in '01':
   3232                 return False
   3233         return True
   3234 
   3235     def _fill_logical(self, context, opa, opb):
   3236         dif = context.prec - len(opa)
   3237         if dif > 0:
   3238             opa = '0'*dif + opa
   3239         elif dif < 0:
   3240             opa = opa[-context.prec:]
   3241         dif = context.prec - len(opb)
   3242         if dif > 0:
   3243             opb = '0'*dif + opb
   3244         elif dif < 0:
   3245             opb = opb[-context.prec:]
   3246         return opa, opb
   3247 
   3248     def logical_and(self, other, context=None):
   3249         """Applies an 'and' operation between self and other's digits."""
   3250         if context is None:
   3251             context = getcontext()
   3252 
   3253         other = _convert_other(other, raiseit=True)
   3254 
   3255         if not self._islogical() or not other._islogical():
   3256             return context._raise_error(InvalidOperation)
   3257 
   3258         # fill to context.prec

   3259         (opa, opb) = self._fill_logical(context, self._int, other._int)
   3260 
   3261         # make the operation, and clean starting zeroes

   3262         result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
   3263         return _dec_from_triple(0, result.lstrip('0') or '0', 0)
   3264 
   3265     def logical_invert(self, context=None):
   3266         """Invert all its digits."""
   3267         if context is None:
   3268             context = getcontext()
   3269         return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
   3270                                 context)
   3271 
   3272     def logical_or(self, other, context=None):
   3273         """Applies an 'or' operation between self and other's digits."""
   3274         if context is None:
   3275             context = getcontext()
   3276 
   3277         other = _convert_other(other, raiseit=True)
   3278 
   3279         if not self._islogical() or not other._islogical():
   3280             return context._raise_error(InvalidOperation)
   3281 
   3282         # fill to context.prec

   3283         (opa, opb) = self._fill_logical(context, self._int, other._int)
   3284 
   3285         # make the operation, and clean starting zeroes

   3286         result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)])
   3287         return _dec_from_triple(0, result.lstrip('0') or '0', 0)
   3288 
   3289     def logical_xor(self, other, context=None):
   3290         """Applies an 'xor' operation between self and other's digits."""
   3291         if context is None:
   3292             context = getcontext()
   3293 
   3294         other = _convert_other(other, raiseit=True)
   3295 
   3296         if not self._islogical() or not other._islogical():
   3297             return context._raise_error(InvalidOperation)
   3298 
   3299         # fill to context.prec

   3300         (opa, opb) = self._fill_logical(context, self._int, other._int)
   3301 
   3302         # make the operation, and clean starting zeroes

   3303         result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)])
   3304         return _dec_from_triple(0, result.lstrip('0') or '0', 0)
   3305 
   3306     def max_mag(self, other, context=None):
   3307         """Compares the values numerically with their sign ignored."""
   3308         other = _convert_other(other, raiseit=True)
   3309 
   3310         if context is None:
   3311             context = getcontext()
   3312 
   3313         if self._is_special or other._is_special:
   3314             # If one operand is a quiet NaN and the other is number, then the

   3315             # number is always returned

   3316             sn = self._isnan()
   3317             on = other._isnan()
   3318             if sn or on:
   3319                 if on == 1 and sn == 0:
   3320                     return self._fix(context)
   3321                 if sn == 1 and on == 0:
   3322                     return other._fix(context)
   3323                 return self._check_nans(other, context)
   3324 
   3325         c = self.copy_abs()._cmp(other.copy_abs())
   3326         if c == 0:
   3327             c = self.compare_total(other)
   3328 
   3329         if c == -1:
   3330             ans = other
   3331         else:
   3332             ans = self
   3333 
   3334         return ans._fix(context)
   3335 
   3336     def min_mag(self, other, context=None):
   3337         """Compares the values numerically with their sign ignored."""
   3338         other = _convert_other(other, raiseit=True)
   3339 
   3340         if context is None:
   3341             context = getcontext()
   3342 
   3343         if self._is_special or other._is_special:
   3344             # If one operand is a quiet NaN and the other is number, then the

   3345             # number is always returned

   3346             sn = self._isnan()
   3347             on = other._isnan()
   3348             if sn or on:
   3349                 if on == 1 and sn == 0:
   3350                     return self._fix(context)
   3351                 if sn == 1 and on == 0:
   3352                     return other._fix(context)
   3353                 return self._check_nans(other, context)
   3354 
   3355         c = self.copy_abs()._cmp(other.copy_abs())
   3356         if c == 0:
   3357             c = self.compare_total(other)
   3358 
   3359         if c == -1:
   3360             ans = self
   3361         else:
   3362             ans = other
   3363 
   3364         return ans._fix(context)
   3365 
   3366     def next_minus(self, context=None):
   3367         """Returns the largest representable number smaller than itself."""
   3368         if context is None:
   3369             context = getcontext()
   3370 
   3371         ans = self._check_nans(context=context)
   3372         if ans:
   3373             return ans
   3374 
   3375         if self._isinfinity() == -1:
   3376             return _NegativeInfinity
   3377         if self._isinfinity() == 1:
   3378             return _dec_from_triple(0, '9'*context.prec, context.Etop())
   3379 
   3380         context = context.copy()
   3381         context._set_rounding(ROUND_FLOOR)
   3382         context._ignore_all_flags()
   3383         new_self = self._fix(context)
   3384         if new_self != self:
   3385             return new_self
   3386         return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
   3387                             context)
   3388 
   3389     def next_plus(self, context=None):
   3390         """Returns the smallest representable number larger than itself."""
   3391         if context is None:
   3392             context = getcontext()
   3393 
   3394         ans = self._check_nans(context=context)
   3395         if ans:
   3396             return ans
   3397 
   3398         if self._isinfinity() == 1:
   3399             return _Infinity
   3400         if self._isinfinity() == -1:
   3401             return _dec_from_triple(1, '9'*context.prec, context.Etop())
   3402 
   3403         context = context.copy()
   3404         context._set_rounding(ROUND_CEILING)
   3405         context._ignore_all_flags()
   3406         new_self = self._fix(context)
   3407         if new_self != self:
   3408             return new_self
   3409         return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
   3410                             context)
   3411 
   3412     def next_toward(self, other, context=None):
   3413         """Returns the number closest to self, in the direction towards other.
   3414 
   3415         The result is the closest representable number to self
   3416         (excluding self) that is in the direction towards other,
   3417         unless both have the same value.  If the two operands are
   3418         numerically equal, then the result is a copy of self with the
   3419         sign set to be the same as the sign of other.
   3420         """
   3421         other = _convert_other(other, raiseit=True)
   3422 
   3423         if context is None:
   3424             context = getcontext()
   3425 
   3426         ans = self._check_nans(other, context)
   3427         if ans:
   3428             return ans
   3429 
   3430         comparison = self._cmp(other)
   3431         if comparison == 0:
   3432             return self.copy_sign(other)
   3433 
   3434         if comparison == -1:
   3435             ans = self.next_plus(context)
   3436         else: # comparison == 1

   3437             ans = self.next_minus(context)
   3438 
   3439         # decide which flags to raise using value of ans

   3440         if ans._isinfinity():
   3441             context._raise_error(Overflow,
   3442                                  'Infinite result from next_toward',
   3443                                  ans._sign)
   3444             context._raise_error(Inexact)
   3445             context._raise_error(Rounded)
   3446         elif ans.adjusted() < context.Emin:
   3447             context._raise_error(Underflow)
   3448             context._raise_error(Subnormal)
   3449             context._raise_error(Inexact)
   3450             context._raise_error(Rounded)
   3451             # if precision == 1 then we don't raise Clamped for a

   3452             # result 0E-Etiny.

   3453             if not ans:
   3454                 context._raise_error(Clamped)
   3455 
   3456         return ans
   3457 
   3458     def number_class(self, context=None):
   3459         """Returns an indication of the class of self.
   3460 
   3461         The class is one of the following strings:
   3462           sNaN
   3463           NaN
   3464           -Infinity
   3465           -Normal
   3466           -Subnormal
   3467           -Zero
   3468           +Zero
   3469           +Subnormal
   3470           +Normal
   3471           +Infinity
   3472         """
   3473         if self.is_snan():
   3474             return "sNaN"
   3475         if self.is_qnan():
   3476             return "NaN"
   3477         inf = self._isinfinity()
   3478         if inf == 1:
   3479             return "+Infinity"
   3480         if inf == -1:
   3481             return "-Infinity"
   3482         if self.is_zero():
   3483             if self._sign:
   3484                 return "-Zero"
   3485             else:
   3486                 return "+Zero"
   3487         if context is None:
   3488             context = getcontext()
   3489         if self.is_subnormal(context=context):
   3490             if self._sign:
   3491                 return "-Subnormal"
   3492             else:
   3493                 return "+Subnormal"
   3494         # just a normal, regular, boring number, :)

   3495         if self._sign:
   3496             return "-Normal"
   3497         else:
   3498             return "+Normal"
   3499 
   3500     def radix(self):
   3501         """Just returns 10, as this is Decimal, :)"""
   3502         return Decimal(10)
   3503 
   3504     def rotate(self, other, context=None):
   3505         """Returns a rotated copy of self, value-of-other times."""
   3506         if context is None:
   3507             context = getcontext()
   3508 
   3509         other = _convert_other(other, raiseit=True)
   3510 
   3511         ans = self._check_nans(other, context)
   3512         if ans:
   3513             return ans
   3514 
   3515         if other._exp != 0:
   3516             return context._raise_error(InvalidOperation)
   3517         if not (-context.prec <= int(other) <= context.prec):
   3518             return context._raise_error(InvalidOperation)
   3519 
   3520         if self._isinfinity():
   3521             return Decimal(self)
   3522 
   3523         # get values, pad if necessary

   3524         torot = int(other)
   3525         rotdig = self._int
   3526         topad = context.prec - len(rotdig)
   3527         if topad > 0:
   3528             rotdig = '0'*topad + rotdig
   3529         elif topad < 0:
   3530             rotdig = rotdig[-topad:]
   3531 
   3532         # let's rotate!

   3533         rotated = rotdig[torot:] + rotdig[:torot]
   3534         return _dec_from_triple(self._sign,
   3535                                 rotated.lstrip('0') or '0', self._exp)
   3536 
   3537     def scaleb(self, other, context=None):
   3538         """Returns self operand after adding the second value to its exp."""
   3539         if context is None:
   3540             context = getcontext()
   3541 
   3542         other = _convert_other(other, raiseit=True)
   3543 
   3544         ans = self._check_nans(other, context)
   3545         if ans:
   3546             return ans
   3547 
   3548         if other._exp != 0:
   3549             return context._raise_error(InvalidOperation)
   3550         liminf = -2 * (context.Emax + context.prec)
   3551         limsup =  2 * (context.Emax + context.prec)
   3552         if not (liminf <= int(other) <= limsup):
   3553             return context._raise_error(InvalidOperation)
   3554 
   3555         if self._isinfinity():
   3556             return Decimal(self)
   3557 
   3558         d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
   3559         d = d._fix(context)
   3560         return d
   3561 
   3562     def shift(self, other, context=None):
   3563         """Returns a shifted copy of self, value-of-other times."""
   3564         if context is None:
   3565             context = getcontext()
   3566 
   3567         other = _convert_other(other, raiseit=True)
   3568 
   3569         ans = self._check_nans(other, context)
   3570         if ans:
   3571             return ans
   3572 
   3573         if other._exp != 0:
   3574             return context._raise_error(InvalidOperation)
   3575         if not (-context.prec <= int(other) <= context.prec):
   3576             return context._raise_error(InvalidOperation)
   3577 
   3578         if self._isinfinity():
   3579             return Decimal(self)
   3580 
   3581         # get values, pad if necessary

   3582         torot = int(other)
   3583         rotdig = self._int
   3584         topad = context.prec - len(rotdig)
   3585         if topad > 0:
   3586             rotdig = '0'*topad + rotdig
   3587         elif topad < 0:
   3588             rotdig = rotdig[-topad:]
   3589 
   3590         # let's shift!

   3591         if torot < 0:
   3592             shifted = rotdig[:torot]
   3593         else:
   3594             shifted = rotdig + '0'*torot
   3595             shifted = shifted[-context.prec:]
   3596 
   3597         return _dec_from_triple(self._sign,
   3598                                     shifted.lstrip('0') or '0', self._exp)
   3599 
   3600     # Support for pickling, copy, and deepcopy

   3601     def __reduce__(self):
   3602         return (self.__class__, (str(self),))
   3603 
   3604     def __copy__(self):
   3605         if type(self) is Decimal:
   3606             return self     # I'm immutable; therefore I am my own clone

   3607         return self.__class__(str(self))
   3608 
   3609     def __deepcopy__(self, memo):
   3610         if type(self) is Decimal:
   3611             return self     # My components are also immutable

   3612         return self.__class__(str(self))
   3613 
   3614     # PEP 3101 support.  the _localeconv keyword argument should be

   3615     # considered private: it's provided for ease of testing only.

   3616     def __format__(self, specifier, context=None, _localeconv=None):
   3617         """Format a Decimal instance according to the given specifier.
   3618 
   3619         The specifier should be a standard format specifier, with the
   3620         form described in PEP 3101.  Formatting types 'e', 'E', 'f',
   3621         'F', 'g', 'G', 'n' and '%' are supported.  If the formatting
   3622         type is omitted it defaults to 'g' or 'G', depending on the
   3623         value of context.capitals.
   3624         """
   3625 
   3626         # Note: PEP 3101 says that if the type is not present then

   3627         # there should be at least one digit after the decimal point.

   3628         # We take the liberty of ignoring this requirement for

   3629         # Decimal---it's presumably there to make sure that

   3630         # format(float, '') behaves similarly to str(float).

   3631         if context is None:
   3632             context = getcontext()
   3633 
   3634         spec = _parse_format_specifier(specifier, _localeconv=_localeconv)
   3635 
   3636         # special values don't care about the type or precision

   3637         if self._is_special:
   3638             sign = _format_sign(self._sign, spec)
   3639             body = str(self.copy_abs())
   3640             return _format_align(sign, body, spec)
   3641 
   3642         # a type of None defaults to 'g' or 'G', depending on context

   3643         if spec['type'] is None:
   3644             spec['type'] = ['g', 'G'][context.capitals]
   3645 
   3646         # if type is '%', adjust exponent of self accordingly

   3647         if spec['type'] == '%':
   3648             self = _dec_from_triple(self._sign, self._int, self._exp+2)
   3649 
   3650         # round if necessary, taking rounding mode from the context

   3651         rounding = context.rounding
   3652         precision = spec['precision']
   3653         if precision is not None:
   3654             if spec['type'] in 'eE':
   3655                 self = self._round(precision+1, rounding)
   3656             elif spec['type'] in 'fF%':
   3657                 self = self._rescale(-precision, rounding)
   3658             elif spec['type'] in 'gG' and len(self._int) > precision:
   3659                 self = self._round(precision, rounding)
   3660         # special case: zeros with a positive exponent can't be

   3661         # represented in fixed point; rescale them to 0e0.

   3662         if not self and self._exp > 0 and spec['type'] in 'fF%':
   3663             self = self._rescale(0, rounding)
   3664 
   3665         # figure out placement of the decimal point

   3666         leftdigits = self._exp + len(self._int)
   3667         if spec['type'] in 'eE':
   3668             if not self and precision is not None:
   3669                 dotplace = 1 - precision
   3670             else:
   3671                 dotplace = 1
   3672         elif spec['type'] in 'fF%':
   3673             dotplace = leftdigits
   3674         elif spec['type'] in 'gG':
   3675             if self._exp <= 0 and leftdigits > -6:
   3676                 dotplace = leftdigits
   3677             else:
   3678                 dotplace = 1
   3679 
   3680         # find digits before and after decimal point, and get exponent

   3681         if dotplace < 0:
   3682             intpart = '0'
   3683             fracpart = '0'*(-dotplace) + self._int
   3684         elif dotplace > len(self._int):
   3685             intpart = self._int + '0'*(dotplace-len(self._int))
   3686             fracpart = ''
   3687         else:
   3688             intpart = self._int[:dotplace] or '0'
   3689             fracpart = self._int[dotplace:]
   3690         exp = leftdigits-dotplace
   3691 
   3692         # done with the decimal-specific stuff;  hand over the rest

   3693         # of the formatting to the _format_number function

   3694         return _format_number(self._sign, intpart, fracpart, exp, spec)
   3695 
   3696 def _dec_from_triple(sign, coefficient, exponent, special=False):
   3697     """Create a decimal instance directly, without any validation,
   3698     normalization (e.g. removal of leading zeros) or argument
   3699     conversion.
   3700 
   3701     This function is for *internal use only*.
   3702     """
   3703 
   3704     self = object.__new__(Decimal)
   3705     self._sign = sign
   3706     self._int = coefficient
   3707     self._exp = exponent
   3708     self._is_special = special
   3709 
   3710     return self
   3711 
   3712 # Register Decimal as a kind of Number (an abstract base class).

   3713 # However, do not register it as Real (because Decimals are not

   3714 # interoperable with floats).

   3715 _numbers.Number.register(Decimal)
   3716 
   3717 
   3718 ##### Context class #######################################################

   3719 
   3720 class _ContextManager(object):
   3721     """Context manager class to support localcontext().
   3722 
   3723       Sets a copy of the supplied context in __enter__() and restores
   3724       the previous decimal context in __exit__()
   3725     """
   3726     def __init__(self, new_context):
   3727         self.new_context = new_context.copy()
   3728     def __enter__(self):
   3729         self.saved_context = getcontext()
   3730         setcontext(self.new_context)
   3731         return self.new_context
   3732     def __exit__(self, t, v, tb):
   3733         setcontext(self.saved_context)
   3734 
   3735 class Context(object):
   3736     """Contains the context for a Decimal instance.
   3737 
   3738     Contains:
   3739     prec - precision (for use in rounding, division, square roots..)
   3740     rounding - rounding type (how you round)
   3741     traps - If traps[exception] = 1, then the exception is
   3742                     raised when it is caused.  Otherwise, a value is
   3743                     substituted in.
   3744     flags  - When an exception is caused, flags[exception] is set.
   3745              (Whether or not the trap_enabler is set)
   3746              Should be reset by user of Decimal instance.
   3747     Emin -   Minimum exponent
   3748     Emax -   Maximum exponent
   3749     capitals -      If 1, 1*10^1 is printed as 1E+1.
   3750                     If 0, printed as 1e1
   3751     _clamp - If 1, change exponents if too high (Default 0)
   3752     """
   3753 
   3754     def __init__(self, prec=None, rounding=None,
   3755                  traps=None, flags=None,
   3756                  Emin=None, Emax=None,
   3757                  capitals=None, _clamp=0,
   3758                  _ignored_flags=None):
   3759         # Set defaults; for everything except flags and _ignored_flags,

   3760         # inherit from DefaultContext.

   3761         try:
   3762             dc = DefaultContext
   3763         except NameError:
   3764             pass
   3765 
   3766         self.prec = prec if prec is not None else dc.prec
   3767         self.rounding = rounding if rounding is not None else dc.rounding
   3768         self.Emin = Emin if Emin is not None else dc.Emin
   3769         self.Emax = Emax if Emax is not None else dc.Emax
   3770         self.capitals = capitals if capitals is not None else dc.capitals
   3771         self._clamp = _clamp if _clamp is not None else dc._clamp
   3772 
   3773         if _ignored_flags is None:
   3774             self._ignored_flags = []
   3775         else:
   3776             self._ignored_flags = _ignored_flags
   3777 
   3778         if traps is None:
   3779             self.traps = dc.traps.copy()
   3780         elif not isinstance(traps, dict):
   3781             self.traps = dict((s, int(s in traps)) for s in _signals)
   3782         else:
   3783             self.traps = traps
   3784 
   3785         if flags is None:
   3786             self.flags = dict.fromkeys(_signals, 0)
   3787         elif not isinstance(flags, dict):
   3788             self.flags = dict((s, int(s in flags)) for s in _signals)
   3789         else:
   3790             self.flags = flags
   3791 
   3792     def __repr__(self):
   3793         """Show the current context."""
   3794         s = []
   3795         s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
   3796                  'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
   3797                  % vars(self))
   3798         names = [f.__name__ for f, v in self.flags.items() if v]
   3799         s.append('flags=[' + ', '.join(names) + ']')
   3800         names = [t.__name__ for t, v in self.traps.items() if v]
   3801         s.append('traps=[' + ', '.join(names) + ']')
   3802         return ', '.join(s) + ')'
   3803 
   3804     def clear_flags(self):
   3805         """Reset all flags to zero"""
   3806         for flag in self.flags:
   3807             self.flags[flag] = 0
   3808 
   3809     def _shallow_copy(self):
   3810         """Returns a shallow copy from self."""
   3811         nc = Context(self.prec, self.rounding, self.traps,
   3812                      self.flags, self.Emin, self.Emax,
   3813                      self.capitals, self._clamp, self._ignored_flags)
   3814         return nc
   3815 
   3816     def copy(self):
   3817         """Returns a deep copy from self."""
   3818         nc = Context(self.prec, self.rounding, self.traps.copy(),
   3819                      self.flags.copy(), self.Emin, self.Emax,
   3820                      self.capitals, self._clamp, self._ignored_flags)
   3821         return nc
   3822     __copy__ = copy
   3823 
   3824     def _raise_error(self, condition, explanation = None, *args):
   3825         """Handles an error
   3826 
   3827         If the flag is in _ignored_flags, returns the default response.
   3828         Otherwise, it sets the flag, then, if the corresponding
   3829         trap_enabler is set, it reraises the exception.  Otherwise, it returns
   3830         the default value after setting the flag.
   3831         """
   3832         error = _condition_map.get(condition, condition)
   3833         if error in self._ignored_flags:
   3834             # Don't touch the flag

   3835             return error().handle(self, *args)
   3836 
   3837         self.flags[error] = 1
   3838         if not self.traps[error]:
   3839             # The errors define how to handle themselves.

   3840             return condition().handle(self, *args)
   3841 
   3842         # Errors should only be risked on copies of the context

   3843         # self._ignored_flags = []

   3844         raise error(explanation)
   3845 
   3846     def _ignore_all_flags(self):
   3847         """Ignore all flags, if they are raised"""
   3848         return self._ignore_flags(*_signals)
   3849 
   3850     def _ignore_flags(self, *flags):
   3851         """Ignore the flags, if they are raised"""
   3852         # Do not mutate-- This way, copies of a context leave the original

   3853         # alone.

   3854         self._ignored_flags = (self._ignored_flags + list(flags))
   3855         return list(flags)
   3856 
   3857     def _regard_flags(self, *flags):
   3858         """Stop ignoring the flags, if they are raised"""
   3859         if flags and isinstance(flags[0], (tuple,list)):
   3860             flags = flags[0]
   3861         for flag in flags:
   3862             self._ignored_flags.remove(flag)
   3863 
   3864     # We inherit object.__hash__, so we must deny this explicitly

   3865     __hash__ = None
   3866 
   3867     def Etiny(self):
   3868         """Returns Etiny (= Emin - prec + 1)"""
   3869         return int(self.Emin - self.prec + 1)
   3870 
   3871     def Etop(self):
   3872         """Returns maximum exponent (= Emax - prec + 1)"""
   3873         return int(self.Emax - self.prec + 1)
   3874 
   3875     def _set_rounding(self, type):
   3876         """Sets the rounding type.
   3877 
   3878         Sets the rounding type, and returns the current (previous)
   3879         rounding type.  Often used like:
   3880 
   3881         context = context.copy()
   3882         # so you don't change the calling context
   3883         # if an error occurs in the middle.
   3884         rounding = context._set_rounding(ROUND_UP)
   3885         val = self.__sub__(other, context=context)
   3886         context._set_rounding(rounding)
   3887 
   3888         This will make it round up for that operation.
   3889         """
   3890         rounding = self.rounding
   3891         self.rounding= type
   3892         return rounding
   3893 
   3894     def create_decimal(self, num='0'):
   3895         """Creates a new Decimal instance but using self as context.
   3896 
   3897         This method implements the to-number operation of the
   3898         IBM Decimal specification."""
   3899 
   3900         if isinstance(num, basestring) and num != num.strip():
   3901             return self._raise_error(ConversionSyntax,
   3902                                      "no trailing or leading whitespace is "
   3903                                      "permitted.")
   3904 
   3905         d = Decimal(num, context=self)
   3906         if d._isnan() and len(d._int) > self.prec - self._clamp:
   3907             return self._raise_error(ConversionSyntax,
   3908                                      "diagnostic info too long in NaN")
   3909         return d._fix(self)
   3910 
   3911     def create_decimal_from_float(self, f):
   3912         """Creates a new Decimal instance from a float but rounding using self
   3913         as the context.
   3914 
   3915         >>> context = Context(prec=5, rounding=ROUND_DOWN)
   3916         >>> context.create_decimal_from_float(3.1415926535897932)
   3917         Decimal('3.1415')
   3918         >>> context = Context(prec=5, traps=[Inexact])
   3919         >>> context.create_decimal_from_float(3.1415926535897932)
   3920         Traceback (most recent call last):
   3921             ...
   3922         Inexact: None
   3923 
   3924         """
   3925         d = Decimal.from_float(f)       # An exact conversion

   3926         return d._fix(self)             # Apply the context rounding

   3927 
   3928     # Methods

   3929     def abs(self, a):
   3930         """Returns the absolute value of the operand.
   3931 
   3932         If the operand is negative, the result is the same as using the minus
   3933         operation on the operand.  Otherwise, the result is the same as using
   3934         the plus operation on the operand.
   3935 
   3936         >>> ExtendedContext.abs(Decimal('2.1'))
   3937         Decimal('2.1')
   3938         >>> ExtendedContext.abs(Decimal('-100'))
   3939         Decimal('100')
   3940         >>> ExtendedContext.abs(Decimal('101.5'))
   3941         Decimal('101.5')
   3942         >>> ExtendedContext.abs(Decimal('-101.5'))
   3943         Decimal('101.5')
   3944         >>> ExtendedContext.abs(-1)
   3945         Decimal('1')
   3946         """
   3947         a = _convert_other(a, raiseit=True)
   3948         return a.__abs__(context=self)
   3949 
   3950     def add(self, a, b):
   3951         """Return the sum of the two operands.
   3952 
   3953         >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
   3954         Decimal('19.00')
   3955         >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
   3956         Decimal('1.02E+4')
   3957         >>> ExtendedContext.add(1, Decimal(2))
   3958         Decimal('3')
   3959         >>> ExtendedContext.add(Decimal(8), 5)
   3960         Decimal('13')
   3961         >>> ExtendedContext.add(5, 5)
   3962         Decimal('10')
   3963         """
   3964         a = _convert_other(a, raiseit=True)
   3965         r = a.__add__(b, context=self)
   3966         if r is NotImplemented:
   3967             raise TypeError("Unable to convert %s to Decimal" % b)
   3968         else:
   3969             return r
   3970 
   3971     def _apply(self, a):
   3972         return str(a._fix(self))
   3973 
   3974     def canonical(self, a):
   3975         """Returns the same Decimal object.
   3976 
   3977         As we do not have different encodings for the same number, the
   3978         received object already is in its canonical form.
   3979 
   3980         >>> ExtendedContext.canonical(Decimal('2.50'))
   3981         Decimal('2.50')
   3982         """
   3983         return a.canonical(context=self)
   3984 
   3985     def compare(self, a, b):
   3986         """Compares values numerically.
   3987 
   3988         If the signs of the operands differ, a value representing each operand
   3989         ('-1' if the operand is less than zero, '0' if the operand is zero or
   3990         negative zero, or '1' if the operand is greater than zero) is used in
   3991         place of that operand for the comparison instead of the actual
   3992         operand.
   3993 
   3994         The comparison is then effected by subtracting the second operand from
   3995         the first and then returning a value according to the result of the
   3996         subtraction: '-1' if the result is less than zero, '0' if the result is
   3997         zero or negative zero, or '1' if the result is greater than zero.
   3998 
   3999         >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
   4000         Decimal('-1')
   4001         >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
   4002         Decimal('0')
   4003         >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
   4004         Decimal('0')
   4005         >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
   4006         Decimal('1')
   4007         >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
   4008         Decimal('1')
   4009         >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
   4010         Decimal('-1')
   4011         >>> ExtendedContext.compare(1, 2)
   4012         Decimal('-1')
   4013         >>> ExtendedContext.compare(Decimal(1), 2)
   4014         Decimal('-1')
   4015         >>> ExtendedContext.compare(1, Decimal(2))
   4016         Decimal('-1')
   4017         """
   4018         a = _convert_other(a, raiseit=True)
   4019         return a.compare(b, context=self)
   4020 
   4021     def compare_signal(self, a, b):
   4022         """Compares the values of the two operands numerically.
   4023 
   4024         It's pretty much like compare(), but all NaNs signal, with signaling
   4025         NaNs taking precedence over quiet NaNs.
   4026 
   4027         >>> c = ExtendedContext
   4028         >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
   4029         Decimal('-1')
   4030         >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
   4031         Decimal('0')
   4032         >>> c.flags[InvalidOperation] = 0
   4033         >>> print c.flags[InvalidOperation]
   4034         0
   4035         >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
   4036         Decimal('NaN')
   4037         >>> print c.flags[InvalidOperation]
   4038         1
   4039         >>> c.flags[InvalidOperation] = 0
   4040         >>> print c.flags[InvalidOperation]
   4041         0
   4042         >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
   4043         Decimal('NaN')
   4044         >>> print c.flags[InvalidOperation]
   4045         1
   4046         >>> c.compare_signal(-1, 2)
   4047         Decimal('-1')
   4048         >>> c.compare_signal(Decimal(-1), 2)
   4049         Decimal('-1')
   4050         >>> c.compare_signal(-1, Decimal(2))
   4051         Decimal('-1')
   4052         """
   4053         a = _convert_other(a, raiseit=True)
   4054         return a.compare_signal(b, context=self)
   4055 
   4056     def compare_total(self, a, b):
   4057         """Compares two operands using their abstract representation.
   4058 
   4059         This is not like the standard compare, which use their numerical
   4060         value. Note that a total ordering is defined for all possible abstract
   4061         representations.
   4062 
   4063         >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
   4064         Decimal('-1')
   4065         >>> ExtendedContext.compare_total(Decimal('-127'),  Decimal('12'))
   4066         Decimal('-1')
   4067         >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
   4068         Decimal('-1')
   4069         >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
   4070         Decimal('0')
   4071         >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('12.300'))
   4072         Decimal('1')
   4073         >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('NaN'))
   4074         Decimal('-1')
   4075         >>> ExtendedContext.compare_total(1, 2)
   4076         Decimal('-1')
   4077         >>> ExtendedContext.compare_total(Decimal(1), 2)
   4078         Decimal('-1')
   4079         >>> ExtendedContext.compare_total(1, Decimal(2))
   4080         Decimal('-1')
   4081         """
   4082         a = _convert_other(a, raiseit=True)
   4083         return a.compare_total(b)
   4084 
   4085     def compare_total_mag(self, a, b):
   4086         """Compares two operands using their abstract representation ignoring sign.
   4087 
   4088         Like compare_total, but with operand's sign ignored and assumed to be 0.
   4089         """
   4090         a = _convert_other(a, raiseit=True)
   4091         return a.compare_total_mag(b)
   4092 
   4093     def copy_abs(self, a):
   4094         """Returns a copy of the operand with the sign set to 0.
   4095 
   4096         >>> ExtendedContext.copy_abs(Decimal('2.1'))
   4097         Decimal('2.1')
   4098         >>> ExtendedContext.copy_abs(Decimal('-100'))
   4099         Decimal('100')
   4100         >>> ExtendedContext.copy_abs(-1)
   4101         Decimal('1')
   4102         """
   4103         a = _convert_other(a, raiseit=True)
   4104         return a.copy_abs()
   4105 
   4106     def copy_decimal(self, a):
   4107         """Returns a copy of the decimal object.
   4108 
   4109         >>> ExtendedContext.copy_decimal(Decimal('2.1'))
   4110         Decimal('2.1')
   4111         >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
   4112         Decimal('-1.00')
   4113         >>> ExtendedContext.copy_decimal(1)
   4114         Decimal('1')
   4115         """
   4116         a = _convert_other(a, raiseit=True)
   4117         return Decimal(a)
   4118 
   4119     def copy_negate(self, a):
   4120         """Returns a copy of the operand with the sign inverted.
   4121 
   4122         >>> ExtendedContext.copy_negate(Decimal('101.5'))
   4123         Decimal('-101.5')
   4124         >>> ExtendedContext.copy_negate(Decimal('-101.5'))
   4125         Decimal('101.5')
   4126         >>> ExtendedContext.copy_negate(1)
   4127         Decimal('-1')
   4128         """
   4129         a = _convert_other(a, raiseit=True)
   4130         return a.copy_negate()
   4131 
   4132     def copy_sign(self, a, b):
   4133         """Copies the second operand's sign to the first one.
   4134 
   4135         In detail, it returns a copy of the first operand with the sign
   4136         equal to the sign of the second operand.
   4137 
   4138         >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
   4139         Decimal('1.50')
   4140         >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
   4141         Decimal('1.50')
   4142         >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
   4143         Decimal('-1.50')
   4144         >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
   4145         Decimal('-1.50')
   4146         >>> ExtendedContext.copy_sign(1, -2)
   4147         Decimal('-1')
   4148         >>> ExtendedContext.copy_sign(Decimal(1), -2)
   4149         Decimal('-1')
   4150         >>> ExtendedContext.copy_sign(1, Decimal(-2))
   4151         Decimal('-1')
   4152         """
   4153         a = _convert_other(a, raiseit=True)
   4154         return a.copy_sign(b)
   4155 
   4156     def divide(self, a, b):
   4157         """Decimal division in a specified context.
   4158 
   4159         >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
   4160         Decimal('0.333333333')
   4161         >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
   4162         Decimal('0.666666667')
   4163         >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
   4164         Decimal('2.5')
   4165         >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
   4166         Decimal('0.1')
   4167         >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
   4168         Decimal('1')
   4169         >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
   4170         Decimal('4.00')
   4171         >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
   4172         Decimal('1.20')
   4173         >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
   4174         Decimal('10')
   4175         >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
   4176         Decimal('1000')
   4177         >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
   4178         Decimal('1.20E+6')
   4179         >>> ExtendedContext.divide(5, 5)
   4180         Decimal('1')
   4181         >>> ExtendedContext.divide(Decimal(5), 5)
   4182         Decimal('1')
   4183         >>> ExtendedContext.divide(5, Decimal(5))
   4184         Decimal('1')
   4185         """
   4186         a = _convert_other(a, raiseit=True)
   4187         r = a.__div__(b, context=self)
   4188         if r is NotImplemented:
   4189             raise TypeError("Unable to convert %s to Decimal" % b)
   4190         else:
   4191             return r
   4192 
   4193     def divide_int(self, a, b):
   4194         """Divides two numbers and returns the integer part of the result.
   4195 
   4196         >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
   4197         Decimal('0')
   4198         >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
   4199         Decimal('3')
   4200         >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
   4201         Decimal('3')
   4202         >>> ExtendedContext.divide_int(10, 3)
   4203         Decimal('3')
   4204         >>> ExtendedContext.divide_int(Decimal(10), 3)
   4205         Decimal('3')
   4206         >>> ExtendedContext.divide_int(10, Decimal(3))
   4207         Decimal('3')
   4208         """
   4209         a = _convert_other(a, raiseit=True)
   4210         r = a.__floordiv__(b, context=self)
   4211         if r is NotImplemented:
   4212             raise TypeError("Unable to convert %s to Decimal" % b)
   4213         else:
   4214             return r
   4215 
   4216     def divmod(self, a, b):
   4217         """Return (a // b, a % b).
   4218 
   4219         >>> ExtendedContext.divmod(Decimal(8), Decimal(3))
   4220         (Decimal('2'), Decimal('2'))
   4221         >>> ExtendedContext.divmod(Decimal(8), Decimal(4))
   4222         (Decimal('2'), Decimal('0'))
   4223         >>> ExtendedContext.divmod(8, 4)
   4224         (Decimal('2'), Decimal('0'))
   4225         >>> ExtendedContext.divmod(Decimal(8), 4)
   4226         (Decimal('2'), Decimal('0'))
   4227         >>> ExtendedContext.divmod(8, Decimal(4))
   4228         (Decimal('2'), Decimal('0'))
   4229         """
   4230         a = _convert_other(a, raiseit=True)
   4231         r = a.__divmod__(b, context=self)
   4232         if r is NotImplemented:
   4233             raise TypeError("Unable to convert %s to Decimal" % b)
   4234         else:
   4235             return r
   4236 
   4237     def exp(self, a):
   4238         """Returns e ** a.
   4239 
   4240         >>> c = ExtendedContext.copy()
   4241         >>> c.Emin = -999
   4242         >>> c.Emax = 999
   4243         >>> c.exp(Decimal('-Infinity'))
   4244         Decimal('0')
   4245         >>> c.exp(Decimal('-1'))
   4246         Decimal('0.367879441')
   4247         >>> c.exp(Decimal('0'))
   4248         Decimal('1')
   4249         >>> c.exp(Decimal('1'))
   4250         Decimal('2.71828183')
   4251         >>> c.exp(Decimal('0.693147181'))
   4252         Decimal('2.00000000')
   4253         >>> c.exp(Decimal('+Infinity'))
   4254         Decimal('Infinity')
   4255         >>> c.exp(10)
   4256         Decimal('22026.4658')
   4257         """
   4258         a =_convert_other(a, raiseit=True)
   4259         return a.exp(context=self)
   4260 
   4261     def fma(self, a, b, c):
   4262         """Returns a multiplied by b, plus c.
   4263 
   4264         The first two operands are multiplied together, using multiply,
   4265         the third operand is then added to the result of that
   4266         multiplication, using add, all with only one final rounding.
   4267 
   4268         >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
   4269         Decimal('22')
   4270         >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
   4271         Decimal('-8')
   4272         >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
   4273         Decimal('1.38435736E+12')
   4274         >>> ExtendedContext.fma(1, 3, 4)
   4275         Decimal('7')
   4276         >>> ExtendedContext.fma(1, Decimal(3), 4)
   4277         Decimal('7')
   4278         >>> ExtendedContext.fma(1, 3, Decimal(4))
   4279         Decimal('7')
   4280         """
   4281         a = _convert_other(a, raiseit=True)
   4282         return a.fma(b, c, context=self)
   4283 
   4284     def is_canonical(self, a):
   4285         """Return True if the operand is canonical; otherwise return False.
   4286 
   4287         Currently, the encoding of a Decimal instance is always
   4288         canonical, so this method returns True for any Decimal.
   4289 
   4290         >>> ExtendedContext.is_canonical(Decimal('2.50'))
   4291         True
   4292         """
   4293         return a.is_canonical()
   4294 
   4295     def is_finite(self, a):
   4296         """Return True if the operand is finite; otherwise return False.
   4297 
   4298         A Decimal instance is considered finite if it is neither
   4299         infinite nor a NaN.
   4300 
   4301         >>> ExtendedContext.is_finite(Decimal('2.50'))
   4302         True
   4303         >>> ExtendedContext.is_finite(Decimal('-0.3'))
   4304         True
   4305         >>> ExtendedContext.is_finite(Decimal('0'))
   4306         True
   4307         >>> ExtendedContext.is_finite(Decimal('Inf'))
   4308         False
   4309         >>> ExtendedContext.is_finite(Decimal('NaN'))
   4310         False
   4311         >>> ExtendedContext.is_finite(1)
   4312         True
   4313         """
   4314         a = _convert_other(a, raiseit=True)
   4315         return a.is_finite()
   4316 
   4317     def is_infinite(self, a):
   4318         """Return True if the operand is infinite; otherwise return False.
   4319 
   4320         >>> ExtendedContext.is_infinite(Decimal('2.50'))
   4321         False
   4322         >>> ExtendedContext.is_infinite(Decimal('-Inf'))
   4323         True
   4324         >>> ExtendedContext.is_infinite(Decimal('NaN'))
   4325         False
   4326         >>> ExtendedContext.is_infinite(1)
   4327         False
   4328         """
   4329         a = _convert_other(a, raiseit=True)
   4330         return a.is_infinite()
   4331 
   4332     def is_nan(self, a):
   4333         """Return True if the operand is a qNaN or sNaN;
   4334         otherwise return False.
   4335 
   4336         >>> ExtendedContext.is_nan(Decimal('2.50'))
   4337         False
   4338         >>> ExtendedContext.is_nan(Decimal('NaN'))
   4339         True
   4340         >>> ExtendedContext.is_nan(Decimal('-sNaN'))
   4341         True
   4342         >>> ExtendedContext.is_nan(1)
   4343         False
   4344         """
   4345         a = _convert_other(a, raiseit=True)
   4346         return a.is_nan()
   4347 
   4348     def is_normal(self, a):
   4349         """Return True if the operand is a normal number;
   4350         otherwise return False.
   4351 
   4352         >>> c = ExtendedContext.copy()
   4353         >>> c.Emin = -999
   4354         >>> c.Emax = 999
   4355         >>> c.is_normal(Decimal('2.50'))
   4356         True
   4357         >>> c.is_normal(Decimal('0.1E-999'))
   4358         False
   4359         >>> c.is_normal(Decimal('0.00'))
   4360         False
   4361         >>> c.is_normal(Decimal('-Inf'))
   4362         False
   4363         >>> c.is_normal(Decimal('NaN'))
   4364         False
   4365         >>> c.is_normal(1)
   4366         True
   4367         """
   4368         a = _convert_other(a, raiseit=True)
   4369         return a.is_normal(context=self)
   4370 
   4371     def is_qnan(self, a):
   4372         """Return True if the operand is a quiet NaN; otherwise return False.
   4373 
   4374         >>> ExtendedContext.is_qnan(Decimal('2.50'))
   4375         False
   4376         >>> ExtendedContext.is_qnan(Decimal('NaN'))
   4377         True
   4378         >>> ExtendedContext.is_qnan(Decimal('sNaN'))
   4379         False
   4380         >>> ExtendedContext.is_qnan(1)
   4381         False
   4382         """
   4383         a = _convert_other(a, raiseit=True)
   4384         return a.is_qnan()
   4385 
   4386     def is_signed(self, a):
   4387         """Return True if the operand is negative; otherwise return False.
   4388 
   4389         >>> ExtendedContext.is_signed(Decimal('2.50'))
   4390         False
   4391         >>> ExtendedContext.is_signed(Decimal('-12'))
   4392         True
   4393         >>> ExtendedContext.is_signed(Decimal('-0'))
   4394         True
   4395         >>> ExtendedContext.is_signed(8)
   4396         False
   4397         >>> ExtendedContext.is_signed(-8)
   4398         True
   4399         """
   4400         a = _convert_other(a, raiseit=True)
   4401         return a.is_signed()
   4402 
   4403     def is_snan(self, a):
   4404         """Return True if the operand is a signaling NaN;
   4405         otherwise return False.
   4406 
   4407         >>> ExtendedContext.is_snan(Decimal('2.50'))
   4408         False
   4409         >>> ExtendedContext.is_snan(Decimal('NaN'))
   4410         False
   4411         >>> ExtendedContext.is_snan(Decimal('sNaN'))
   4412         True
   4413         >>> ExtendedContext.is_snan(1)
   4414         False
   4415         """
   4416         a = _convert_other(a, raiseit=True)
   4417         return a.is_snan()
   4418 
   4419     def is_subnormal(self, a):
   4420         """Return True if the operand is subnormal; otherwise return False.
   4421 
   4422         >>> c = ExtendedContext.copy()
   4423         >>> c.Emin = -999
   4424         >>> c.Emax = 999
   4425         >>> c.is_subnormal(Decimal('2.50'))
   4426         False
   4427         >>> c.is_subnormal(Decimal('0.1E-999'))
   4428         True
   4429         >>> c.is_subnormal(Decimal('0.00'))
   4430         False
   4431         >>> c.is_subnormal(Decimal('-Inf'))
   4432         False
   4433         >>> c.is_subnormal(Decimal('NaN'))
   4434         False
   4435         >>> c.is_subnormal(1)
   4436         False
   4437         """
   4438         a = _convert_other(a, raiseit=True)
   4439         return a.is_subnormal(context=self)
   4440 
   4441     def is_zero(self, a):
   4442         """Return True if the operand is a zero; otherwise return False.
   4443 
   4444         >>> ExtendedContext.is_zero(Decimal('0'))
   4445         True
   4446         >>> ExtendedContext.is_zero(Decimal('2.50'))
   4447         False
   4448         >>> ExtendedContext.is_zero(Decimal('-0E+2'))
   4449         True
   4450         >>> ExtendedContext.is_zero(1)
   4451         False
   4452         >>> ExtendedContext.is_zero(0)
   4453         True
   4454         """
   4455         a = _convert_other(a, raiseit=True)
   4456         return a.is_zero()
   4457 
   4458     def ln(self, a):
   4459         """Returns the natural (base e) logarithm of the operand.
   4460 
   4461         >>> c = ExtendedContext.copy()
   4462         >>> c.Emin = -999
   4463         >>> c.Emax = 999
   4464         >>> c.ln(Decimal('0'))
   4465         Decimal('-Infinity')
   4466         >>> c.ln(Decimal('1.000'))
   4467         Decimal('0')
   4468         >>> c.ln(Decimal('2.71828183'))
   4469         Decimal('1.00000000')
   4470         >>> c.ln(Decimal('10'))
   4471         Decimal('2.30258509')
   4472         >>> c.ln(Decimal('+Infinity'))
   4473         Decimal('Infinity')
   4474         >>> c.ln(1)
   4475         Decimal('0')
   4476         """
   4477         a = _convert_other(a, raiseit=True)
   4478         return a.ln(context=self)
   4479 
   4480     def log10(self, a):
   4481         """Returns the base 10 logarithm of the operand.
   4482 
   4483         >>> c = ExtendedContext.copy()
   4484         >>> c.Emin = -999
   4485         >>> c.Emax = 999
   4486         >>> c.log10(Decimal('0'))
   4487         Decimal('-Infinity')
   4488         >>> c.log10(Decimal('0.001'))
   4489         Decimal('-3')
   4490         >>> c.log10(Decimal('1.000'))
   4491         Decimal('0')
   4492         >>> c.log10(Decimal('2'))
   4493         Decimal('0.301029996')
   4494         >>> c.log10(Decimal('10'))
   4495         Decimal('1')
   4496         >>> c.log10(Decimal('70'))
   4497         Decimal('1.84509804')
   4498         >>> c.log10(Decimal('+Infinity'))
   4499         Decimal('Infinity')
   4500         >>> c.log10(0)
   4501         Decimal('-Infinity')
   4502         >>> c.log10(1)
   4503         Decimal('0')
   4504         """
   4505         a = _convert_other(a, raiseit=True)
   4506         return a.log10(context=self)
   4507 
   4508     def logb(self, a):
   4509         """ Returns the exponent of the magnitude of the operand's MSD.
   4510 
   4511         The result is the integer which is the exponent of the magnitude
   4512         of the most significant digit of the operand (as though the
   4513         operand were truncated to a single digit while maintaining the
   4514         value of that digit and without limiting the resulting exponent).
   4515 
   4516         >>> ExtendedContext.logb(Decimal('250'))
   4517         Decimal('2')
   4518         >>> ExtendedContext.logb(Decimal('2.50'))
   4519         Decimal('0')
   4520         >>> ExtendedContext.logb(Decimal('0.03'))
   4521         Decimal('-2')
   4522         >>> ExtendedContext.logb(Decimal('0'))
   4523         Decimal('-Infinity')
   4524         >>> ExtendedContext.logb(1)
   4525         Decimal('0')
   4526         >>> ExtendedContext.logb(10)
   4527         Decimal('1')
   4528         >>> ExtendedContext.logb(100)
   4529         Decimal('2')
   4530         """
   4531         a = _convert_other(a, raiseit=True)
   4532         return a.logb(context=self)
   4533 
   4534     def logical_and(self, a, b):
   4535         """Applies the logical operation 'and' between each operand's digits.
   4536 
   4537         The operands must be both logical numbers.
   4538 
   4539         >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
   4540         Decimal('0')
   4541         >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
   4542         Decimal('0')
   4543         >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
   4544         Decimal('0')
   4545         >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
   4546         Decimal('1')
   4547         >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
   4548         Decimal('1000')
   4549         >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
   4550         Decimal('10')
   4551         >>> ExtendedContext.logical_and(110, 1101)
   4552         Decimal('100')
   4553         >>> ExtendedContext.logical_and(Decimal(110), 1101)
   4554         Decimal('100')
   4555         >>> ExtendedContext.logical_and(110, Decimal(1101))
   4556         Decimal('100')
   4557         """
   4558         a = _convert_other(a, raiseit=True)
   4559         return a.logical_and(b, context=self)
   4560 
   4561     def logical_invert(self, a):
   4562         """Invert all the digits in the operand.
   4563 
   4564         The operand must be a logical number.
   4565 
   4566         >>> ExtendedContext.logical_invert(Decimal('0'))
   4567         Decimal('111111111')
   4568         >>> ExtendedContext.logical_invert(Decimal('1'))
   4569         Decimal('111111110')
   4570         >>> ExtendedContext.logical_invert(Decimal('111111111'))
   4571         Decimal('0')
   4572         >>> ExtendedContext.logical_invert(Decimal('101010101'))
   4573         Decimal('10101010')
   4574         >>> ExtendedContext.logical_invert(1101)
   4575         Decimal('111110010')
   4576         """
   4577         a = _convert_other(a, raiseit=True)
   4578         return a.logical_invert(context=self)
   4579 
   4580     def logical_or(self, a, b):
   4581         """Applies the logical operation 'or' between each operand's digits.
   4582 
   4583         The operands must be both logical numbers.
   4584 
   4585         >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
   4586         Decimal('0')
   4587         >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
   4588         Decimal('1')
   4589         >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
   4590         Decimal('1')
   4591         >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
   4592         Decimal('1')
   4593         >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
   4594         Decimal('1110')
   4595         >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
   4596         Decimal('1110')
   4597         >>> ExtendedContext.logical_or(110, 1101)
   4598         Decimal('1111')
   4599         >>> ExtendedContext.logical_or(Decimal(110), 1101)
   4600         Decimal('1111')
   4601         >>> ExtendedContext.logical_or(110, Decimal(1101))
   4602         Decimal('1111')
   4603         """
   4604         a = _convert_other(a, raiseit=True)
   4605         return a.logical_or(b, context=self)
   4606 
   4607     def logical_xor(self, a, b):
   4608         """Applies the logical operation 'xor' between each operand's digits.
   4609 
   4610         The operands must be both logical numbers.
   4611 
   4612         >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
   4613         Decimal('0')
   4614         >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
   4615         Decimal('1')
   4616         >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
   4617         Decimal('1')
   4618         >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
   4619         Decimal('0')
   4620         >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
   4621         Decimal('110')
   4622         >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
   4623         Decimal('1101')
   4624         >>> ExtendedContext.logical_xor(110, 1101)
   4625         Decimal('1011')
   4626         >>> ExtendedContext.logical_xor(Decimal(110), 1101)
   4627         Decimal('1011')
   4628         >>> ExtendedContext.logical_xor(110, Decimal(1101))
   4629         Decimal('1011')
   4630         """
   4631         a = _convert_other(a, raiseit=True)
   4632         return a.logical_xor(b, context=self)
   4633 
   4634     def max(self, a, b):
   4635         """max compares two values numerically and returns the maximum.
   4636 
   4637         If either operand is a NaN then the general rules apply.
   4638         Otherwise, the operands are compared as though by the compare
   4639         operation.  If they are numerically equal then the left-hand operand
   4640         is chosen as the result.  Otherwise the maximum (closer to positive
   4641         infinity) of the two operands is chosen as the result.
   4642 
   4643         >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
   4644         Decimal('3')
   4645         >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
   4646         Decimal('3')
   4647         >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
   4648         Decimal('1')
   4649         >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
   4650         Decimal('7')
   4651         >>> ExtendedContext.max(1, 2)
   4652         Decimal('2')
   4653         >>> ExtendedContext.max(Decimal(1), 2)
   4654         Decimal('2')
   4655         >>> ExtendedContext.max(1, Decimal(2))
   4656         Decimal('2')
   4657         """
   4658         a = _convert_other(a, raiseit=True)
   4659         return a.max(b, context=self)
   4660 
   4661     def max_mag(self, a, b):
   4662         """Compares the values numerically with their sign ignored.
   4663 
   4664         >>> ExtendedContext.max_mag(Decimal('7'), Decimal('NaN'))
   4665         Decimal('7')
   4666         >>> ExtendedContext.max_mag(Decimal('7'), Decimal('-10'))
   4667         Decimal('-10')
   4668         >>> ExtendedContext.max_mag(1, -2)
   4669         Decimal('-2')
   4670         >>> ExtendedContext.max_mag(Decimal(1), -2)
   4671         Decimal('-2')
   4672         >>> ExtendedContext.max_mag(1, Decimal(-2))
   4673         Decimal('-2')
   4674         """
   4675         a = _convert_other(a, raiseit=True)
   4676         return a.max_mag(b, context=self)
   4677 
   4678     def min(self, a, b):
   4679         """min compares two values numerically and returns the minimum.
   4680 
   4681         If either operand is a NaN then the general rules apply.
   4682         Otherwise, the operands are compared as though by the compare
   4683         operation.  If they are numerically equal then the left-hand operand
   4684         is chosen as the result.  Otherwise the minimum (closer to negative
   4685         infinity) of the two operands is chosen as the result.
   4686 
   4687         >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
   4688         Decimal('2')
   4689         >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
   4690         Decimal('-10')
   4691         >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
   4692         Decimal('1.0')
   4693         >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
   4694         Decimal('7')
   4695         >>> ExtendedContext.min(1, 2)
   4696         Decimal('1')
   4697         >>> ExtendedContext.min(Decimal(1), 2)
   4698         Decimal('1')
   4699         >>> ExtendedContext.min(1, Decimal(29))
   4700         Decimal('1')
   4701         """
   4702         a = _convert_other(a, raiseit=True)
   4703         return a.min(b, context=self)
   4704 
   4705     def min_mag(self, a, b):
   4706         """Compares the values numerically with their sign ignored.
   4707 
   4708         >>> ExtendedContext.min_mag(Decimal('3'), Decimal('-2'))
   4709         Decimal('-2')
   4710         >>> ExtendedContext.min_mag(Decimal('-3'), Decimal('NaN'))
   4711         Decimal('-3')
   4712         >>> ExtendedContext.min_mag(1, -2)
   4713         Decimal('1')
   4714         >>> ExtendedContext.min_mag(Decimal(1), -2)
   4715         Decimal('1')
   4716         >>> ExtendedContext.min_mag(1, Decimal(-2))
   4717         Decimal('1')
   4718         """
   4719         a = _convert_other(a, raiseit=True)
   4720         return a.min_mag(b, context=self)
   4721 
   4722     def minus(self, a):
   4723         """Minus corresponds to unary prefix minus in Python.
   4724 
   4725         The operation is evaluated using the same rules as subtract; the
   4726         operation minus(a) is calculated as subtract('0', a) where the '0'
   4727         has the same exponent as the operand.
   4728 
   4729         >>> ExtendedContext.minus(Decimal('1.3'))
   4730         Decimal('-1.3')
   4731         >>> ExtendedContext.minus(Decimal('-1.3'))
   4732         Decimal('1.3')
   4733         >>> ExtendedContext.minus(1)
   4734         Decimal('-1')
   4735         """
   4736         a = _convert_other(a, raiseit=True)
   4737         return a.__neg__(context=self)
   4738 
   4739     def multiply(self, a, b):
   4740         """multiply multiplies two operands.
   4741 
   4742         If either operand is a special value then the general rules apply.
   4743         Otherwise, the operands are multiplied together
   4744         ('long multiplication'), resulting in a number which may be as long as
   4745         the sum of the lengths of the two operands.
   4746 
   4747         >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
   4748         Decimal('3.60')
   4749         >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
   4750         Decimal('21')
   4751         >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
   4752         Decimal('0.72')
   4753         >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
   4754         Decimal('-0.0')
   4755         >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
   4756         Decimal('4.28135971E+11')
   4757         >>> ExtendedContext.multiply(7, 7)
   4758         Decimal('49')
   4759         >>> ExtendedContext.multiply(Decimal(7), 7)
   4760         Decimal('49')
   4761         >>> ExtendedContext.multiply(7, Decimal(7))
   4762         Decimal('49')
   4763         """
   4764         a = _convert_other(a, raiseit=True)
   4765         r = a.__mul__(b, context=self)
   4766         if r is NotImplemented:
   4767             raise TypeError("Unable to convert %s to Decimal" % b)
   4768         else:
   4769             return r
   4770 
   4771     def next_minus(self, a):
   4772         """Returns the largest representable number smaller than a.
   4773 
   4774         >>> c = ExtendedContext.copy()
   4775         >>> c.Emin = -999
   4776         >>> c.Emax = 999
   4777         >>> ExtendedContext.next_minus(Decimal('1'))
   4778         Decimal('0.999999999')
   4779         >>> c.next_minus(Decimal('1E-1007'))
   4780         Decimal('0E-1007')
   4781         >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
   4782         Decimal('-1.00000004')
   4783         >>> c.next_minus(Decimal('Infinity'))
   4784         Decimal('9.99999999E+999')
   4785         >>> c.next_minus(1)
   4786         Decimal('0.999999999')
   4787         """
   4788         a = _convert_other(a, raiseit=True)
   4789         return a.next_minus(context=self)
   4790 
   4791     def next_plus(self, a):
   4792         """Returns the smallest representable number larger than a.
   4793 
   4794         >>> c = ExtendedContext.copy()
   4795         >>> c.Emin = -999
   4796         >>> c.Emax = 999
   4797         >>> ExtendedContext.next_plus(Decimal('1'))
   4798         Decimal('1.00000001')
   4799         >>> c.next_plus(Decimal('-1E-1007'))
   4800         Decimal('-0E-1007')
   4801         >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
   4802         Decimal('-1.00000002')
   4803         >>> c.next_plus(Decimal('-Infinity'))
   4804         Decimal('-9.99999999E+999')
   4805         >>> c.next_plus(1)
   4806         Decimal('1.00000001')
   4807         """
   4808         a = _convert_other(a, raiseit=True)
   4809         return a.next_plus(context=self)
   4810 
   4811     def next_toward(self, a, b):
   4812         """Returns the number closest to a, in direction towards b.
   4813 
   4814         The result is the closest representable number from the first
   4815         operand (but not the first operand) that is in the direction
   4816         towards the second operand, unless the operands have the same
   4817         value.
   4818 
   4819         >>> c = ExtendedContext.copy()
   4820         >>> c.Emin = -999
   4821         >>> c.Emax = 999
   4822         >>> c.next_toward(Decimal('1'), Decimal('2'))
   4823         Decimal('1.00000001')
   4824         >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
   4825         Decimal('-0E-1007')
   4826         >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
   4827         Decimal('-1.00000002')
   4828         >>> c.next_toward(Decimal('1'), Decimal('0'))
   4829         Decimal('0.999999999')
   4830         >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
   4831         Decimal('0E-1007')
   4832         >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
   4833         Decimal('-1.00000004')
   4834         >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
   4835         Decimal('-0.00')
   4836         >>> c.next_toward(0, 1)
   4837         Decimal('1E-1007')
   4838         >>> c.next_toward(Decimal(0), 1)
   4839         Decimal('1E-1007')
   4840         >>> c.next_toward(0, Decimal(1))
   4841         Decimal('1E-1007')
   4842         """
   4843         a = _convert_other(a, raiseit=True)
   4844         return a.next_toward(b, context=self)
   4845 
   4846     def normalize(self, a):
   4847         """normalize reduces an operand to its simplest form.
   4848 
   4849         Essentially a plus operation with all trailing zeros removed from the
   4850         result.
   4851 
   4852         >>> ExtendedContext.normalize(Decimal('2.1'))
   4853         Decimal('2.1')
   4854         >>> ExtendedContext.normalize(Decimal('-2.0'))
   4855         Decimal('-2')
   4856         >>> ExtendedContext.normalize(Decimal('1.200'))
   4857         Decimal('1.2')
   4858         >>> ExtendedContext.normalize(Decimal('-120'))
   4859         Decimal('-1.2E+2')
   4860         >>> ExtendedContext.normalize(Decimal('120.00'))
   4861         Decimal('1.2E+2')
   4862         >>> ExtendedContext.normalize(Decimal('0.00'))
   4863         Decimal('0')
   4864         >>> ExtendedContext.normalize(6)
   4865         Decimal('6')
   4866         """
   4867         a = _convert_other(a, raiseit=True)
   4868         return a.normalize(context=self)
   4869 
   4870     def number_class(self, a):
   4871         """Returns an indication of the class of the operand.
   4872 
   4873         The class is one of the following strings:
   4874           -sNaN
   4875           -NaN
   4876           -Infinity
   4877           -Normal
   4878           -Subnormal
   4879           -Zero
   4880           +Zero
   4881           +Subnormal
   4882           +Normal
   4883           +Infinity
   4884 
   4885         >>> c = Context(ExtendedContext)
   4886         >>> c.Emin = -999
   4887         >>> c.Emax = 999
   4888         >>> c.number_class(Decimal('Infinity'))
   4889         '+Infinity'
   4890         >>> c.number_class(Decimal('1E-10'))
   4891         '+Normal'
   4892         >>> c.number_class(Decimal('2.50'))
   4893         '+Normal'
   4894         >>> c.number_class(Decimal('0.1E-999'))
   4895         '+Subnormal'
   4896         >>> c.number_class(Decimal('0'))
   4897         '+Zero'
   4898         >>> c.number_class(Decimal('-0'))
   4899         '-Zero'
   4900         >>> c.number_class(Decimal('-0.1E-999'))
   4901         '-Subnormal'
   4902         >>> c.number_class(Decimal('-1E-10'))
   4903         '-Normal'
   4904         >>> c.number_class(Decimal('-2.50'))
   4905         '-Normal'
   4906         >>> c.number_class(Decimal('-Infinity'))
   4907         '-Infinity'
   4908         >>> c.number_class(Decimal('NaN'))
   4909         'NaN'
   4910         >>> c.number_class(Decimal('-NaN'))
   4911         'NaN'
   4912         >>> c.number_class(Decimal('sNaN'))
   4913         'sNaN'
   4914         >>> c.number_class(123)
   4915         '+Normal'
   4916         """
   4917         a = _convert_other(a, raiseit=True)
   4918         return a.number_class(context=self)
   4919 
   4920     def plus(self, a):
   4921         """Plus corresponds to unary prefix plus in Python.
   4922 
   4923         The operation is evaluated using the same rules as add; the
   4924         operation plus(a) is calculated as add('0', a) where the '0'
   4925         has the same exponent as the operand.
   4926 
   4927         >>> ExtendedContext.plus(Decimal('1.3'))
   4928         Decimal('1.3')
   4929         >>> ExtendedContext.plus(Decimal('-1.3'))
   4930         Decimal('-1.3')
   4931         >>> ExtendedContext.plus(-1)
   4932         Decimal('-1')
   4933         """
   4934         a = _convert_other(a, raiseit=True)
   4935         return a.__pos__(context=self)
   4936 
   4937     def power(self, a, b, modulo=None):
   4938         """Raises a to the power of b, to modulo if given.
   4939 
   4940         With two arguments, compute a**b.  If a is negative then b
   4941         must be integral.  The result will be inexact unless b is
   4942         integral and the result is finite and can be expressed exactly
   4943         in 'precision' digits.
   4944 
   4945         With three arguments, compute (a**b) % modulo.  For the
   4946         three argument form, the following restrictions on the
   4947         arguments hold:
   4948 
   4949          - all three arguments must be integral
   4950          - b must be nonnegative
   4951          - at least one of a or b must be nonzero
   4952          - modulo must be nonzero and have at most 'precision' digits
   4953 
   4954         The result of pow(a, b, modulo) is identical to the result
   4955         that would be obtained by computing (a**b) % modulo with
   4956         unbounded precision, but is computed more efficiently.  It is
   4957         always exact.
   4958 
   4959         >>> c = ExtendedContext.copy()
   4960         >>> c.Emin = -999
   4961         >>> c.Emax = 999
   4962         >>> c.power(Decimal('2'), Decimal('3'))
   4963         Decimal('8')
   4964         >>> c.power(Decimal('-2'), Decimal('3'))
   4965         Decimal('-8')
   4966         >>> c.power(Decimal('2'), Decimal('-3'))
   4967         Decimal('0.125')
   4968         >>> c.power(Decimal('1.7'), Decimal('8'))
   4969         Decimal('69.7575744')
   4970         >>> c.power(Decimal('10'), Decimal('0.301029996'))
   4971         Decimal('2.00000000')
   4972         >>> c.power(Decimal('Infinity'), Decimal('-1'))
   4973         Decimal('0')
   4974         >>> c.power(Decimal('Infinity'), Decimal('0'))
   4975         Decimal('1')
   4976         >>> c.power(Decimal('Infinity'), Decimal('1'))
   4977         Decimal('Infinity')
   4978         >>> c.power(Decimal('-Infinity'), Decimal('-1'))
   4979         Decimal('-0')
   4980         >>> c.power(Decimal('-Infinity'), Decimal('0'))
   4981         Decimal('1')
   4982         >>> c.power(Decimal('-Infinity'), Decimal('1'))
   4983         Decimal('-Infinity')
   4984         >>> c.power(Decimal('-Infinity'), Decimal('2'))
   4985         Decimal('Infinity')
   4986         >>> c.power(Decimal('0'), Decimal('0'))
   4987         Decimal('NaN')
   4988 
   4989         >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
   4990         Decimal('11')
   4991         >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
   4992         Decimal('-11')
   4993         >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
   4994         Decimal('1')
   4995         >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
   4996         Decimal('11')
   4997         >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
   4998         Decimal('11729830')
   4999         >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
   5000         Decimal('-0')
   5001         >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
   5002         Decimal('1')
   5003         >>> ExtendedContext.power(7, 7)
   5004         Decimal('823543')
   5005         >>> ExtendedContext.power(Decimal(7), 7)
   5006         Decimal('823543')
   5007         >>> ExtendedContext.power(7, Decimal(7), 2)
   5008         Decimal('1')
   5009         """
   5010         a = _convert_other(a, raiseit=True)
   5011         r = a.__pow__(b, modulo, context=self)
   5012         if r is NotImplemented:
   5013             raise TypeError("Unable to convert %s to Decimal" % b)
   5014         else:
   5015             return r
   5016 
   5017     def quantize(self, a, b):
   5018         """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
   5019 
   5020         The coefficient of the result is derived from that of the left-hand
   5021         operand.  It may be rounded using the current rounding setting (if the
   5022         exponent is being increased), multiplied by a positive power of ten (if
   5023         the exponent is being decreased), or is unchanged (if the exponent is
   5024         already equal to that of the right-hand operand).
   5025 
   5026         Unlike other operations, if the length of the coefficient after the
   5027         quantize operation would be greater than precision then an Invalid
   5028         operation condition is raised.  This guarantees that, unless there is
   5029         an error condition, the exponent of the result of a quantize is always
   5030         equal to that of the right-hand operand.
   5031 
   5032         Also unlike other operations, quantize will never raise Underflow, even
   5033         if the result is subnormal and inexact.
   5034 
   5035         >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
   5036         Decimal('2.170')
   5037         >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
   5038         Decimal('2.17')
   5039         >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
   5040         Decimal('2.2')
   5041         >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
   5042         Decimal('2')
   5043         >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
   5044         Decimal('0E+1')
   5045         >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
   5046         Decimal('-Infinity')
   5047         >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
   5048         Decimal('NaN')
   5049         >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
   5050         Decimal('-0')
   5051         >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
   5052         Decimal('-0E+5')
   5053         >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
   5054         Decimal('NaN')
   5055         >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
   5056         Decimal('NaN')
   5057         >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
   5058         Decimal('217.0')
   5059         >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
   5060         Decimal('217')
   5061         >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
   5062         Decimal('2.2E+2')
   5063         >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
   5064         Decimal('2E+2')
   5065         >>> ExtendedContext.quantize(1, 2)
   5066         Decimal('1')
   5067         >>> ExtendedContext.quantize(Decimal(1), 2)
   5068         Decimal('1')
   5069         >>> ExtendedContext.quantize(1, Decimal(2))
   5070         Decimal('1')
   5071         """
   5072         a = _convert_other(a, raiseit=True)
   5073         return a.quantize(b, context=self)
   5074 
   5075     def radix(self):
   5076         """Just returns 10, as this is Decimal, :)
   5077 
   5078         >>> ExtendedContext.radix()
   5079         Decimal('10')
   5080         """
   5081         return Decimal(10)
   5082 
   5083     def remainder(self, a, b):
   5084         """Returns the remainder from integer division.
   5085 
   5086         The result is the residue of the dividend after the operation of
   5087         calculating integer division as described for divide-integer, rounded
   5088         to precision digits if necessary.  The sign of the result, if
   5089         non-zero, is the same as that of the original dividend.
   5090 
   5091         This operation will fail under the same conditions as integer division
   5092         (that is, if integer division on the same two operands would fail, the
   5093         remainder cannot be calculated).
   5094 
   5095         >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
   5096         Decimal('2.1')
   5097         >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
   5098         Decimal('1')
   5099         >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
   5100         Decimal('-1')
   5101         >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
   5102         Decimal('0.2')
   5103         >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
   5104         Decimal('0.1')
   5105         >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
   5106         Decimal('1.0')
   5107         >>> ExtendedContext.remainder(22, 6)
   5108         Decimal('4')
   5109         >>> ExtendedContext.remainder(Decimal(22), 6)
   5110         Decimal('4')
   5111         >>> ExtendedContext.remainder(22, Decimal(6))
   5112         Decimal('4')
   5113         """
   5114         a = _convert_other(a, raiseit=True)
   5115         r = a.__mod__(b, context=self)
   5116         if r is NotImplemented:
   5117             raise TypeError("Unable to convert %s to Decimal" % b)
   5118         else:
   5119             return r
   5120 
   5121     def remainder_near(self, a, b):
   5122         """Returns to be "a - b * n", where n is the integer nearest the exact
   5123         value of "x / b" (if two integers are equally near then the even one
   5124         is chosen).  If the result is equal to 0 then its sign will be the
   5125         sign of a.
   5126 
   5127         This operation will fail under the same conditions as integer division
   5128         (that is, if integer division on the same two operands would fail, the
   5129         remainder cannot be calculated).
   5130 
   5131         >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
   5132         Decimal('-0.9')
   5133         >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
   5134         Decimal('-2')
   5135         >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
   5136         Decimal('1')
   5137         >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
   5138         Decimal('-1')
   5139         >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
   5140         Decimal('0.2')
   5141         >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
   5142         Decimal('0.1')
   5143         >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
   5144         Decimal('-0.3')
   5145         >>> ExtendedContext.remainder_near(3, 11)
   5146         Decimal('3')
   5147         >>> ExtendedContext.remainder_near(Decimal(3), 11)
   5148         Decimal('3')
   5149         >>> ExtendedContext.remainder_near(3, Decimal(11))
   5150         Decimal('3')
   5151         """
   5152         a = _convert_other(a, raiseit=True)
   5153         return a.remainder_near(b, context=self)
   5154 
   5155     def rotate(self, a, b):
   5156         """Returns a rotated copy of a, b times.
   5157 
   5158         The coefficient of the result is a rotated copy of the digits in
   5159         the coefficient of the first operand.  The number of places of
   5160         rotation is taken from the absolute value of the second operand,
   5161         with the rotation being to the left if the second operand is
   5162         positive or to the right otherwise.
   5163 
   5164         >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
   5165         Decimal('400000003')
   5166         >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
   5167         Decimal('12')
   5168         >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
   5169         Decimal('891234567')
   5170         >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
   5171         Decimal('123456789')
   5172         >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
   5173         Decimal('345678912')
   5174         >>> ExtendedContext.rotate(1333333, 1)
   5175         Decimal('13333330')
   5176         >>> ExtendedContext.rotate(Decimal(1333333), 1)
   5177         Decimal('13333330')
   5178         >>> ExtendedContext.rotate(1333333, Decimal(1))
   5179         Decimal('13333330')
   5180         """
   5181         a = _convert_other(a, raiseit=True)
   5182         return a.rotate(b, context=self)
   5183 
   5184     def same_quantum(self, a, b):
   5185         """Returns True if the two operands have the same exponent.
   5186 
   5187         The result is never affected by either the sign or the coefficient of
   5188         either operand.
   5189 
   5190         >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
   5191         False
   5192         >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
   5193         True
   5194         >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
   5195         False
   5196         >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
   5197         True
   5198         >>> ExtendedContext.same_quantum(10000, -1)
   5199         True
   5200         >>> ExtendedContext.same_quantum(Decimal(10000), -1)
   5201         True
   5202         >>> ExtendedContext.same_quantum(10000, Decimal(-1))
   5203         True
   5204         """
   5205         a = _convert_other(a, raiseit=True)
   5206         return a.same_quantum(b)
   5207 
   5208     def scaleb (self, a, b):
   5209         """Returns the first operand after adding the second value its exp.
   5210 
   5211         >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
   5212         Decimal('0.0750')
   5213         >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
   5214         Decimal('7.50')
   5215         >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
   5216         Decimal('7.50E+3')
   5217         >>> ExtendedContext.scaleb(1, 4)
   5218         Decimal('1E+4')
   5219         >>> ExtendedContext.scaleb(Decimal(1), 4)
   5220         Decimal('1E+4')
   5221         >>> ExtendedContext.scaleb(1, Decimal(4))
   5222         Decimal('1E+4')
   5223         """
   5224         a = _convert_other(a, raiseit=True)
   5225         return a.scaleb(b, context=self)
   5226 
   5227     def shift(self, a, b):
   5228         """Returns a shifted copy of a, b times.
   5229 
   5230         The coefficient of the result is a shifted copy of the digits
   5231         in the coefficient of the first operand.  The number of places
   5232         to shift is taken from the absolute value of the second operand,
   5233         with the shift being to the left if the second operand is
   5234         positive or to the right otherwise.  Digits shifted into the
   5235         coefficient are zeros.
   5236 
   5237         >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
   5238         Decimal('400000000')
   5239         >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
   5240         Decimal('0')
   5241         >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
   5242         Decimal('1234567')
   5243         >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
   5244         Decimal('123456789')
   5245         >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
   5246         Decimal('345678900')
   5247         >>> ExtendedContext.shift(88888888, 2)
   5248         Decimal('888888800')
   5249         >>> ExtendedContext.shift(Decimal(88888888), 2)
   5250         Decimal('888888800')
   5251         >>> ExtendedContext.shift(88888888, Decimal(2))
   5252         Decimal('888888800')
   5253         """
   5254         a = _convert_other(a, raiseit=True)
   5255         return a.shift(b, context=self)
   5256 
   5257     def sqrt(self, a):
   5258         """Square root of a non-negative number to context precision.
   5259 
   5260         If the result must be inexact, it is rounded using the round-half-even
   5261         algorithm.
   5262 
   5263         >>> ExtendedContext.sqrt(Decimal('0'))
   5264         Decimal('0')
   5265         >>> ExtendedContext.sqrt(Decimal('-0'))
   5266         Decimal('-0')
   5267         >>> ExtendedContext.sqrt(Decimal('0.39'))
   5268         Decimal('0.624499800')
   5269         >>> ExtendedContext.sqrt(Decimal('100'))
   5270         Decimal('10')
   5271         >>> ExtendedContext.sqrt(Decimal('1'))
   5272         Decimal('1')
   5273         >>> ExtendedContext.sqrt(Decimal('1.0'))
   5274         Decimal('1.0')
   5275         >>> ExtendedContext.sqrt(Decimal('1.00'))
   5276         Decimal('1.0')
   5277         >>> ExtendedContext.sqrt(Decimal('7'))
   5278         Decimal('2.64575131')
   5279         >>> ExtendedContext.sqrt(Decimal('10'))
   5280         Decimal('3.16227766')
   5281         >>> ExtendedContext.sqrt(2)
   5282         Decimal('1.41421356')
   5283         >>> ExtendedContext.prec
   5284         9
   5285         """
   5286         a = _convert_other(a, raiseit=True)
   5287         return a.sqrt(context=self)
   5288 
   5289     def subtract(self, a, b):
   5290         """Return the difference between the two operands.
   5291 
   5292         >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
   5293         Decimal('0.23')
   5294         >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
   5295         Decimal('0.00')
   5296         >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
   5297         Decimal('-0.77')
   5298         >>> ExtendedContext.subtract(8, 5)
   5299         Decimal('3')
   5300         >>> ExtendedContext.subtract(Decimal(8), 5)
   5301         Decimal('3')
   5302         >>> ExtendedContext.subtract(8, Decimal(5))
   5303         Decimal('3')
   5304         """
   5305         a = _convert_other(a, raiseit=True)
   5306         r = a.__sub__(b, context=self)
   5307         if r is NotImplemented:
   5308             raise TypeError("Unable to convert %s to Decimal" % b)
   5309         else:
   5310             return r
   5311 
   5312     def to_eng_string(self, a):
   5313         """Converts a number to a string, using scientific notation.
   5314 
   5315         The operation is not affected by the context.
   5316         """
   5317         a = _convert_other(a, raiseit=True)
   5318         return a.to_eng_string(context=self)
   5319 
   5320     def to_sci_string(self, a):
   5321         """Converts a number to a string, using scientific notation.
   5322 
   5323         The operation is not affected by the context.
   5324         """
   5325         a = _convert_other(a, raiseit=True)
   5326         return a.__str__(context=self)
   5327 
   5328     def to_integral_exact(self, a):
   5329         """Rounds to an integer.
   5330 
   5331         When the operand has a negative exponent, the result is the same
   5332         as using the quantize() operation using the given operand as the
   5333         left-hand-operand, 1E+0 as the right-hand-operand, and the precision
   5334         of the operand as the precision setting; Inexact and Rounded flags
   5335         are allowed in this operation.  The rounding mode is taken from the
   5336         context.
   5337 
   5338         >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
   5339         Decimal('2')
   5340         >>> ExtendedContext.to_integral_exact(Decimal('100'))
   5341         Decimal('100')
   5342         >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
   5343         Decimal('100')
   5344         >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
   5345         Decimal('102')
   5346         >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
   5347         Decimal('-102')
   5348         >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
   5349         Decimal('1.0E+6')
   5350         >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
   5351         Decimal('7.89E+77')
   5352         >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
   5353         Decimal('-Infinity')
   5354         """
   5355         a = _convert_other(a, raiseit=True)
   5356         return a.to_integral_exact(context=self)
   5357 
   5358     def to_integral_value(self, a):
   5359         """Rounds to an integer.
   5360 
   5361         When the operand has a negative exponent, the result is the same
   5362         as using the quantize() operation using the given operand as the
   5363         left-hand-operand, 1E+0 as the right-hand-operand, and the precision
   5364         of the operand as the precision setting, except that no flags will
   5365         be set.  The rounding mode is taken from the context.
   5366 
   5367         >>> ExtendedContext.to_integral_value(Decimal('2.1'))
   5368         Decimal('2')
   5369         >>> ExtendedContext.to_integral_value(Decimal('100'))
   5370         Decimal('100')
   5371         >>> ExtendedContext.to_integral_value(Decimal('100.0'))
   5372         Decimal('100')
   5373         >>> ExtendedContext.to_integral_value(Decimal('101.5'))
   5374         Decimal('102')
   5375         >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
   5376         Decimal('-102')
   5377         >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
   5378         Decimal('1.0E+6')
   5379         >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
   5380         Decimal('7.89E+77')
   5381         >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
   5382         Decimal('-Infinity')
   5383         """
   5384         a = _convert_other(a, raiseit=True)
   5385         return a.to_integral_value(context=self)
   5386 
   5387     # the method name changed, but we provide also the old one, for compatibility

   5388     to_integral = to_integral_value
   5389 
   5390 class _WorkRep(object):
   5391     __slots__ = ('sign','int','exp')
   5392     # sign: 0 or 1

   5393     # int:  int or long

   5394     # exp:  None, int, or string

   5395 
   5396     def __init__(self, value=None):
   5397         if value is None:
   5398             self.sign = None
   5399             self.int = 0
   5400             self.exp = None
   5401         elif isinstance(value, Decimal):
   5402             self.sign = value._sign
   5403             self.int = int(value._int)
   5404             self.exp = value._exp
   5405         else:
   5406             # assert isinstance(value, tuple)

   5407             self.sign = value[0]
   5408             self.int = value[1]
   5409             self.exp = value[2]
   5410 
   5411     def __repr__(self):
   5412         return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
   5413 
   5414     __str__ = __repr__
   5415 
   5416 
   5417 
   5418 def _normalize(op1, op2, prec = 0):
   5419     """Normalizes op1, op2 to have the same exp and length of coefficient.
   5420 
   5421     Done during addition.
   5422     """
   5423     if op1.exp < op2.exp:
   5424         tmp = op2
   5425         other = op1
   5426     else:
   5427         tmp = op1
   5428         other = op2
   5429 
   5430     # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).

   5431     # Then adding 10**exp to tmp has the same effect (after rounding)

   5432     # as adding any positive quantity smaller than 10**exp; similarly

   5433     # for subtraction.  So if other is smaller than 10**exp we replace

   5434     # it with 10**exp.  This avoids tmp.exp - other.exp getting too large.

   5435     tmp_len = len(str(tmp.int))
   5436     other_len = len(str(other.int))
   5437     exp = tmp.exp + min(-1, tmp_len - prec - 2)
   5438     if other_len + other.exp - 1 < exp:
   5439         other.int = 1
   5440         other.exp = exp
   5441 
   5442     tmp.int *= 10 ** (tmp.exp - other.exp)
   5443     tmp.exp = other.exp
   5444     return op1, op2
   5445 
   5446 ##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####

   5447 
   5448 # This function from Tim Peters was taken from here:

   5449 # http://mail.python.org/pipermail/python-list/1999-July/007758.html

   5450 # The correction being in the function definition is for speed, and

   5451 # the whole function is not resolved with math.log because of avoiding

   5452 # the use of floats.

   5453 def _nbits(n, correction = {
   5454         '0': 4, '1': 3, '2': 2, '3': 2,
   5455         '4': 1, '5': 1, '6': 1, '7': 1,
   5456         '8': 0, '9': 0, 'a': 0, 'b': 0,
   5457         'c': 0, 'd': 0, 'e': 0, 'f': 0}):
   5458     """Number of bits in binary representation of the positive integer n,
   5459     or 0 if n == 0.
   5460     """
   5461     if n < 0:
   5462         raise ValueError("The argument to _nbits should be nonnegative.")
   5463     hex_n = "%x" % n
   5464     return 4*len(hex_n) - correction[hex_n[0]]
   5465 
   5466 def _sqrt_nearest(n, a):
   5467     """Closest integer to the square root of the positive integer n.  a is
   5468     an initial approximation to the square root.  Any positive integer
   5469     will do for a, but the closer a is to the square root of n the
   5470     faster convergence will be.
   5471 
   5472     """
   5473     if n <= 0 or a <= 0:
   5474         raise ValueError("Both arguments to _sqrt_nearest should be positive.")
   5475 
   5476     b=0
   5477     while a != b:
   5478         b, a = a, a--n//a>>1
   5479     return a
   5480 
   5481 def _rshift_nearest(x, shift):
   5482     """Given an integer x and a nonnegative integer shift, return closest
   5483     integer to x / 2**shift; use round-to-even in case of a tie.
   5484 
   5485     """
   5486     b, q = 1L << shift, x >> shift
   5487     return q + (2*(x & (b-1)) + (q&1) > b)
   5488 
   5489 def _div_nearest(a, b):
   5490     """Closest integer to a/b, a and b positive integers; rounds to even
   5491     in the case of a tie.
   5492 
   5493     """
   5494     q, r = divmod(a, b)
   5495     return q + (2*r + (q&1) > b)
   5496 
   5497 def _ilog(x, M, L = 8):
   5498     """Integer approximation to M*log(x/M), with absolute error boundable
   5499     in terms only of x/M.
   5500 
   5501     Given positive integers x and M, return an integer approximation to
   5502     M * log(x/M).  For L = 8 and 0.1 <= x/M <= 10 the difference
   5503     between the approximation and the exact result is at most 22.  For
   5504     L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15.  In
   5505     both cases these are upper bounds on the error; it will usually be
   5506     much smaller."""
   5507 
   5508     # The basic algorithm is the following: let log1p be the function

   5509     # log1p(x) = log(1+x).  Then log(x/M) = log1p((x-M)/M).  We use

   5510     # the reduction

   5511     #

   5512     #    log1p(y) = 2*log1p(y/(1+sqrt(1+y)))

   5513     #

   5514     # repeatedly until the argument to log1p is small (< 2**-L in

   5515     # absolute value).  For small y we can use the Taylor series

   5516     # expansion

   5517     #

   5518     #    log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T

   5519     #

   5520     # truncating at T such that y**T is small enough.  The whole

   5521     # computation is carried out in a form of fixed-point arithmetic,

   5522     # with a real number z being represented by an integer

   5523     # approximation to z*M.  To avoid loss of precision, the y below

   5524     # is actually an integer approximation to 2**R*y*M, where R is the

   5525     # number of reductions performed so far.

   5526 
   5527     y = x-M
   5528     # argument reduction; R = number of reductions performed

   5529     R = 0
   5530     while (R <= L and long(abs(y)) << L-R >= M or
   5531            R > L and abs(y) >> R-L >= M):
   5532         y = _div_nearest(long(M*y) << 1,
   5533                          M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
   5534         R += 1
   5535 
   5536     # Taylor series with T terms

   5537     T = -int(-10*len(str(M))//(3*L))
   5538     yshift = _rshift_nearest(y, R)
   5539     w = _div_nearest(M, T)
   5540     for k in xrange(T-1, 0, -1):
   5541         w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
   5542 
   5543     return _div_nearest(w*y, M)
   5544 
   5545 def _dlog10(c, e, p):
   5546     """Given integers c, e and p with c > 0, p >= 0, compute an integer
   5547     approximation to 10**p * log10(c*10**e), with an absolute error of
   5548     at most 1.  Assumes that c*10**e is not exactly 1."""
   5549 
   5550     # increase precision by 2; compensate for this by dividing

   5551     # final result by 100

   5552     p += 2
   5553 
   5554     # write c*10**e as d*10**f with either:

   5555     #   f >= 0 and 1 <= d <= 10, or

   5556     #   f <= 0 and 0.1 <= d <= 1.

   5557     # Thus for c*10**e close to 1, f = 0

   5558     l = len(str(c))
   5559     f = e+l - (e+l >= 1)
   5560 
   5561     if p > 0:
   5562         M = 10**p
   5563         k = e+p-f
   5564         if k >= 0:
   5565             c *= 10**k
   5566         else:
   5567             c = _div_nearest(c, 10**-k)
   5568 
   5569         log_d = _ilog(c, M) # error < 5 + 22 = 27

   5570         log_10 = _log10_digits(p) # error < 1

   5571         log_d = _div_nearest(log_d*M, log_10)
   5572         log_tenpower = f*M # exact

   5573     else:
   5574         log_d = 0  # error < 2.31

   5575         log_tenpower = _div_nearest(f, 10**-p) # error < 0.5

   5576 
   5577     return _div_nearest(log_tenpower+log_d, 100)
   5578 
   5579 def _dlog(c, e, p):
   5580     """Given integers c, e and p with c > 0, compute an integer
   5581     approximation to 10**p * log(c*10**e), with an absolute error of
   5582     at most 1.  Assumes that c*10**e is not exactly 1."""
   5583 
   5584     # Increase precision by 2. The precision increase is compensated

   5585     # for at the end with a division by 100.

   5586     p += 2
   5587 
   5588     # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,

   5589     # or f <= 0 and 0.1 <= d <= 1.  Then we can compute 10**p * log(c*10**e)

   5590     # as 10**p * log(d) + 10**p*f * log(10).

   5591     l = len(str(c))
   5592     f = e+l - (e+l >= 1)
   5593 
   5594     # compute approximation to 10**p*log(d), with error < 27

   5595     if p > 0:
   5596         k = e+p-f
   5597         if k >= 0:
   5598             c *= 10**k
   5599         else:
   5600             c = _div_nearest(c, 10**-k)  # error of <= 0.5 in c

   5601 
   5602         # _ilog magnifies existing error in c by a factor of at most 10

   5603         log_d = _ilog(c, 10**p) # error < 5 + 22 = 27

   5604     else:
   5605         # p <= 0: just approximate the whole thing by 0; error < 2.31

   5606         log_d = 0
   5607 
   5608     # compute approximation to f*10**p*log(10), with error < 11.

   5609     if f:
   5610         extra = len(str(abs(f)))-1
   5611         if p + extra >= 0:
   5612             # error in f * _log10_digits(p+extra) < |f| * 1 = |f|

   5613             # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11

   5614             f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
   5615         else:
   5616             f_log_ten = 0
   5617     else:
   5618         f_log_ten = 0
   5619 
   5620     # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1

   5621     return _div_nearest(f_log_ten + log_d, 100)
   5622 
   5623 class _Log10Memoize(object):
   5624     """Class to compute, store, and allow retrieval of, digits of the
   5625     constant log(10) = 2.302585....  This constant is needed by
   5626     Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
   5627     def __init__(self):
   5628         self.digits = "23025850929940456840179914546843642076011014886"
   5629 
   5630     def getdigits(self, p):
   5631         """Given an integer p >= 0, return floor(10**p)*log(10).
   5632 
   5633         For example, self.getdigits(3) returns 2302.
   5634         """
   5635         # digits are stored as a string, for quick conversion to

   5636         # integer in the case that we've already computed enough

   5637         # digits; the stored digits should always be correct

   5638         # (truncated, not rounded to nearest).

   5639         if p < 0:
   5640             raise ValueError("p should be nonnegative")
   5641 
   5642         if p >= len(self.digits):
   5643             # compute p+3, p+6, p+9, ... digits; continue until at

   5644             # least one of the extra digits is nonzero

   5645             extra = 3
   5646             while True:
   5647                 # compute p+extra digits, correct to within 1ulp

   5648                 M = 10**(p+extra+2)
   5649                 digits = str(_div_nearest(_ilog(10*M, M), 100))
   5650                 if digits[-extra:] != '0'*extra:
   5651                     break
   5652                 extra += 3
   5653             # keep all reliable digits so far; remove trailing zeros

   5654             # and next nonzero digit

   5655             self.digits = digits.rstrip('0')[:-1]
   5656         return int(self.digits[:p+1])
   5657 
   5658 _log10_digits = _Log10Memoize().getdigits
   5659 
   5660 def _iexp(x, M, L=8):
   5661     """Given integers x and M, M > 0, such that x/M is small in absolute
   5662     value, compute an integer approximation to M*exp(x/M).  For 0 <=
   5663     x/M <= 2.4, the absolute error in the result is bounded by 60 (and
   5664     is usually much smaller)."""
   5665 
   5666     # Algorithm: to compute exp(z) for a real number z, first divide z

   5667     # by a suitable power R of 2 so that |z/2**R| < 2**-L.  Then

   5668     # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor

   5669     # series

   5670     #

   5671     #     expm1(x) = x + x**2/2! + x**3/3! + ...

   5672     #

   5673     # Now use the identity

   5674     #

   5675     #     expm1(2x) = expm1(x)*(expm1(x)+2)

   5676     #

   5677     # R times to compute the sequence expm1(z/2**R),

   5678     # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).

   5679 
   5680     # Find R such that x/2**R/M <= 2**-L

   5681     R = _nbits((long(x)<<L)//M)
   5682 
   5683     # Taylor series.  (2**L)**T > M

   5684     T = -int(-10*len(str(M))//(3*L))
   5685     y = _div_nearest(x, T)
   5686     Mshift = long(M)<<R
   5687     for i in xrange(T-1, 0, -1):
   5688         y = _div_nearest(x*(Mshift + y), Mshift * i)
   5689 
   5690     # Expansion

   5691     for k in xrange(R-1, -1, -1):
   5692         Mshift = long(M)<<(k+2)
   5693         y = _div_nearest(y*(y+Mshift), Mshift)
   5694 
   5695     return M+y
   5696 
   5697 def _dexp(c, e, p):
   5698     """Compute an approximation to exp(c*10**e), with p decimal places of
   5699     precision.
   5700 
   5701     Returns integers d, f such that:
   5702 
   5703       10**(p-1) <= d <= 10**p, and
   5704       (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
   5705 
   5706     In other words, d*10**f is an approximation to exp(c*10**e) with p
   5707     digits of precision, and with an error in d of at most 1.  This is
   5708     almost, but not quite, the same as the error being < 1ulp: when d
   5709     = 10**(p-1) the error could be up to 10 ulp."""
   5710 
   5711     # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision

   5712     p += 2
   5713 
   5714     # compute log(10) with extra precision = adjusted exponent of c*10**e

   5715     extra = max(0, e + len(str(c)) - 1)
   5716     q = p + extra
   5717 
   5718     # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),

   5719     # rounding down

   5720     shift = e+q
   5721     if shift >= 0:
   5722         cshift = c*10**shift
   5723     else:
   5724         cshift = c//10**-shift
   5725     quot, rem = divmod(cshift, _log10_digits(q))
   5726 
   5727     # reduce remainder back to original precision

   5728     rem = _div_nearest(rem, 10**extra)
   5729 
   5730     # error in result of _iexp < 120;  error after division < 0.62

   5731     return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
   5732 
   5733 def _dpower(xc, xe, yc, ye, p):
   5734     """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
   5735     y = yc*10**ye, compute x**y.  Returns a pair of integers (c, e) such that:
   5736 
   5737       10**(p-1) <= c <= 10**p, and
   5738       (c-1)*10**e < x**y < (c+1)*10**e
   5739 
   5740     in other words, c*10**e is an approximation to x**y with p digits
   5741     of precision, and with an error in c of at most 1.  (This is
   5742     almost, but not quite, the same as the error being < 1ulp: when c
   5743     == 10**(p-1) we can only guarantee error < 10ulp.)
   5744 
   5745     We assume that: x is positive and not equal to 1, and y is nonzero.
   5746     """
   5747 
   5748     # Find b such that 10**(b-1) <= |y| <= 10**b

   5749     b = len(str(abs(yc))) + ye
   5750 
   5751     # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point

   5752     lxc = _dlog(xc, xe, p+b+1)
   5753 
   5754     # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)

   5755     shift = ye-b
   5756     if shift >= 0:
   5757         pc = lxc*yc*10**shift
   5758     else:
   5759         pc = _div_nearest(lxc*yc, 10**-shift)
   5760 
   5761     if pc == 0:
   5762         # we prefer a result that isn't exactly 1; this makes it

   5763         # easier to compute a correctly rounded result in __pow__

   5764         if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:

   5765             coeff, exp = 10**(p-1)+1, 1-p
   5766         else:
   5767             coeff, exp = 10**p-1, -p
   5768     else:
   5769         coeff, exp = _dexp(pc, -(p+1), p+1)
   5770         coeff = _div_nearest(coeff, 10)
   5771         exp += 1
   5772 
   5773     return coeff, exp
   5774 
   5775 def _log10_lb(c, correction = {
   5776         '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
   5777         '6': 23, '7': 16, '8': 10, '9': 5}):
   5778     """Compute a lower bound for 100*log10(c) for a positive integer c."""
   5779     if c <= 0:
   5780         raise ValueError("The argument to _log10_lb should be nonnegative.")
   5781     str_c = str(c)
   5782     return 100*len(str_c) - correction[str_c[0]]
   5783 
   5784 ##### Helper Functions ####################################################

   5785 
   5786 def _convert_other(other, raiseit=False, allow_float=False):
   5787     """Convert other to Decimal.
   5788 
   5789     Verifies that it's ok to use in an implicit construction.
   5790     If allow_float is true, allow conversion from float;  this
   5791     is used in the comparison methods (__eq__ and friends).
   5792 
   5793     """
   5794     if isinstance(other, Decimal):
   5795         return other
   5796     if isinstance(other, (int, long)):
   5797         return Decimal(other)
   5798     if allow_float and isinstance(other, float):
   5799         return Decimal.from_float(other)
   5800 
   5801     if raiseit:
   5802         raise TypeError("Unable to convert %s to Decimal" % other)
   5803     return NotImplemented
   5804 
   5805 ##### Setup Specific Contexts ############################################

   5806 
   5807 # The default context prototype used by Context()

   5808 # Is mutable, so that new contexts can have different default values

   5809 
   5810 DefaultContext = Context(
   5811         prec=28, rounding=ROUND_HALF_EVEN,
   5812         traps=[DivisionByZero, Overflow, InvalidOperation],
   5813         flags=[],
   5814         Emax=999999999,
   5815         Emin=-999999999,
   5816         capitals=1
   5817 )
   5818 
   5819 # Pre-made alternate contexts offered by the specification

   5820 # Don't change these; the user should be able to select these

   5821 # contexts and be able to reproduce results from other implementations

   5822 # of the spec.

   5823 
   5824 BasicContext = Context(
   5825         prec=9, rounding=ROUND_HALF_UP,
   5826         traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
   5827         flags=[],
   5828 )
   5829 
   5830 ExtendedContext = Context(
   5831         prec=9, rounding=ROUND_HALF_EVEN,
   5832         traps=[],
   5833         flags=[],
   5834 )
   5835 
   5836 
   5837 ##### crud for parsing strings #############################################

   5838 #

   5839 # Regular expression used for parsing numeric strings.  Additional

   5840 # comments:

   5841 #

   5842 # 1. Uncomment the two '\s*' lines to allow leading and/or trailing

   5843 # whitespace.  But note that the specification disallows whitespace in

   5844 # a numeric string.

   5845 #

   5846 # 2. For finite numbers (not infinities and NaNs) the body of the

   5847 # number between the optional sign and the optional exponent must have

   5848 # at least one decimal digit, possibly after the decimal point.  The

   5849 # lookahead expression '(?=\d|\.\d)' checks this.

   5850 
   5851 import re
   5852 _parser = re.compile(r"""        # A numeric string consists of:
   5853 #    \s*
   5854     (?P<sign>[-+])?              # an optional sign, followed by either...
   5855     (
   5856         (?=\d|\.\d)              # ...a number (with at least one digit)
   5857         (?P<int>\d*)             # having a (possibly empty) integer part
   5858         (\.(?P<frac>\d*))?       # followed by an optional fractional part
   5859         (E(?P<exp>[-+]?\d+))?    # followed by an optional exponent, or...
   5860     |
   5861         Inf(inity)?              # ...an infinity, or...
   5862     |
   5863         (?P<signal>s)?           # ...an (optionally signaling)
   5864         NaN                      # NaN
   5865         (?P<diag>\d*)            # with (possibly empty) diagnostic info.
   5866     )
   5867 #    \s*
   5868     \Z
   5869 """, re.VERBOSE | re.IGNORECASE | re.UNICODE).match
   5870 
   5871 _all_zeros = re.compile('0*$').match
   5872 _exact_half = re.compile('50*$').match
   5873 
   5874 ##### PEP3101 support functions ##############################################

   5875 # The functions in this section have little to do with the Decimal

   5876 # class, and could potentially be reused or adapted for other pure

   5877 # Python numeric classes that want to implement __format__

   5878 #

   5879 # A format specifier for Decimal looks like:

   5880 #

   5881 #   [[fill]align][sign][0][minimumwidth][,][.precision][type]

   5882 
   5883 _parse_format_specifier_regex = re.compile(r"""\A
   5884 (?:
   5885    (?P<fill>.)?
   5886    (?P<align>[<>=^])
   5887 )?
   5888 (?P<sign>[-+ ])?
   5889 (?P<zeropad>0)?
   5890 (?P<minimumwidth>(?!0)\d+)?
   5891 (?P<thousands_sep>,)?
   5892 (?:\.(?P<precision>0|(?!0)\d+))?
   5893 (?P<type>[eEfFgGn%])?
   5894 \Z
   5895 """, re.VERBOSE)
   5896 
   5897 del re
   5898 
   5899 # The locale module is only needed for the 'n' format specifier.  The

   5900 # rest of the PEP 3101 code functions quite happily without it, so we

   5901 # don't care too much if locale isn't present.

   5902 try:
   5903     import locale as _locale
   5904 except ImportError:
   5905     pass
   5906 
   5907 def _parse_format_specifier(format_spec, _localeconv=None):
   5908     """Parse and validate a format specifier.
   5909 
   5910     Turns a standard numeric format specifier into a dict, with the
   5911     following entries:
   5912 
   5913       fill: fill character to pad field to minimum width
   5914       align: alignment type, either '<', '>', '=' or '^'
   5915       sign: either '+', '-' or ' '
   5916       minimumwidth: nonnegative integer giving minimum width
   5917       zeropad: boolean, indicating whether to pad with zeros
   5918       thousands_sep: string to use as thousands separator, or ''
   5919       grouping: grouping for thousands separators, in format
   5920         used by localeconv
   5921       decimal_point: string to use for decimal point
   5922       precision: nonnegative integer giving precision, or None
   5923       type: one of the characters 'eEfFgG%', or None
   5924       unicode: boolean (always True for Python 3.x)
   5925 
   5926     """
   5927     m = _parse_format_specifier_regex.match(format_spec)
   5928     if m is None:
   5929         raise ValueError("Invalid format specifier: " + format_spec)
   5930 
   5931     # get the dictionary

   5932     format_dict = m.groupdict()
   5933 
   5934     # zeropad; defaults for fill and alignment.  If zero padding

   5935     # is requested, the fill and align fields should be absent.

   5936     fill = format_dict['fill']
   5937     align = format_dict['align']
   5938     format_dict['zeropad'] = (format_dict['zeropad'] is not None)
   5939     if format_dict['zeropad']:
   5940         if fill is not None:
   5941             raise ValueError("Fill character conflicts with '0'"
   5942                              " in format specifier: " + format_spec)
   5943         if align is not None:
   5944             raise ValueError("Alignment conflicts with '0' in "
   5945                              "format specifier: " + format_spec)
   5946     format_dict['fill'] = fill or ' '
   5947     # PEP 3101 originally specified that the default alignment should

   5948     # be left;  it was later agreed that right-aligned makes more sense

   5949     # for numeric types.  See http://bugs.python.org/issue6857.

   5950     format_dict['align'] = align or '>'
   5951 
   5952     # default sign handling: '-' for negative, '' for positive

   5953     if format_dict['sign'] is None:
   5954         format_dict['sign'] = '-'
   5955 
   5956     # minimumwidth defaults to 0; precision remains None if not given

   5957     format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
   5958     if format_dict['precision'] is not None:
   5959         format_dict['precision'] = int(format_dict['precision'])
   5960 
   5961     # if format type is 'g' or 'G' then a precision of 0 makes little

   5962     # sense; convert it to 1.  Same if format type is unspecified.

   5963     if format_dict['precision'] == 0:
   5964         if format_dict['type'] is None or format_dict['type'] in 'gG':
   5965             format_dict['precision'] = 1
   5966 
   5967     # determine thousands separator, grouping, and decimal separator, and

   5968     # add appropriate entries to format_dict

   5969     if format_dict['type'] == 'n':
   5970         # apart from separators, 'n' behaves just like 'g'

   5971         format_dict['type'] = 'g'
   5972         if _localeconv is None:
   5973             _localeconv = _locale.localeconv()
   5974         if format_dict['thousands_sep'] is not None:
   5975             raise ValueError("Explicit thousands separator conflicts with "
   5976                              "'n' type in format specifier: " + format_spec)
   5977         format_dict['thousands_sep'] = _localeconv['thousands_sep']
   5978         format_dict['grouping'] = _localeconv['grouping']
   5979         format_dict['decimal_point'] = _localeconv['decimal_point']
   5980     else:
   5981         if format_dict['thousands_sep'] is None:
   5982             format_dict['thousands_sep'] = ''
   5983         format_dict['grouping'] = [3, 0]
   5984         format_dict['decimal_point'] = '.'
   5985 
   5986     # record whether return type should be str or unicode

   5987     format_dict['unicode'] = isinstance(format_spec, unicode)
   5988 
   5989     return format_dict
   5990 
   5991 def _format_align(sign, body, spec):
   5992     """Given an unpadded, non-aligned numeric string 'body' and sign
   5993     string 'sign', add padding and alignment conforming to the given
   5994     format specifier dictionary 'spec' (as produced by
   5995     parse_format_specifier).
   5996 
   5997     Also converts result to unicode if necessary.
   5998 
   5999     """
   6000     # how much extra space do we have to play with?

   6001     minimumwidth = spec['minimumwidth']
   6002     fill = spec['fill']
   6003     padding = fill*(minimumwidth - len(sign) - len(body))
   6004 
   6005     align = spec['align']
   6006     if align == '<':
   6007         result = sign + body + padding
   6008     elif align == '>':
   6009         result = padding + sign + body
   6010     elif align == '=':
   6011         result = sign + padding + body
   6012     elif align == '^':
   6013         half = len(padding)//2
   6014         result = padding[:half] + sign + body + padding[half:]
   6015     else:
   6016         raise ValueError('Unrecognised alignment field')
   6017 
   6018     # make sure that result is unicode if necessary

   6019     if spec['unicode']:
   6020         result = unicode(result)
   6021 
   6022     return result
   6023 
   6024 def _group_lengths(grouping):
   6025     """Convert a localeconv-style grouping into a (possibly infinite)
   6026     iterable of integers representing group lengths.
   6027 
   6028     """
   6029     # The result from localeconv()['grouping'], and the input to this

   6030     # function, should be a list of integers in one of the

   6031     # following three forms:

   6032     #

   6033     #   (1) an empty list, or

   6034     #   (2) nonempty list of positive integers + [0]

   6035     #   (3) list of positive integers + [locale.CHAR_MAX], or

   6036 
   6037     from itertools import chain, repeat
   6038     if not grouping:
   6039         return []
   6040     elif grouping[-1] == 0 and len(grouping) >= 2:
   6041         return chain(grouping[:-1], repeat(grouping[-2]))
   6042     elif grouping[-1] == _locale.CHAR_MAX:
   6043         return grouping[:-1]
   6044     else:
   6045         raise ValueError('unrecognised format for grouping')
   6046 
   6047 def _insert_thousands_sep(digits, spec, min_width=1):
   6048     """Insert thousands separators into a digit string.
   6049 
   6050     spec is a dictionary whose keys should include 'thousands_sep' and
   6051     'grouping'; typically it's the result of parsing the format
   6052     specifier using _parse_format_specifier.
   6053 
   6054     The min_width keyword argument gives the minimum length of the
   6055     result, which will be padded on the left with zeros if necessary.
   6056 
   6057     If necessary, the zero padding adds an extra '0' on the left to
   6058     avoid a leading thousands separator.  For example, inserting
   6059     commas every three digits in '123456', with min_width=8, gives
   6060     '0,123,456', even though that has length 9.
   6061 
   6062     """
   6063 
   6064     sep = spec['thousands_sep']
   6065     grouping = spec['grouping']
   6066 
   6067     groups = []
   6068     for l in _group_lengths(grouping):
   6069         if l <= 0:
   6070             raise ValueError("group length should be positive")
   6071         # max(..., 1) forces at least 1 digit to the left of a separator

   6072         l = min(max(len(digits), min_width, 1), l)
   6073         groups.append('0'*(l - len(digits)) + digits[-l:])
   6074         digits = digits[:-l]
   6075         min_width -= l
   6076         if not digits and min_width <= 0:
   6077             break
   6078         min_width -= len(sep)
   6079     else:
   6080         l = max(len(digits), min_width, 1)
   6081         groups.append('0'*(l - len(digits)) + digits[-l:])
   6082     return sep.join(reversed(groups))
   6083 
   6084 def _format_sign(is_negative, spec):
   6085     """Determine sign character."""
   6086 
   6087     if is_negative:
   6088         return '-'
   6089     elif spec['sign'] in ' +':
   6090         return spec['sign']
   6091     else:
   6092         return ''
   6093 
   6094 def _format_number(is_negative, intpart, fracpart, exp, spec):
   6095     """Format a number, given the following data:
   6096 
   6097     is_negative: true if the number is negative, else false
   6098     intpart: string of digits that must appear before the decimal point
   6099     fracpart: string of digits that must come after the point
   6100     exp: exponent, as an integer
   6101     spec: dictionary resulting from parsing the format specifier
   6102 
   6103     This function uses the information in spec to:
   6104       insert separators (decimal separator and thousands separators)
   6105       format the sign
   6106       format the exponent
   6107       add trailing '%' for the '%' type
   6108       zero-pad if necessary
   6109       fill and align if necessary
   6110     """
   6111 
   6112     sign = _format_sign(is_negative, spec)
   6113 
   6114     if fracpart:
   6115         fracpart = spec['decimal_point'] + fracpart
   6116 
   6117     if exp != 0 or spec['type'] in 'eE':
   6118         echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
   6119         fracpart += "{0}{1:+}".format(echar, exp)
   6120     if spec['type'] == '%':
   6121         fracpart += '%'
   6122 
   6123     if spec['zeropad']:
   6124         min_width = spec['minimumwidth'] - len(fracpart) - len(sign)
   6125     else:
   6126         min_width = 0
   6127     intpart = _insert_thousands_sep(intpart, spec, min_width)
   6128 
   6129     return _format_align(sign, intpart+fracpart, spec)
   6130 
   6131 
   6132 ##### Useful Constants (internal use only) ################################

   6133 
   6134 # Reusable defaults

   6135 _Infinity = Decimal('Inf')
   6136 _NegativeInfinity = Decimal('-Inf')
   6137 _NaN = Decimal('NaN')
   6138 _Zero = Decimal(0)
   6139 _One = Decimal(1)
   6140 _NegativeOne = Decimal(-1)
   6141 
   6142 # _SignedInfinity[sign] is infinity w/ that sign

   6143 _SignedInfinity = (_Infinity, _NegativeInfinity)
   6144 
   6145 
   6146 
   6147 if __name__ == '__main__':
   6148     import doctest, sys
   6149     doctest.testmod(sys.modules[__name__])
   6150