python-2.5.2/win32/Lib/decimal.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     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 import copy as _copy
       
   138 
       
   139 # Rounding
       
   140 ROUND_DOWN = 'ROUND_DOWN'
       
   141 ROUND_HALF_UP = 'ROUND_HALF_UP'
       
   142 ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
       
   143 ROUND_CEILING = 'ROUND_CEILING'
       
   144 ROUND_FLOOR = 'ROUND_FLOOR'
       
   145 ROUND_UP = 'ROUND_UP'
       
   146 ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
       
   147 ROUND_05UP = 'ROUND_05UP'
       
   148 
       
   149 # Errors
       
   150 
       
   151 class DecimalException(ArithmeticError):
       
   152     """Base exception class.
       
   153 
       
   154     Used exceptions derive from this.
       
   155     If an exception derives from another exception besides this (such as
       
   156     Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
       
   157     called if the others are present.  This isn't actually used for
       
   158     anything, though.
       
   159 
       
   160     handle  -- Called when context._raise_error is called and the
       
   161                trap_enabler is set.  First argument is self, second is the
       
   162                context.  More arguments can be given, those being after
       
   163                the explanation in _raise_error (For example,
       
   164                context._raise_error(NewError, '(-x)!', self._sign) would
       
   165                call NewError().handle(context, self._sign).)
       
   166 
       
   167     To define a new exception, it should be sufficient to have it derive
       
   168     from DecimalException.
       
   169     """
       
   170     def handle(self, context, *args):
       
   171         pass
       
   172 
       
   173 
       
   174 class Clamped(DecimalException):
       
   175     """Exponent of a 0 changed to fit bounds.
       
   176 
       
   177     This occurs and signals clamped if the exponent of a result has been
       
   178     altered in order to fit the constraints of a specific concrete
       
   179     representation.  This may occur when the exponent of a zero result would
       
   180     be outside the bounds of a representation, or when a large normal
       
   181     number would have an encoded exponent that cannot be represented.  In
       
   182     this latter case, the exponent is reduced to fit and the corresponding
       
   183     number of zero digits are appended to the coefficient ("fold-down").
       
   184     """
       
   185 
       
   186 class InvalidOperation(DecimalException):
       
   187     """An invalid operation was performed.
       
   188 
       
   189     Various bad things cause this:
       
   190 
       
   191     Something creates a signaling NaN
       
   192     -INF + INF
       
   193     0 * (+-)INF
       
   194     (+-)INF / (+-)INF
       
   195     x % 0
       
   196     (+-)INF % x
       
   197     x._rescale( non-integer )
       
   198     sqrt(-x) , x > 0
       
   199     0 ** 0
       
   200     x ** (non-integer)
       
   201     x ** (+-)INF
       
   202     An operand is invalid
       
   203 
       
   204     The result of the operation after these is a quiet positive NaN,
       
   205     except when the cause is a signaling NaN, in which case the result is
       
   206     also a quiet NaN, but with the original sign, and an optional
       
   207     diagnostic information.
       
   208     """
       
   209     def handle(self, context, *args):
       
   210         if args:
       
   211             ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
       
   212             return ans._fix_nan(context)
       
   213         return NaN
       
   214 
       
   215 class ConversionSyntax(InvalidOperation):
       
   216     """Trying to convert badly formed string.
       
   217 
       
   218     This occurs and signals invalid-operation if an string is being
       
   219     converted to a number and it does not conform to the numeric string
       
   220     syntax.  The result is [0,qNaN].
       
   221     """
       
   222     def handle(self, context, *args):
       
   223         return NaN
       
   224 
       
   225 class DivisionByZero(DecimalException, ZeroDivisionError):
       
   226     """Division by 0.
       
   227 
       
   228     This occurs and signals division-by-zero if division of a finite number
       
   229     by zero was attempted (during a divide-integer or divide operation, or a
       
   230     power operation with negative right-hand operand), and the dividend was
       
   231     not zero.
       
   232 
       
   233     The result of the operation is [sign,inf], where sign is the exclusive
       
   234     or of the signs of the operands for divide, or is 1 for an odd power of
       
   235     -0, for power.
       
   236     """
       
   237 
       
   238     def handle(self, context, sign, *args):
       
   239         return Infsign[sign]
       
   240 
       
   241 class DivisionImpossible(InvalidOperation):
       
   242     """Cannot perform the division adequately.
       
   243 
       
   244     This occurs and signals invalid-operation if the integer result of a
       
   245     divide-integer or remainder operation had too many digits (would be
       
   246     longer than precision).  The result is [0,qNaN].
       
   247     """
       
   248 
       
   249     def handle(self, context, *args):
       
   250         return NaN
       
   251 
       
   252 class DivisionUndefined(InvalidOperation, ZeroDivisionError):
       
   253     """Undefined result of division.
       
   254 
       
   255     This occurs and signals invalid-operation if division by zero was
       
   256     attempted (during a divide-integer, divide, or remainder operation), and
       
   257     the dividend is also zero.  The result is [0,qNaN].
       
   258     """
       
   259 
       
   260     def handle(self, context, *args):
       
   261         return NaN
       
   262 
       
   263 class Inexact(DecimalException):
       
   264     """Had to round, losing information.
       
   265 
       
   266     This occurs and signals inexact whenever the result of an operation is
       
   267     not exact (that is, it needed to be rounded and any discarded digits
       
   268     were non-zero), or if an overflow or underflow condition occurs.  The
       
   269     result in all cases is unchanged.
       
   270 
       
   271     The inexact signal may be tested (or trapped) to determine if a given
       
   272     operation (or sequence of operations) was inexact.
       
   273     """
       
   274 
       
   275 class InvalidContext(InvalidOperation):
       
   276     """Invalid context.  Unknown rounding, for example.
       
   277 
       
   278     This occurs and signals invalid-operation if an invalid context was
       
   279     detected during an operation.  This can occur if contexts are not checked
       
   280     on creation and either the precision exceeds the capability of the
       
   281     underlying concrete representation or an unknown or unsupported rounding
       
   282     was specified.  These aspects of the context need only be checked when
       
   283     the values are required to be used.  The result is [0,qNaN].
       
   284     """
       
   285 
       
   286     def handle(self, context, *args):
       
   287         return NaN
       
   288 
       
   289 class Rounded(DecimalException):
       
   290     """Number got rounded (not  necessarily changed during rounding).
       
   291 
       
   292     This occurs and signals rounded whenever the result of an operation is
       
   293     rounded (that is, some zero or non-zero digits were discarded from the
       
   294     coefficient), or if an overflow or underflow condition occurs.  The
       
   295     result in all cases is unchanged.
       
   296 
       
   297     The rounded signal may be tested (or trapped) to determine if a given
       
   298     operation (or sequence of operations) caused a loss of precision.
       
   299     """
       
   300 
       
   301 class Subnormal(DecimalException):
       
   302     """Exponent < Emin before rounding.
       
   303 
       
   304     This occurs and signals subnormal whenever the result of a conversion or
       
   305     operation is subnormal (that is, its adjusted exponent is less than
       
   306     Emin, before any rounding).  The result in all cases is unchanged.
       
   307 
       
   308     The subnormal signal may be tested (or trapped) to determine if a given
       
   309     or operation (or sequence of operations) yielded a subnormal result.
       
   310     """
       
   311 
       
   312 class Overflow(Inexact, Rounded):
       
   313     """Numerical overflow.
       
   314 
       
   315     This occurs and signals overflow if the adjusted exponent of a result
       
   316     (from a conversion or from an operation that is not an attempt to divide
       
   317     by zero), after rounding, would be greater than the largest value that
       
   318     can be handled by the implementation (the value Emax).
       
   319 
       
   320     The result depends on the rounding mode:
       
   321 
       
   322     For round-half-up and round-half-even (and for round-half-down and
       
   323     round-up, if implemented), the result of the operation is [sign,inf],
       
   324     where sign is the sign of the intermediate result.  For round-down, the
       
   325     result is the largest finite number that can be represented in the
       
   326     current precision, with the sign of the intermediate result.  For
       
   327     round-ceiling, the result is the same as for round-down if the sign of
       
   328     the intermediate result is 1, or is [0,inf] otherwise.  For round-floor,
       
   329     the result is the same as for round-down if the sign of the intermediate
       
   330     result is 0, or is [1,inf] otherwise.  In all cases, Inexact and Rounded
       
   331     will also be raised.
       
   332     """
       
   333 
       
   334     def handle(self, context, sign, *args):
       
   335         if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
       
   336                                 ROUND_HALF_DOWN, ROUND_UP):
       
   337             return Infsign[sign]
       
   338         if sign == 0:
       
   339             if context.rounding == ROUND_CEILING:
       
   340                 return Infsign[sign]
       
   341             return _dec_from_triple(sign, '9'*context.prec,
       
   342                             context.Emax-context.prec+1)
       
   343         if sign == 1:
       
   344             if context.rounding == ROUND_FLOOR:
       
   345                 return Infsign[sign]
       
   346             return _dec_from_triple(sign, '9'*context.prec,
       
   347                              context.Emax-context.prec+1)
       
   348 
       
   349 
       
   350 class Underflow(Inexact, Rounded, Subnormal):
       
   351     """Numerical underflow with result rounded to 0.
       
   352 
       
   353     This occurs and signals underflow if a result is inexact and the
       
   354     adjusted exponent of the result would be smaller (more negative) than
       
   355     the smallest value that can be handled by the implementation (the value
       
   356     Emin).  That is, the result is both inexact and subnormal.
       
   357 
       
   358     The result after an underflow will be a subnormal number rounded, if
       
   359     necessary, so that its exponent is not less than Etiny.  This may result
       
   360     in 0 with the sign of the intermediate result and an exponent of Etiny.
       
   361 
       
   362     In all cases, Inexact, Rounded, and Subnormal will also be raised.
       
   363     """
       
   364 
       
   365 # List of public traps and flags
       
   366 _signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
       
   367            Underflow, InvalidOperation, Subnormal]
       
   368 
       
   369 # Map conditions (per the spec) to signals
       
   370 _condition_map = {ConversionSyntax:InvalidOperation,
       
   371                   DivisionImpossible:InvalidOperation,
       
   372                   DivisionUndefined:InvalidOperation,
       
   373                   InvalidContext:InvalidOperation}
       
   374 
       
   375 ##### Context Functions ##################################################
       
   376 
       
   377 # The getcontext() and setcontext() function manage access to a thread-local
       
   378 # current context.  Py2.4 offers direct support for thread locals.  If that
       
   379 # is not available, use threading.currentThread() which is slower but will
       
   380 # work for older Pythons.  If threads are not part of the build, create a
       
   381 # mock threading object with threading.local() returning the module namespace.
       
   382 
       
   383 try:
       
   384     import threading
       
   385 except ImportError:
       
   386     # Python was compiled without threads; create a mock object instead
       
   387     import sys
       
   388     class MockThreading(object):
       
   389         def local(self, sys=sys):
       
   390             return sys.modules[__name__]
       
   391     threading = MockThreading()
       
   392     del sys, MockThreading
       
   393 
       
   394 try:
       
   395     threading.local
       
   396 
       
   397 except AttributeError:
       
   398 
       
   399     # To fix reloading, force it to create a new context
       
   400     # Old contexts have different exceptions in their dicts, making problems.
       
   401     if hasattr(threading.currentThread(), '__decimal_context__'):
       
   402         del threading.currentThread().__decimal_context__
       
   403 
       
   404     def setcontext(context):
       
   405         """Set this thread's context to context."""
       
   406         if context in (DefaultContext, BasicContext, ExtendedContext):
       
   407             context = context.copy()
       
   408             context.clear_flags()
       
   409         threading.currentThread().__decimal_context__ = context
       
   410 
       
   411     def getcontext():
       
   412         """Returns this thread's context.
       
   413 
       
   414         If this thread does not yet have a context, returns
       
   415         a new context and sets this thread's context.
       
   416         New contexts are copies of DefaultContext.
       
   417         """
       
   418         try:
       
   419             return threading.currentThread().__decimal_context__
       
   420         except AttributeError:
       
   421             context = Context()
       
   422             threading.currentThread().__decimal_context__ = context
       
   423             return context
       
   424 
       
   425 else:
       
   426 
       
   427     local = threading.local()
       
   428     if hasattr(local, '__decimal_context__'):
       
   429         del local.__decimal_context__
       
   430 
       
   431     def getcontext(_local=local):
       
   432         """Returns this thread's context.
       
   433 
       
   434         If this thread does not yet have a context, returns
       
   435         a new context and sets this thread's context.
       
   436         New contexts are copies of DefaultContext.
       
   437         """
       
   438         try:
       
   439             return _local.__decimal_context__
       
   440         except AttributeError:
       
   441             context = Context()
       
   442             _local.__decimal_context__ = context
       
   443             return context
       
   444 
       
   445     def setcontext(context, _local=local):
       
   446         """Set this thread's context to context."""
       
   447         if context in (DefaultContext, BasicContext, ExtendedContext):
       
   448             context = context.copy()
       
   449             context.clear_flags()
       
   450         _local.__decimal_context__ = context
       
   451 
       
   452     del threading, local        # Don't contaminate the namespace
       
   453 
       
   454 def localcontext(ctx=None):
       
   455     """Return a context manager for a copy of the supplied context
       
   456 
       
   457     Uses a copy of the current context if no context is specified
       
   458     The returned context manager creates a local decimal context
       
   459     in a with statement:
       
   460         def sin(x):
       
   461              with localcontext() as ctx:
       
   462                  ctx.prec += 2
       
   463                  # Rest of sin calculation algorithm
       
   464                  # uses a precision 2 greater than normal
       
   465              return +s  # Convert result to normal precision
       
   466 
       
   467          def sin(x):
       
   468              with localcontext(ExtendedContext):
       
   469                  # Rest of sin calculation algorithm
       
   470                  # uses the Extended Context from the
       
   471                  # General Decimal Arithmetic Specification
       
   472              return +s  # Convert result to normal context
       
   473 
       
   474     """
       
   475     # The string below can't be included in the docstring until Python 2.6
       
   476     # as the doctest module doesn't understand __future__ statements
       
   477     """
       
   478     >>> from __future__ import with_statement
       
   479     >>> print getcontext().prec
       
   480     28
       
   481     >>> with localcontext():
       
   482     ...     ctx = getcontext()
       
   483     ...     ctx.prec += 2
       
   484     ...     print ctx.prec
       
   485     ...
       
   486     30
       
   487     >>> with localcontext(ExtendedContext):
       
   488     ...     print getcontext().prec
       
   489     ...
       
   490     9
       
   491     >>> print getcontext().prec
       
   492     28
       
   493     """
       
   494     if ctx is None: ctx = getcontext()
       
   495     return _ContextManager(ctx)
       
   496 
       
   497 
       
   498 ##### Decimal class #######################################################
       
   499 
       
   500 class Decimal(object):
       
   501     """Floating point class for decimal arithmetic."""
       
   502 
       
   503     __slots__ = ('_exp','_int','_sign', '_is_special')
       
   504     # Generally, the value of the Decimal instance is given by
       
   505     #  (-1)**_sign * _int * 10**_exp
       
   506     # Special values are signified by _is_special == True
       
   507 
       
   508     # We're immutable, so use __new__ not __init__
       
   509     def __new__(cls, value="0", context=None):
       
   510         """Create a decimal point instance.
       
   511 
       
   512         >>> Decimal('3.14')              # string input
       
   513         Decimal("3.14")
       
   514         >>> Decimal((0, (3, 1, 4), -2))  # tuple (sign, digit_tuple, exponent)
       
   515         Decimal("3.14")
       
   516         >>> Decimal(314)                 # int or long
       
   517         Decimal("314")
       
   518         >>> Decimal(Decimal(314))        # another decimal instance
       
   519         Decimal("314")
       
   520         """
       
   521 
       
   522         # Note that the coefficient, self._int, is actually stored as
       
   523         # a string rather than as a tuple of digits.  This speeds up
       
   524         # the "digits to integer" and "integer to digits" conversions
       
   525         # that are used in almost every arithmetic operation on
       
   526         # Decimals.  This is an internal detail: the as_tuple function
       
   527         # and the Decimal constructor still deal with tuples of
       
   528         # digits.
       
   529 
       
   530         self = object.__new__(cls)
       
   531 
       
   532         # From a string
       
   533         # REs insist on real strings, so we can too.
       
   534         if isinstance(value, basestring):
       
   535             m = _parser(value)
       
   536             if m is None:
       
   537                 if context is None:
       
   538                     context = getcontext()
       
   539                 return context._raise_error(ConversionSyntax,
       
   540                                 "Invalid literal for Decimal: %r" % value)
       
   541 
       
   542             if m.group('sign') == "-":
       
   543                 self._sign = 1
       
   544             else:
       
   545                 self._sign = 0
       
   546             intpart = m.group('int')
       
   547             if intpart is not None:
       
   548                 # finite number
       
   549                 fracpart = m.group('frac')
       
   550                 exp = int(m.group('exp') or '0')
       
   551                 if fracpart is not None:
       
   552                     self._int = (intpart+fracpart).lstrip('0') or '0'
       
   553                     self._exp = exp - len(fracpart)
       
   554                 else:
       
   555                     self._int = intpart.lstrip('0') or '0'
       
   556                     self._exp = exp
       
   557                 self._is_special = False
       
   558             else:
       
   559                 diag = m.group('diag')
       
   560                 if diag is not None:
       
   561                     # NaN
       
   562                     self._int = diag.lstrip('0')
       
   563                     if m.group('signal'):
       
   564                         self._exp = 'N'
       
   565                     else:
       
   566                         self._exp = 'n'
       
   567                 else:
       
   568                     # infinity
       
   569                     self._int = '0'
       
   570                     self._exp = 'F'
       
   571                 self._is_special = True
       
   572             return self
       
   573 
       
   574         # From an integer
       
   575         if isinstance(value, (int,long)):
       
   576             if value >= 0:
       
   577                 self._sign = 0
       
   578             else:
       
   579                 self._sign = 1
       
   580             self._exp = 0
       
   581             self._int = str(abs(value))
       
   582             self._is_special = False
       
   583             return self
       
   584 
       
   585         # From another decimal
       
   586         if isinstance(value, Decimal):
       
   587             self._exp  = value._exp
       
   588             self._sign = value._sign
       
   589             self._int  = value._int
       
   590             self._is_special  = value._is_special
       
   591             return self
       
   592 
       
   593         # From an internal working value
       
   594         if isinstance(value, _WorkRep):
       
   595             self._sign = value.sign
       
   596             self._int = str(value.int)
       
   597             self._exp = int(value.exp)
       
   598             self._is_special = False
       
   599             return self
       
   600 
       
   601         # tuple/list conversion (possibly from as_tuple())
       
   602         if isinstance(value, (list,tuple)):
       
   603             if len(value) != 3:
       
   604                 raise ValueError('Invalid tuple size in creation of Decimal '
       
   605                                  'from list or tuple.  The list or tuple '
       
   606                                  'should have exactly three elements.')
       
   607             # process sign.  The isinstance test rejects floats
       
   608             if not (isinstance(value[0], (int, long)) and value[0] in (0,1)):
       
   609                 raise ValueError("Invalid sign.  The first value in the tuple "
       
   610                                  "should be an integer; either 0 for a "
       
   611                                  "positive number or 1 for a negative number.")
       
   612             self._sign = value[0]
       
   613             if value[2] == 'F':
       
   614                 # infinity: value[1] is ignored
       
   615                 self._int = '0'
       
   616                 self._exp = value[2]
       
   617                 self._is_special = True
       
   618             else:
       
   619                 # process and validate the digits in value[1]
       
   620                 digits = []
       
   621                 for digit in value[1]:
       
   622                     if isinstance(digit, (int, long)) and 0 <= digit <= 9:
       
   623                         # skip leading zeros
       
   624                         if digits or digit != 0:
       
   625                             digits.append(digit)
       
   626                     else:
       
   627                         raise ValueError("The second value in the tuple must "
       
   628                                          "be composed of integers in the range "
       
   629                                          "0 through 9.")
       
   630                 if value[2] in ('n', 'N'):
       
   631                     # NaN: digits form the diagnostic
       
   632                     self._int = ''.join(map(str, digits))
       
   633                     self._exp = value[2]
       
   634                     self._is_special = True
       
   635                 elif isinstance(value[2], (int, long)):
       
   636                     # finite number: digits give the coefficient
       
   637                     self._int = ''.join(map(str, digits or [0]))
       
   638                     self._exp = value[2]
       
   639                     self._is_special = False
       
   640                 else:
       
   641                     raise ValueError("The third value in the tuple must "
       
   642                                      "be an integer, or one of the "
       
   643                                      "strings 'F', 'n', 'N'.")
       
   644             return self
       
   645 
       
   646         if isinstance(value, float):
       
   647             raise TypeError("Cannot convert float to Decimal.  " +
       
   648                             "First convert the float to a string")
       
   649 
       
   650         raise TypeError("Cannot convert %r to Decimal" % value)
       
   651 
       
   652     def _isnan(self):
       
   653         """Returns whether the number is not actually one.
       
   654 
       
   655         0 if a number
       
   656         1 if NaN
       
   657         2 if sNaN
       
   658         """
       
   659         if self._is_special:
       
   660             exp = self._exp
       
   661             if exp == 'n':
       
   662                 return 1
       
   663             elif exp == 'N':
       
   664                 return 2
       
   665         return 0
       
   666 
       
   667     def _isinfinity(self):
       
   668         """Returns whether the number is infinite
       
   669 
       
   670         0 if finite or not a number
       
   671         1 if +INF
       
   672         -1 if -INF
       
   673         """
       
   674         if self._exp == 'F':
       
   675             if self._sign:
       
   676                 return -1
       
   677             return 1
       
   678         return 0
       
   679 
       
   680     def _check_nans(self, other=None, context=None):
       
   681         """Returns whether the number is not actually one.
       
   682 
       
   683         if self, other are sNaN, signal
       
   684         if self, other are NaN return nan
       
   685         return 0
       
   686 
       
   687         Done before operations.
       
   688         """
       
   689 
       
   690         self_is_nan = self._isnan()
       
   691         if other is None:
       
   692             other_is_nan = False
       
   693         else:
       
   694             other_is_nan = other._isnan()
       
   695 
       
   696         if self_is_nan or other_is_nan:
       
   697             if context is None:
       
   698                 context = getcontext()
       
   699 
       
   700             if self_is_nan == 2:
       
   701                 return context._raise_error(InvalidOperation, 'sNaN',
       
   702                                         self)
       
   703             if other_is_nan == 2:
       
   704                 return context._raise_error(InvalidOperation, 'sNaN',
       
   705                                         other)
       
   706             if self_is_nan:
       
   707                 return self._fix_nan(context)
       
   708 
       
   709             return other._fix_nan(context)
       
   710         return 0
       
   711 
       
   712     def __nonzero__(self):
       
   713         """Return True if self is nonzero; otherwise return False.
       
   714 
       
   715         NaNs and infinities are considered nonzero.
       
   716         """
       
   717         return self._is_special or self._int != '0'
       
   718 
       
   719     def __cmp__(self, other):
       
   720         other = _convert_other(other)
       
   721         if other is NotImplemented:
       
   722             # Never return NotImplemented
       
   723             return 1
       
   724 
       
   725         if self._is_special or other._is_special:
       
   726             # check for nans, without raising on a signaling nan
       
   727             if self._isnan() or other._isnan():
       
   728                 return 1  # Comparison involving NaN's always reports self > other
       
   729 
       
   730             # INF = INF
       
   731             return cmp(self._isinfinity(), other._isinfinity())
       
   732 
       
   733         # check for zeros;  note that cmp(0, -0) should return 0
       
   734         if not self:
       
   735             if not other:
       
   736                 return 0
       
   737             else:
       
   738                 return -((-1)**other._sign)
       
   739         if not other:
       
   740             return (-1)**self._sign
       
   741 
       
   742         # If different signs, neg one is less
       
   743         if other._sign < self._sign:
       
   744             return -1
       
   745         if self._sign < other._sign:
       
   746             return 1
       
   747 
       
   748         self_adjusted = self.adjusted()
       
   749         other_adjusted = other.adjusted()
       
   750         if self_adjusted == other_adjusted:
       
   751             self_padded = self._int + '0'*(self._exp - other._exp)
       
   752             other_padded = other._int + '0'*(other._exp - self._exp)
       
   753             return cmp(self_padded, other_padded) * (-1)**self._sign
       
   754         elif self_adjusted > other_adjusted:
       
   755             return (-1)**self._sign
       
   756         else: # self_adjusted < other_adjusted
       
   757             return -((-1)**self._sign)
       
   758 
       
   759     def __eq__(self, other):
       
   760         if not isinstance(other, (Decimal, int, long)):
       
   761             return NotImplemented
       
   762         return self.__cmp__(other) == 0
       
   763 
       
   764     def __ne__(self, other):
       
   765         if not isinstance(other, (Decimal, int, long)):
       
   766             return NotImplemented
       
   767         return self.__cmp__(other) != 0
       
   768 
       
   769     def compare(self, other, context=None):
       
   770         """Compares one to another.
       
   771 
       
   772         -1 => a < b
       
   773         0  => a = b
       
   774         1  => a > b
       
   775         NaN => one is NaN
       
   776         Like __cmp__, but returns Decimal instances.
       
   777         """
       
   778         other = _convert_other(other, raiseit=True)
       
   779 
       
   780         # Compare(NaN, NaN) = NaN
       
   781         if (self._is_special or other and other._is_special):
       
   782             ans = self._check_nans(other, context)
       
   783             if ans:
       
   784                 return ans
       
   785 
       
   786         return Decimal(self.__cmp__(other))
       
   787 
       
   788     def __hash__(self):
       
   789         """x.__hash__() <==> hash(x)"""
       
   790         # Decimal integers must hash the same as the ints
       
   791         #
       
   792         # The hash of a nonspecial noninteger Decimal must depend only
       
   793         # on the value of that Decimal, and not on its representation.
       
   794         # For example: hash(Decimal("100E-1")) == hash(Decimal("10")).
       
   795         if self._is_special:
       
   796             if self._isnan():
       
   797                 raise TypeError('Cannot hash a NaN value.')
       
   798             return hash(str(self))
       
   799         if not self:
       
   800             return 0
       
   801         if self._isinteger():
       
   802             op = _WorkRep(self.to_integral_value())
       
   803             return hash((-1)**op.sign*op.int*10**op.exp)
       
   804         # The value of a nonzero nonspecial Decimal instance is
       
   805         # faithfully represented by the triple consisting of its sign,
       
   806         # its adjusted exponent, and its coefficient with trailing
       
   807         # zeros removed.
       
   808         return hash((self._sign,
       
   809                      self._exp+len(self._int),
       
   810                      self._int.rstrip('0')))
       
   811 
       
   812     def as_tuple(self):
       
   813         """Represents the number as a triple tuple.
       
   814 
       
   815         To show the internals exactly as they are.
       
   816         """
       
   817         return (self._sign, tuple(map(int, self._int)), self._exp)
       
   818 
       
   819     def __repr__(self):
       
   820         """Represents the number as an instance of Decimal."""
       
   821         # Invariant:  eval(repr(d)) == d
       
   822         return 'Decimal("%s")' % str(self)
       
   823 
       
   824     def __str__(self, eng=False, context=None):
       
   825         """Return string representation of the number in scientific notation.
       
   826 
       
   827         Captures all of the information in the underlying representation.
       
   828         """
       
   829 
       
   830         sign = ['', '-'][self._sign]
       
   831         if self._is_special:
       
   832             if self._exp == 'F':
       
   833                 return sign + 'Infinity'
       
   834             elif self._exp == 'n':
       
   835                 return sign + 'NaN' + self._int
       
   836             else: # self._exp == 'N'
       
   837                 return sign + 'sNaN' + self._int
       
   838 
       
   839         # number of digits of self._int to left of decimal point
       
   840         leftdigits = self._exp + len(self._int)
       
   841 
       
   842         # dotplace is number of digits of self._int to the left of the
       
   843         # decimal point in the mantissa of the output string (that is,
       
   844         # after adjusting the exponent)
       
   845         if self._exp <= 0 and leftdigits > -6:
       
   846             # no exponent required
       
   847             dotplace = leftdigits
       
   848         elif not eng:
       
   849             # usual scientific notation: 1 digit on left of the point
       
   850             dotplace = 1
       
   851         elif self._int == '0':
       
   852             # engineering notation, zero
       
   853             dotplace = (leftdigits + 1) % 3 - 1
       
   854         else:
       
   855             # engineering notation, nonzero
       
   856             dotplace = (leftdigits - 1) % 3 + 1
       
   857 
       
   858         if dotplace <= 0:
       
   859             intpart = '0'
       
   860             fracpart = '.' + '0'*(-dotplace) + self._int
       
   861         elif dotplace >= len(self._int):
       
   862             intpart = self._int+'0'*(dotplace-len(self._int))
       
   863             fracpart = ''
       
   864         else:
       
   865             intpart = self._int[:dotplace]
       
   866             fracpart = '.' + self._int[dotplace:]
       
   867         if leftdigits == dotplace:
       
   868             exp = ''
       
   869         else:
       
   870             if context is None:
       
   871                 context = getcontext()
       
   872             exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
       
   873 
       
   874         return sign + intpart + fracpart + exp
       
   875 
       
   876     def to_eng_string(self, context=None):
       
   877         """Convert to engineering-type string.
       
   878 
       
   879         Engineering notation has an exponent which is a multiple of 3, so there
       
   880         are up to 3 digits left of the decimal place.
       
   881 
       
   882         Same rules for when in exponential and when as a value as in __str__.
       
   883         """
       
   884         return self.__str__(eng=True, context=context)
       
   885 
       
   886     def __neg__(self, context=None):
       
   887         """Returns a copy with the sign switched.
       
   888 
       
   889         Rounds, if it has reason.
       
   890         """
       
   891         if self._is_special:
       
   892             ans = self._check_nans(context=context)
       
   893             if ans:
       
   894                 return ans
       
   895 
       
   896         if not self:
       
   897             # -Decimal('0') is Decimal('0'), not Decimal('-0')
       
   898             ans = self.copy_abs()
       
   899         else:
       
   900             ans = self.copy_negate()
       
   901 
       
   902         if context is None:
       
   903             context = getcontext()
       
   904         return ans._fix(context)
       
   905 
       
   906     def __pos__(self, context=None):
       
   907         """Returns a copy, unless it is a sNaN.
       
   908 
       
   909         Rounds the number (if more then precision digits)
       
   910         """
       
   911         if self._is_special:
       
   912             ans = self._check_nans(context=context)
       
   913             if ans:
       
   914                 return ans
       
   915 
       
   916         if not self:
       
   917             # + (-0) = 0
       
   918             ans = self.copy_abs()
       
   919         else:
       
   920             ans = Decimal(self)
       
   921 
       
   922         if context is None:
       
   923             context = getcontext()
       
   924         return ans._fix(context)
       
   925 
       
   926     def __abs__(self, round=True, context=None):
       
   927         """Returns the absolute value of self.
       
   928 
       
   929         If the keyword argument 'round' is false, do not round.  The
       
   930         expression self.__abs__(round=False) is equivalent to
       
   931         self.copy_abs().
       
   932         """
       
   933         if not round:
       
   934             return self.copy_abs()
       
   935 
       
   936         if self._is_special:
       
   937             ans = self._check_nans(context=context)
       
   938             if ans:
       
   939                 return ans
       
   940 
       
   941         if self._sign:
       
   942             ans = self.__neg__(context=context)
       
   943         else:
       
   944             ans = self.__pos__(context=context)
       
   945 
       
   946         return ans
       
   947 
       
   948     def __add__(self, other, context=None):
       
   949         """Returns self + other.
       
   950 
       
   951         -INF + INF (or the reverse) cause InvalidOperation errors.
       
   952         """
       
   953         other = _convert_other(other)
       
   954         if other is NotImplemented:
       
   955             return other
       
   956 
       
   957         if context is None:
       
   958             context = getcontext()
       
   959 
       
   960         if self._is_special or other._is_special:
       
   961             ans = self._check_nans(other, context)
       
   962             if ans:
       
   963                 return ans
       
   964 
       
   965             if self._isinfinity():
       
   966                 # If both INF, same sign => same as both, opposite => error.
       
   967                 if self._sign != other._sign and other._isinfinity():
       
   968                     return context._raise_error(InvalidOperation, '-INF + INF')
       
   969                 return Decimal(self)
       
   970             if other._isinfinity():
       
   971                 return Decimal(other)  # Can't both be infinity here
       
   972 
       
   973         exp = min(self._exp, other._exp)
       
   974         negativezero = 0
       
   975         if context.rounding == ROUND_FLOOR and self._sign != other._sign:
       
   976             # If the answer is 0, the sign should be negative, in this case.
       
   977             negativezero = 1
       
   978 
       
   979         if not self and not other:
       
   980             sign = min(self._sign, other._sign)
       
   981             if negativezero:
       
   982                 sign = 1
       
   983             ans = _dec_from_triple(sign, '0', exp)
       
   984             ans = ans._fix(context)
       
   985             return ans
       
   986         if not self:
       
   987             exp = max(exp, other._exp - context.prec-1)
       
   988             ans = other._rescale(exp, context.rounding)
       
   989             ans = ans._fix(context)
       
   990             return ans
       
   991         if not other:
       
   992             exp = max(exp, self._exp - context.prec-1)
       
   993             ans = self._rescale(exp, context.rounding)
       
   994             ans = ans._fix(context)
       
   995             return ans
       
   996 
       
   997         op1 = _WorkRep(self)
       
   998         op2 = _WorkRep(other)
       
   999         op1, op2 = _normalize(op1, op2, context.prec)
       
  1000 
       
  1001         result = _WorkRep()
       
  1002         if op1.sign != op2.sign:
       
  1003             # Equal and opposite
       
  1004             if op1.int == op2.int:
       
  1005                 ans = _dec_from_triple(negativezero, '0', exp)
       
  1006                 ans = ans._fix(context)
       
  1007                 return ans
       
  1008             if op1.int < op2.int:
       
  1009                 op1, op2 = op2, op1
       
  1010                 # OK, now abs(op1) > abs(op2)
       
  1011             if op1.sign == 1:
       
  1012                 result.sign = 1
       
  1013                 op1.sign, op2.sign = op2.sign, op1.sign
       
  1014             else:
       
  1015                 result.sign = 0
       
  1016                 # So we know the sign, and op1 > 0.
       
  1017         elif op1.sign == 1:
       
  1018             result.sign = 1
       
  1019             op1.sign, op2.sign = (0, 0)
       
  1020         else:
       
  1021             result.sign = 0
       
  1022         # Now, op1 > abs(op2) > 0
       
  1023 
       
  1024         if op2.sign == 0:
       
  1025             result.int = op1.int + op2.int
       
  1026         else:
       
  1027             result.int = op1.int - op2.int
       
  1028 
       
  1029         result.exp = op1.exp
       
  1030         ans = Decimal(result)
       
  1031         ans = ans._fix(context)
       
  1032         return ans
       
  1033 
       
  1034     __radd__ = __add__
       
  1035 
       
  1036     def __sub__(self, other, context=None):
       
  1037         """Return self - other"""
       
  1038         other = _convert_other(other)
       
  1039         if other is NotImplemented:
       
  1040             return other
       
  1041 
       
  1042         if self._is_special or other._is_special:
       
  1043             ans = self._check_nans(other, context=context)
       
  1044             if ans:
       
  1045                 return ans
       
  1046 
       
  1047         # self - other is computed as self + other.copy_negate()
       
  1048         return self.__add__(other.copy_negate(), context=context)
       
  1049 
       
  1050     def __rsub__(self, other, context=None):
       
  1051         """Return other - self"""
       
  1052         other = _convert_other(other)
       
  1053         if other is NotImplemented:
       
  1054             return other
       
  1055 
       
  1056         return other.__sub__(self, context=context)
       
  1057 
       
  1058     def __mul__(self, other, context=None):
       
  1059         """Return self * other.
       
  1060 
       
  1061         (+-) INF * 0 (or its reverse) raise InvalidOperation.
       
  1062         """
       
  1063         other = _convert_other(other)
       
  1064         if other is NotImplemented:
       
  1065             return other
       
  1066 
       
  1067         if context is None:
       
  1068             context = getcontext()
       
  1069 
       
  1070         resultsign = self._sign ^ other._sign
       
  1071 
       
  1072         if self._is_special or other._is_special:
       
  1073             ans = self._check_nans(other, context)
       
  1074             if ans:
       
  1075                 return ans
       
  1076 
       
  1077             if self._isinfinity():
       
  1078                 if not other:
       
  1079                     return context._raise_error(InvalidOperation, '(+-)INF * 0')
       
  1080                 return Infsign[resultsign]
       
  1081 
       
  1082             if other._isinfinity():
       
  1083                 if not self:
       
  1084                     return context._raise_error(InvalidOperation, '0 * (+-)INF')
       
  1085                 return Infsign[resultsign]
       
  1086 
       
  1087         resultexp = self._exp + other._exp
       
  1088 
       
  1089         # Special case for multiplying by zero
       
  1090         if not self or not other:
       
  1091             ans = _dec_from_triple(resultsign, '0', resultexp)
       
  1092             # Fixing in case the exponent is out of bounds
       
  1093             ans = ans._fix(context)
       
  1094             return ans
       
  1095 
       
  1096         # Special case for multiplying by power of 10
       
  1097         if self._int == '1':
       
  1098             ans = _dec_from_triple(resultsign, other._int, resultexp)
       
  1099             ans = ans._fix(context)
       
  1100             return ans
       
  1101         if other._int == '1':
       
  1102             ans = _dec_from_triple(resultsign, self._int, resultexp)
       
  1103             ans = ans._fix(context)
       
  1104             return ans
       
  1105 
       
  1106         op1 = _WorkRep(self)
       
  1107         op2 = _WorkRep(other)
       
  1108 
       
  1109         ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
       
  1110         ans = ans._fix(context)
       
  1111 
       
  1112         return ans
       
  1113     __rmul__ = __mul__
       
  1114 
       
  1115     def __div__(self, other, context=None):
       
  1116         """Return self / other."""
       
  1117         other = _convert_other(other)
       
  1118         if other is NotImplemented:
       
  1119             return NotImplemented
       
  1120 
       
  1121         if context is None:
       
  1122             context = getcontext()
       
  1123 
       
  1124         sign = self._sign ^ other._sign
       
  1125 
       
  1126         if self._is_special or other._is_special:
       
  1127             ans = self._check_nans(other, context)
       
  1128             if ans:
       
  1129                 return ans
       
  1130 
       
  1131             if self._isinfinity() and other._isinfinity():
       
  1132                 return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
       
  1133 
       
  1134             if self._isinfinity():
       
  1135                 return Infsign[sign]
       
  1136 
       
  1137             if other._isinfinity():
       
  1138                 context._raise_error(Clamped, 'Division by infinity')
       
  1139                 return _dec_from_triple(sign, '0', context.Etiny())
       
  1140 
       
  1141         # Special cases for zeroes
       
  1142         if not other:
       
  1143             if not self:
       
  1144                 return context._raise_error(DivisionUndefined, '0 / 0')
       
  1145             return context._raise_error(DivisionByZero, 'x / 0', sign)
       
  1146 
       
  1147         if not self:
       
  1148             exp = self._exp - other._exp
       
  1149             coeff = 0
       
  1150         else:
       
  1151             # OK, so neither = 0, INF or NaN
       
  1152             shift = len(other._int) - len(self._int) + context.prec + 1
       
  1153             exp = self._exp - other._exp - shift
       
  1154             op1 = _WorkRep(self)
       
  1155             op2 = _WorkRep(other)
       
  1156             if shift >= 0:
       
  1157                 coeff, remainder = divmod(op1.int * 10**shift, op2.int)
       
  1158             else:
       
  1159                 coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
       
  1160             if remainder:
       
  1161                 # result is not exact; adjust to ensure correct rounding
       
  1162                 if coeff % 5 == 0:
       
  1163                     coeff += 1
       
  1164             else:
       
  1165                 # result is exact; get as close to ideal exponent as possible
       
  1166                 ideal_exp = self._exp - other._exp
       
  1167                 while exp < ideal_exp and coeff % 10 == 0:
       
  1168                     coeff //= 10
       
  1169                     exp += 1
       
  1170 
       
  1171         ans = _dec_from_triple(sign, str(coeff), exp)
       
  1172         return ans._fix(context)
       
  1173 
       
  1174     __truediv__ = __div__
       
  1175 
       
  1176     def _divide(self, other, context):
       
  1177         """Return (self // other, self % other), to context.prec precision.
       
  1178 
       
  1179         Assumes that neither self nor other is a NaN, that self is not
       
  1180         infinite and that other is nonzero.
       
  1181         """
       
  1182         sign = self._sign ^ other._sign
       
  1183         if other._isinfinity():
       
  1184             ideal_exp = self._exp
       
  1185         else:
       
  1186             ideal_exp = min(self._exp, other._exp)
       
  1187 
       
  1188         expdiff = self.adjusted() - other.adjusted()
       
  1189         if not self or other._isinfinity() or expdiff <= -2:
       
  1190             return (_dec_from_triple(sign, '0', 0),
       
  1191                     self._rescale(ideal_exp, context.rounding))
       
  1192         if expdiff <= context.prec:
       
  1193             op1 = _WorkRep(self)
       
  1194             op2 = _WorkRep(other)
       
  1195             if op1.exp >= op2.exp:
       
  1196                 op1.int *= 10**(op1.exp - op2.exp)
       
  1197             else:
       
  1198                 op2.int *= 10**(op2.exp - op1.exp)
       
  1199             q, r = divmod(op1.int, op2.int)
       
  1200             if q < 10**context.prec:
       
  1201                 return (_dec_from_triple(sign, str(q), 0),
       
  1202                         _dec_from_triple(self._sign, str(r), ideal_exp))
       
  1203 
       
  1204         # Here the quotient is too large to be representable
       
  1205         ans = context._raise_error(DivisionImpossible,
       
  1206                                    'quotient too large in //, % or divmod')
       
  1207         return ans, ans
       
  1208 
       
  1209     def __rdiv__(self, other, context=None):
       
  1210         """Swaps self/other and returns __div__."""
       
  1211         other = _convert_other(other)
       
  1212         if other is NotImplemented:
       
  1213             return other
       
  1214         return other.__div__(self, context=context)
       
  1215     __rtruediv__ = __rdiv__
       
  1216 
       
  1217     def __divmod__(self, other, context=None):
       
  1218         """
       
  1219         Return (self // other, self % other)
       
  1220         """
       
  1221         other = _convert_other(other)
       
  1222         if other is NotImplemented:
       
  1223             return other
       
  1224 
       
  1225         if context is None:
       
  1226             context = getcontext()
       
  1227 
       
  1228         ans = self._check_nans(other, context)
       
  1229         if ans:
       
  1230             return (ans, ans)
       
  1231 
       
  1232         sign = self._sign ^ other._sign
       
  1233         if self._isinfinity():
       
  1234             if other._isinfinity():
       
  1235                 ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
       
  1236                 return ans, ans
       
  1237             else:
       
  1238                 return (Infsign[sign],
       
  1239                         context._raise_error(InvalidOperation, 'INF % x'))
       
  1240 
       
  1241         if not other:
       
  1242             if not self:
       
  1243                 ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
       
  1244                 return ans, ans
       
  1245             else:
       
  1246                 return (context._raise_error(DivisionByZero, 'x // 0', sign),
       
  1247                         context._raise_error(InvalidOperation, 'x % 0'))
       
  1248 
       
  1249         quotient, remainder = self._divide(other, context)
       
  1250         remainder = remainder._fix(context)
       
  1251         return quotient, remainder
       
  1252 
       
  1253     def __rdivmod__(self, other, context=None):
       
  1254         """Swaps self/other and returns __divmod__."""
       
  1255         other = _convert_other(other)
       
  1256         if other is NotImplemented:
       
  1257             return other
       
  1258         return other.__divmod__(self, context=context)
       
  1259 
       
  1260     def __mod__(self, other, context=None):
       
  1261         """
       
  1262         self % other
       
  1263         """
       
  1264         other = _convert_other(other)
       
  1265         if other is NotImplemented:
       
  1266             return other
       
  1267 
       
  1268         if context is None:
       
  1269             context = getcontext()
       
  1270 
       
  1271         ans = self._check_nans(other, context)
       
  1272         if ans:
       
  1273             return ans
       
  1274 
       
  1275         if self._isinfinity():
       
  1276             return context._raise_error(InvalidOperation, 'INF % x')
       
  1277         elif not other:
       
  1278             if self:
       
  1279                 return context._raise_error(InvalidOperation, 'x % 0')
       
  1280             else:
       
  1281                 return context._raise_error(DivisionUndefined, '0 % 0')
       
  1282 
       
  1283         remainder = self._divide(other, context)[1]
       
  1284         remainder = remainder._fix(context)
       
  1285         return remainder
       
  1286 
       
  1287     def __rmod__(self, other, context=None):
       
  1288         """Swaps self/other and returns __mod__."""
       
  1289         other = _convert_other(other)
       
  1290         if other is NotImplemented:
       
  1291             return other
       
  1292         return other.__mod__(self, context=context)
       
  1293 
       
  1294     def remainder_near(self, other, context=None):
       
  1295         """
       
  1296         Remainder nearest to 0-  abs(remainder-near) <= other/2
       
  1297         """
       
  1298         if context is None:
       
  1299             context = getcontext()
       
  1300 
       
  1301         other = _convert_other(other, raiseit=True)
       
  1302 
       
  1303         ans = self._check_nans(other, context)
       
  1304         if ans:
       
  1305             return ans
       
  1306 
       
  1307         # self == +/-infinity -> InvalidOperation
       
  1308         if self._isinfinity():
       
  1309             return context._raise_error(InvalidOperation,
       
  1310                                         'remainder_near(infinity, x)')
       
  1311 
       
  1312         # other == 0 -> either InvalidOperation or DivisionUndefined
       
  1313         if not other:
       
  1314             if self:
       
  1315                 return context._raise_error(InvalidOperation,
       
  1316                                             'remainder_near(x, 0)')
       
  1317             else:
       
  1318                 return context._raise_error(DivisionUndefined,
       
  1319                                             'remainder_near(0, 0)')
       
  1320 
       
  1321         # other = +/-infinity -> remainder = self
       
  1322         if other._isinfinity():
       
  1323             ans = Decimal(self)
       
  1324             return ans._fix(context)
       
  1325 
       
  1326         # self = 0 -> remainder = self, with ideal exponent
       
  1327         ideal_exponent = min(self._exp, other._exp)
       
  1328         if not self:
       
  1329             ans = _dec_from_triple(self._sign, '0', ideal_exponent)
       
  1330             return ans._fix(context)
       
  1331 
       
  1332         # catch most cases of large or small quotient
       
  1333         expdiff = self.adjusted() - other.adjusted()
       
  1334         if expdiff >= context.prec + 1:
       
  1335             # expdiff >= prec+1 => abs(self/other) > 10**prec
       
  1336             return context._raise_error(DivisionImpossible)
       
  1337         if expdiff <= -2:
       
  1338             # expdiff <= -2 => abs(self/other) < 0.1
       
  1339             ans = self._rescale(ideal_exponent, context.rounding)
       
  1340             return ans._fix(context)
       
  1341 
       
  1342         # adjust both arguments to have the same exponent, then divide
       
  1343         op1 = _WorkRep(self)
       
  1344         op2 = _WorkRep(other)
       
  1345         if op1.exp >= op2.exp:
       
  1346             op1.int *= 10**(op1.exp - op2.exp)
       
  1347         else:
       
  1348             op2.int *= 10**(op2.exp - op1.exp)
       
  1349         q, r = divmod(op1.int, op2.int)
       
  1350         # remainder is r*10**ideal_exponent; other is +/-op2.int *
       
  1351         # 10**ideal_exponent.   Apply correction to ensure that
       
  1352         # abs(remainder) <= abs(other)/2
       
  1353         if 2*r + (q&1) > op2.int:
       
  1354             r -= op2.int
       
  1355             q += 1
       
  1356 
       
  1357         if q >= 10**context.prec:
       
  1358             return context._raise_error(DivisionImpossible)
       
  1359 
       
  1360         # result has same sign as self unless r is negative
       
  1361         sign = self._sign
       
  1362         if r < 0:
       
  1363             sign = 1-sign
       
  1364             r = -r
       
  1365 
       
  1366         ans = _dec_from_triple(sign, str(r), ideal_exponent)
       
  1367         return ans._fix(context)
       
  1368 
       
  1369     def __floordiv__(self, other, context=None):
       
  1370         """self // other"""
       
  1371         other = _convert_other(other)
       
  1372         if other is NotImplemented:
       
  1373             return other
       
  1374 
       
  1375         if context is None:
       
  1376             context = getcontext()
       
  1377 
       
  1378         ans = self._check_nans(other, context)
       
  1379         if ans:
       
  1380             return ans
       
  1381 
       
  1382         if self._isinfinity():
       
  1383             if other._isinfinity():
       
  1384                 return context._raise_error(InvalidOperation, 'INF // INF')
       
  1385             else:
       
  1386                 return Infsign[self._sign ^ other._sign]
       
  1387 
       
  1388         if not other:
       
  1389             if self:
       
  1390                 return context._raise_error(DivisionByZero, 'x // 0',
       
  1391                                             self._sign ^ other._sign)
       
  1392             else:
       
  1393                 return context._raise_error(DivisionUndefined, '0 // 0')
       
  1394 
       
  1395         return self._divide(other, context)[0]
       
  1396 
       
  1397     def __rfloordiv__(self, other, context=None):
       
  1398         """Swaps self/other and returns __floordiv__."""
       
  1399         other = _convert_other(other)
       
  1400         if other is NotImplemented:
       
  1401             return other
       
  1402         return other.__floordiv__(self, context=context)
       
  1403 
       
  1404     def __float__(self):
       
  1405         """Float representation."""
       
  1406         return float(str(self))
       
  1407 
       
  1408     def __int__(self):
       
  1409         """Converts self to an int, truncating if necessary."""
       
  1410         if self._is_special:
       
  1411             if self._isnan():
       
  1412                 context = getcontext()
       
  1413                 return context._raise_error(InvalidContext)
       
  1414             elif self._isinfinity():
       
  1415                 raise OverflowError("Cannot convert infinity to long")
       
  1416         s = (-1)**self._sign
       
  1417         if self._exp >= 0:
       
  1418             return s*int(self._int)*10**self._exp
       
  1419         else:
       
  1420             return s*int(self._int[:self._exp] or '0')
       
  1421 
       
  1422     def __long__(self):
       
  1423         """Converts to a long.
       
  1424 
       
  1425         Equivalent to long(int(self))
       
  1426         """
       
  1427         return long(self.__int__())
       
  1428 
       
  1429     def _fix_nan(self, context):
       
  1430         """Decapitate the payload of a NaN to fit the context"""
       
  1431         payload = self._int
       
  1432 
       
  1433         # maximum length of payload is precision if _clamp=0,
       
  1434         # precision-1 if _clamp=1.
       
  1435         max_payload_len = context.prec - context._clamp
       
  1436         if len(payload) > max_payload_len:
       
  1437             payload = payload[len(payload)-max_payload_len:].lstrip('0')
       
  1438             return _dec_from_triple(self._sign, payload, self._exp, True)
       
  1439         return Decimal(self)
       
  1440 
       
  1441     def _fix(self, context):
       
  1442         """Round if it is necessary to keep self within prec precision.
       
  1443 
       
  1444         Rounds and fixes the exponent.  Does not raise on a sNaN.
       
  1445 
       
  1446         Arguments:
       
  1447         self - Decimal instance
       
  1448         context - context used.
       
  1449         """
       
  1450 
       
  1451         if self._is_special:
       
  1452             if self._isnan():
       
  1453                 # decapitate payload if necessary
       
  1454                 return self._fix_nan(context)
       
  1455             else:
       
  1456                 # self is +/-Infinity; return unaltered
       
  1457                 return Decimal(self)
       
  1458 
       
  1459         # if self is zero then exponent should be between Etiny and
       
  1460         # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.
       
  1461         Etiny = context.Etiny()
       
  1462         Etop = context.Etop()
       
  1463         if not self:
       
  1464             exp_max = [context.Emax, Etop][context._clamp]
       
  1465             new_exp = min(max(self._exp, Etiny), exp_max)
       
  1466             if new_exp != self._exp:
       
  1467                 context._raise_error(Clamped)
       
  1468                 return _dec_from_triple(self._sign, '0', new_exp)
       
  1469             else:
       
  1470                 return Decimal(self)
       
  1471 
       
  1472         # exp_min is the smallest allowable exponent of the result,
       
  1473         # equal to max(self.adjusted()-context.prec+1, Etiny)
       
  1474         exp_min = len(self._int) + self._exp - context.prec
       
  1475         if exp_min > Etop:
       
  1476             # overflow: exp_min > Etop iff self.adjusted() > Emax
       
  1477             context._raise_error(Inexact)
       
  1478             context._raise_error(Rounded)
       
  1479             return context._raise_error(Overflow, 'above Emax', self._sign)
       
  1480         self_is_subnormal = exp_min < Etiny
       
  1481         if self_is_subnormal:
       
  1482             context._raise_error(Subnormal)
       
  1483             exp_min = Etiny
       
  1484 
       
  1485         # round if self has too many digits
       
  1486         if self._exp < exp_min:
       
  1487             context._raise_error(Rounded)
       
  1488             digits = len(self._int) + self._exp - exp_min
       
  1489             if digits < 0:
       
  1490                 self = _dec_from_triple(self._sign, '1', exp_min-1)
       
  1491                 digits = 0
       
  1492             this_function = getattr(self, self._pick_rounding_function[context.rounding])
       
  1493             changed = this_function(digits)
       
  1494             coeff = self._int[:digits] or '0'
       
  1495             if changed == 1:
       
  1496                 coeff = str(int(coeff)+1)
       
  1497             ans = _dec_from_triple(self._sign, coeff, exp_min)
       
  1498 
       
  1499             if changed:
       
  1500                 context._raise_error(Inexact)
       
  1501                 if self_is_subnormal:
       
  1502                     context._raise_error(Underflow)
       
  1503                     if not ans:
       
  1504                         # raise Clamped on underflow to 0
       
  1505                         context._raise_error(Clamped)
       
  1506                 elif len(ans._int) == context.prec+1:
       
  1507                     # we get here only if rescaling rounds the
       
  1508                     # cofficient up to exactly 10**context.prec
       
  1509                     if ans._exp < Etop:
       
  1510                         ans = _dec_from_triple(ans._sign,
       
  1511                                                    ans._int[:-1], ans._exp+1)
       
  1512                     else:
       
  1513                         # Inexact and Rounded have already been raised
       
  1514                         ans = context._raise_error(Overflow, 'above Emax',
       
  1515                                                    self._sign)
       
  1516             return ans
       
  1517 
       
  1518         # fold down if _clamp == 1 and self has too few digits
       
  1519         if context._clamp == 1 and self._exp > Etop:
       
  1520             context._raise_error(Clamped)
       
  1521             self_padded = self._int + '0'*(self._exp - Etop)
       
  1522             return _dec_from_triple(self._sign, self_padded, Etop)
       
  1523 
       
  1524         # here self was representable to begin with; return unchanged
       
  1525         return Decimal(self)
       
  1526 
       
  1527     _pick_rounding_function = {}
       
  1528 
       
  1529     # for each of the rounding functions below:
       
  1530     #   self is a finite, nonzero Decimal
       
  1531     #   prec is an integer satisfying 0 <= prec < len(self._int)
       
  1532     #
       
  1533     # each function returns either -1, 0, or 1, as follows:
       
  1534     #   1 indicates that self should be rounded up (away from zero)
       
  1535     #   0 indicates that self should be truncated, and that all the
       
  1536     #     digits to be truncated are zeros (so the value is unchanged)
       
  1537     #  -1 indicates that there are nonzero digits to be truncated
       
  1538 
       
  1539     def _round_down(self, prec):
       
  1540         """Also known as round-towards-0, truncate."""
       
  1541         if _all_zeros(self._int, prec):
       
  1542             return 0
       
  1543         else:
       
  1544             return -1
       
  1545 
       
  1546     def _round_up(self, prec):
       
  1547         """Rounds away from 0."""
       
  1548         return -self._round_down(prec)
       
  1549 
       
  1550     def _round_half_up(self, prec):
       
  1551         """Rounds 5 up (away from 0)"""
       
  1552         if self._int[prec] in '56789':
       
  1553             return 1
       
  1554         elif _all_zeros(self._int, prec):
       
  1555             return 0
       
  1556         else:
       
  1557             return -1
       
  1558 
       
  1559     def _round_half_down(self, prec):
       
  1560         """Round 5 down"""
       
  1561         if _exact_half(self._int, prec):
       
  1562             return -1
       
  1563         else:
       
  1564             return self._round_half_up(prec)
       
  1565 
       
  1566     def _round_half_even(self, prec):
       
  1567         """Round 5 to even, rest to nearest."""
       
  1568         if _exact_half(self._int, prec) and \
       
  1569                 (prec == 0 or self._int[prec-1] in '02468'):
       
  1570             return -1
       
  1571         else:
       
  1572             return self._round_half_up(prec)
       
  1573 
       
  1574     def _round_ceiling(self, prec):
       
  1575         """Rounds up (not away from 0 if negative.)"""
       
  1576         if self._sign:
       
  1577             return self._round_down(prec)
       
  1578         else:
       
  1579             return -self._round_down(prec)
       
  1580 
       
  1581     def _round_floor(self, prec):
       
  1582         """Rounds down (not towards 0 if negative)"""
       
  1583         if not self._sign:
       
  1584             return self._round_down(prec)
       
  1585         else:
       
  1586             return -self._round_down(prec)
       
  1587 
       
  1588     def _round_05up(self, prec):
       
  1589         """Round down unless digit prec-1 is 0 or 5."""
       
  1590         if prec and self._int[prec-1] not in '05':
       
  1591             return self._round_down(prec)
       
  1592         else:
       
  1593             return -self._round_down(prec)
       
  1594 
       
  1595     def fma(self, other, third, context=None):
       
  1596         """Fused multiply-add.
       
  1597 
       
  1598         Returns self*other+third with no rounding of the intermediate
       
  1599         product self*other.
       
  1600 
       
  1601         self and other are multiplied together, with no rounding of
       
  1602         the result.  The third operand is then added to the result,
       
  1603         and a single final rounding is performed.
       
  1604         """
       
  1605 
       
  1606         other = _convert_other(other, raiseit=True)
       
  1607 
       
  1608         # compute product; raise InvalidOperation if either operand is
       
  1609         # a signaling NaN or if the product is zero times infinity.
       
  1610         if self._is_special or other._is_special:
       
  1611             if context is None:
       
  1612                 context = getcontext()
       
  1613             if self._exp == 'N':
       
  1614                 return context._raise_error(InvalidOperation, 'sNaN', self)
       
  1615             if other._exp == 'N':
       
  1616                 return context._raise_error(InvalidOperation, 'sNaN', other)
       
  1617             if self._exp == 'n':
       
  1618                 product = self
       
  1619             elif other._exp == 'n':
       
  1620                 product = other
       
  1621             elif self._exp == 'F':
       
  1622                 if not other:
       
  1623                     return context._raise_error(InvalidOperation,
       
  1624                                                 'INF * 0 in fma')
       
  1625                 product = Infsign[self._sign ^ other._sign]
       
  1626             elif other._exp == 'F':
       
  1627                 if not self:
       
  1628                     return context._raise_error(InvalidOperation,
       
  1629                                                 '0 * INF in fma')
       
  1630                 product = Infsign[self._sign ^ other._sign]
       
  1631         else:
       
  1632             product = _dec_from_triple(self._sign ^ other._sign,
       
  1633                                        str(int(self._int) * int(other._int)),
       
  1634                                        self._exp + other._exp)
       
  1635 
       
  1636         third = _convert_other(third, raiseit=True)
       
  1637         return product.__add__(third, context)
       
  1638 
       
  1639     def _power_modulo(self, other, modulo, context=None):
       
  1640         """Three argument version of __pow__"""
       
  1641 
       
  1642         # if can't convert other and modulo to Decimal, raise
       
  1643         # TypeError; there's no point returning NotImplemented (no
       
  1644         # equivalent of __rpow__ for three argument pow)
       
  1645         other = _convert_other(other, raiseit=True)
       
  1646         modulo = _convert_other(modulo, raiseit=True)
       
  1647 
       
  1648         if context is None:
       
  1649             context = getcontext()
       
  1650 
       
  1651         # deal with NaNs: if there are any sNaNs then first one wins,
       
  1652         # (i.e. behaviour for NaNs is identical to that of fma)
       
  1653         self_is_nan = self._isnan()
       
  1654         other_is_nan = other._isnan()
       
  1655         modulo_is_nan = modulo._isnan()
       
  1656         if self_is_nan or other_is_nan or modulo_is_nan:
       
  1657             if self_is_nan == 2:
       
  1658                 return context._raise_error(InvalidOperation, 'sNaN',
       
  1659                                         self)
       
  1660             if other_is_nan == 2:
       
  1661                 return context._raise_error(InvalidOperation, 'sNaN',
       
  1662                                         other)
       
  1663             if modulo_is_nan == 2:
       
  1664                 return context._raise_error(InvalidOperation, 'sNaN',
       
  1665                                         modulo)
       
  1666             if self_is_nan:
       
  1667                 return self._fix_nan(context)
       
  1668             if other_is_nan:
       
  1669                 return other._fix_nan(context)
       
  1670             return modulo._fix_nan(context)
       
  1671 
       
  1672         # check inputs: we apply same restrictions as Python's pow()
       
  1673         if not (self._isinteger() and
       
  1674                 other._isinteger() and
       
  1675                 modulo._isinteger()):
       
  1676             return context._raise_error(InvalidOperation,
       
  1677                                         'pow() 3rd argument not allowed '
       
  1678                                         'unless all arguments are integers')
       
  1679         if other < 0:
       
  1680             return context._raise_error(InvalidOperation,
       
  1681                                         'pow() 2nd argument cannot be '
       
  1682                                         'negative when 3rd argument specified')
       
  1683         if not modulo:
       
  1684             return context._raise_error(InvalidOperation,
       
  1685                                         'pow() 3rd argument cannot be 0')
       
  1686 
       
  1687         # additional restriction for decimal: the modulus must be less
       
  1688         # than 10**prec in absolute value
       
  1689         if modulo.adjusted() >= context.prec:
       
  1690             return context._raise_error(InvalidOperation,
       
  1691                                         'insufficient precision: pow() 3rd '
       
  1692                                         'argument must not have more than '
       
  1693                                         'precision digits')
       
  1694 
       
  1695         # define 0**0 == NaN, for consistency with two-argument pow
       
  1696         # (even though it hurts!)
       
  1697         if not other and not self:
       
  1698             return context._raise_error(InvalidOperation,
       
  1699                                         'at least one of pow() 1st argument '
       
  1700                                         'and 2nd argument must be nonzero ;'
       
  1701                                         '0**0 is not defined')
       
  1702 
       
  1703         # compute sign of result
       
  1704         if other._iseven():
       
  1705             sign = 0
       
  1706         else:
       
  1707             sign = self._sign
       
  1708 
       
  1709         # convert modulo to a Python integer, and self and other to
       
  1710         # Decimal integers (i.e. force their exponents to be >= 0)
       
  1711         modulo = abs(int(modulo))
       
  1712         base = _WorkRep(self.to_integral_value())
       
  1713         exponent = _WorkRep(other.to_integral_value())
       
  1714 
       
  1715         # compute result using integer pow()
       
  1716         base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
       
  1717         for i in xrange(exponent.exp):
       
  1718             base = pow(base, 10, modulo)
       
  1719         base = pow(base, exponent.int, modulo)
       
  1720 
       
  1721         return _dec_from_triple(sign, str(base), 0)
       
  1722 
       
  1723     def _power_exact(self, other, p):
       
  1724         """Attempt to compute self**other exactly.
       
  1725 
       
  1726         Given Decimals self and other and an integer p, attempt to
       
  1727         compute an exact result for the power self**other, with p
       
  1728         digits of precision.  Return None if self**other is not
       
  1729         exactly representable in p digits.
       
  1730 
       
  1731         Assumes that elimination of special cases has already been
       
  1732         performed: self and other must both be nonspecial; self must
       
  1733         be positive and not numerically equal to 1; other must be
       
  1734         nonzero.  For efficiency, other._exp should not be too large,
       
  1735         so that 10**abs(other._exp) is a feasible calculation."""
       
  1736 
       
  1737         # In the comments below, we write x for the value of self and
       
  1738         # y for the value of other.  Write x = xc*10**xe and y =
       
  1739         # yc*10**ye.
       
  1740 
       
  1741         # The main purpose of this method is to identify the *failure*
       
  1742         # of x**y to be exactly representable with as little effort as
       
  1743         # possible.  So we look for cheap and easy tests that
       
  1744         # eliminate the possibility of x**y being exact.  Only if all
       
  1745         # these tests are passed do we go on to actually compute x**y.
       
  1746 
       
  1747         # Here's the main idea.  First normalize both x and y.  We
       
  1748         # express y as a rational m/n, with m and n relatively prime
       
  1749         # and n>0.  Then for x**y to be exactly representable (at
       
  1750         # *any* precision), xc must be the nth power of a positive
       
  1751         # integer and xe must be divisible by n.  If m is negative
       
  1752         # then additionally xc must be a power of either 2 or 5, hence
       
  1753         # a power of 2**n or 5**n.
       
  1754         #
       
  1755         # There's a limit to how small |y| can be: if y=m/n as above
       
  1756         # then:
       
  1757         #
       
  1758         #  (1) if xc != 1 then for the result to be representable we
       
  1759         #      need xc**(1/n) >= 2, and hence also xc**|y| >= 2.  So
       
  1760         #      if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
       
  1761         #      2**(1/|y|), hence xc**|y| < 2 and the result is not
       
  1762         #      representable.
       
  1763         #
       
  1764         #  (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1.  Hence if
       
  1765         #      |y| < 1/|xe| then the result is not representable.
       
  1766         #
       
  1767         # Note that since x is not equal to 1, at least one of (1) and
       
  1768         # (2) must apply.  Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
       
  1769         # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
       
  1770         #
       
  1771         # There's also a limit to how large y can be, at least if it's
       
  1772         # positive: the normalized result will have coefficient xc**y,
       
  1773         # so if it's representable then xc**y < 10**p, and y <
       
  1774         # p/log10(xc).  Hence if y*log10(xc) >= p then the result is
       
  1775         # not exactly representable.
       
  1776 
       
  1777         # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
       
  1778         # so |y| < 1/xe and the result is not representable.
       
  1779         # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
       
  1780         # < 1/nbits(xc).
       
  1781 
       
  1782         x = _WorkRep(self)
       
  1783         xc, xe = x.int, x.exp
       
  1784         while xc % 10 == 0:
       
  1785             xc //= 10
       
  1786             xe += 1
       
  1787 
       
  1788         y = _WorkRep(other)
       
  1789         yc, ye = y.int, y.exp
       
  1790         while yc % 10 == 0:
       
  1791             yc //= 10
       
  1792             ye += 1
       
  1793 
       
  1794         # case where xc == 1: result is 10**(xe*y), with xe*y
       
  1795         # required to be an integer
       
  1796         if xc == 1:
       
  1797             if ye >= 0:
       
  1798                 exponent = xe*yc*10**ye
       
  1799             else:
       
  1800                 exponent, remainder = divmod(xe*yc, 10**-ye)
       
  1801                 if remainder:
       
  1802                     return None
       
  1803             if y.sign == 1:
       
  1804                 exponent = -exponent
       
  1805             # if other is a nonnegative integer, use ideal exponent
       
  1806             if other._isinteger() and other._sign == 0:
       
  1807                 ideal_exponent = self._exp*int(other)
       
  1808                 zeros = min(exponent-ideal_exponent, p-1)
       
  1809             else:
       
  1810                 zeros = 0
       
  1811             return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
       
  1812 
       
  1813         # case where y is negative: xc must be either a power
       
  1814         # of 2 or a power of 5.
       
  1815         if y.sign == 1:
       
  1816             last_digit = xc % 10
       
  1817             if last_digit in (2,4,6,8):
       
  1818                 # quick test for power of 2
       
  1819                 if xc & -xc != xc:
       
  1820                     return None
       
  1821                 # now xc is a power of 2; e is its exponent
       
  1822                 e = _nbits(xc)-1
       
  1823                 # find e*y and xe*y; both must be integers
       
  1824                 if ye >= 0:
       
  1825                     y_as_int = yc*10**ye
       
  1826                     e = e*y_as_int
       
  1827                     xe = xe*y_as_int
       
  1828                 else:
       
  1829                     ten_pow = 10**-ye
       
  1830                     e, remainder = divmod(e*yc, ten_pow)
       
  1831                     if remainder:
       
  1832                         return None
       
  1833                     xe, remainder = divmod(xe*yc, ten_pow)
       
  1834                     if remainder:
       
  1835                         return None
       
  1836 
       
  1837                 if e*65 >= p*93: # 93/65 > log(10)/log(5)
       
  1838                     return None
       
  1839                 xc = 5**e
       
  1840 
       
  1841             elif last_digit == 5:
       
  1842                 # e >= log_5(xc) if xc is a power of 5; we have
       
  1843                 # equality all the way up to xc=5**2658
       
  1844                 e = _nbits(xc)*28//65
       
  1845                 xc, remainder = divmod(5**e, xc)
       
  1846                 if remainder:
       
  1847                     return None
       
  1848                 while xc % 5 == 0:
       
  1849                     xc //= 5
       
  1850                     e -= 1
       
  1851                 if ye >= 0:
       
  1852                     y_as_integer = yc*10**ye
       
  1853                     e = e*y_as_integer
       
  1854                     xe = xe*y_as_integer
       
  1855                 else:
       
  1856                     ten_pow = 10**-ye
       
  1857                     e, remainder = divmod(e*yc, ten_pow)
       
  1858                     if remainder:
       
  1859                         return None
       
  1860                     xe, remainder = divmod(xe*yc, ten_pow)
       
  1861                     if remainder:
       
  1862                         return None
       
  1863                 if e*3 >= p*10: # 10/3 > log(10)/log(2)
       
  1864                     return None
       
  1865                 xc = 2**e
       
  1866             else:
       
  1867                 return None
       
  1868 
       
  1869             if xc >= 10**p:
       
  1870                 return None
       
  1871             xe = -e-xe
       
  1872             return _dec_from_triple(0, str(xc), xe)
       
  1873 
       
  1874         # now y is positive; find m and n such that y = m/n
       
  1875         if ye >= 0:
       
  1876             m, n = yc*10**ye, 1
       
  1877         else:
       
  1878             if xe != 0 and len(str(abs(yc*xe))) <= -ye:
       
  1879                 return None
       
  1880             xc_bits = _nbits(xc)
       
  1881             if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
       
  1882                 return None
       
  1883             m, n = yc, 10**(-ye)
       
  1884             while m % 2 == n % 2 == 0:
       
  1885                 m //= 2
       
  1886                 n //= 2
       
  1887             while m % 5 == n % 5 == 0:
       
  1888                 m //= 5
       
  1889                 n //= 5
       
  1890 
       
  1891         # compute nth root of xc*10**xe
       
  1892         if n > 1:
       
  1893             # if 1 < xc < 2**n then xc isn't an nth power
       
  1894             if xc != 1 and xc_bits <= n:
       
  1895                 return None
       
  1896 
       
  1897             xe, rem = divmod(xe, n)
       
  1898             if rem != 0:
       
  1899                 return None
       
  1900 
       
  1901             # compute nth root of xc using Newton's method
       
  1902             a = 1L << -(-_nbits(xc)//n) # initial estimate
       
  1903             while True:
       
  1904                 q, r = divmod(xc, a**(n-1))
       
  1905                 if a <= q:
       
  1906                     break
       
  1907                 else:
       
  1908                     a = (a*(n-1) + q)//n
       
  1909             if not (a == q and r == 0):
       
  1910                 return None
       
  1911             xc = a
       
  1912 
       
  1913         # now xc*10**xe is the nth root of the original xc*10**xe
       
  1914         # compute mth power of xc*10**xe
       
  1915 
       
  1916         # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
       
  1917         # 10**p and the result is not representable.
       
  1918         if xc > 1 and m > p*100//_log10_lb(xc):
       
  1919             return None
       
  1920         xc = xc**m
       
  1921         xe *= m
       
  1922         if xc > 10**p:
       
  1923             return None
       
  1924 
       
  1925         # by this point the result *is* exactly representable
       
  1926         # adjust the exponent to get as close as possible to the ideal
       
  1927         # exponent, if necessary
       
  1928         str_xc = str(xc)
       
  1929         if other._isinteger() and other._sign == 0:
       
  1930             ideal_exponent = self._exp*int(other)
       
  1931             zeros = min(xe-ideal_exponent, p-len(str_xc))
       
  1932         else:
       
  1933             zeros = 0
       
  1934         return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
       
  1935 
       
  1936     def __pow__(self, other, modulo=None, context=None):
       
  1937         """Return self ** other [ % modulo].
       
  1938 
       
  1939         With two arguments, compute self**other.
       
  1940 
       
  1941         With three arguments, compute (self**other) % modulo.  For the
       
  1942         three argument form, the following restrictions on the
       
  1943         arguments hold:
       
  1944 
       
  1945          - all three arguments must be integral
       
  1946          - other must be nonnegative
       
  1947          - either self or other (or both) must be nonzero
       
  1948          - modulo must be nonzero and must have at most p digits,
       
  1949            where p is the context precision.
       
  1950 
       
  1951         If any of these restrictions is violated the InvalidOperation
       
  1952         flag is raised.
       
  1953 
       
  1954         The result of pow(self, other, modulo) is identical to the
       
  1955         result that would be obtained by computing (self**other) %
       
  1956         modulo with unbounded precision, but is computed more
       
  1957         efficiently.  It is always exact.
       
  1958         """
       
  1959 
       
  1960         if modulo is not None:
       
  1961             return self._power_modulo(other, modulo, context)
       
  1962 
       
  1963         other = _convert_other(other)
       
  1964         if other is NotImplemented:
       
  1965             return other
       
  1966 
       
  1967         if context is None:
       
  1968             context = getcontext()
       
  1969 
       
  1970         # either argument is a NaN => result is NaN
       
  1971         ans = self._check_nans(other, context)
       
  1972         if ans:
       
  1973             return ans
       
  1974 
       
  1975         # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
       
  1976         if not other:
       
  1977             if not self:
       
  1978                 return context._raise_error(InvalidOperation, '0 ** 0')
       
  1979             else:
       
  1980                 return Dec_p1
       
  1981 
       
  1982         # result has sign 1 iff self._sign is 1 and other is an odd integer
       
  1983         result_sign = 0
       
  1984         if self._sign == 1:
       
  1985             if other._isinteger():
       
  1986                 if not other._iseven():
       
  1987                     result_sign = 1
       
  1988             else:
       
  1989                 # -ve**noninteger = NaN
       
  1990                 # (-0)**noninteger = 0**noninteger
       
  1991                 if self:
       
  1992                     return context._raise_error(InvalidOperation,
       
  1993                         'x ** y with x negative and y not an integer')
       
  1994             # negate self, without doing any unwanted rounding
       
  1995             self = self.copy_negate()
       
  1996 
       
  1997         # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
       
  1998         if not self:
       
  1999             if other._sign == 0:
       
  2000                 return _dec_from_triple(result_sign, '0', 0)
       
  2001             else:
       
  2002                 return Infsign[result_sign]
       
  2003 
       
  2004         # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
       
  2005         if self._isinfinity():
       
  2006             if other._sign == 0:
       
  2007                 return Infsign[result_sign]
       
  2008             else:
       
  2009                 return _dec_from_triple(result_sign, '0', 0)
       
  2010 
       
  2011         # 1**other = 1, but the choice of exponent and the flags
       
  2012         # depend on the exponent of self, and on whether other is a
       
  2013         # positive integer, a negative integer, or neither
       
  2014         if self == Dec_p1:
       
  2015             if other._isinteger():
       
  2016                 # exp = max(self._exp*max(int(other), 0),
       
  2017                 # 1-context.prec) but evaluating int(other) directly
       
  2018                 # is dangerous until we know other is small (other
       
  2019                 # could be 1e999999999)
       
  2020                 if other._sign == 1:
       
  2021                     multiplier = 0
       
  2022                 elif other > context.prec:
       
  2023                     multiplier = context.prec
       
  2024                 else:
       
  2025                     multiplier = int(other)
       
  2026 
       
  2027                 exp = self._exp * multiplier
       
  2028                 if exp < 1-context.prec:
       
  2029                     exp = 1-context.prec
       
  2030                     context._raise_error(Rounded)
       
  2031             else:
       
  2032                 context._raise_error(Inexact)
       
  2033                 context._raise_error(Rounded)
       
  2034                 exp = 1-context.prec
       
  2035 
       
  2036             return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
       
  2037 
       
  2038         # compute adjusted exponent of self
       
  2039         self_adj = self.adjusted()
       
  2040 
       
  2041         # self ** infinity is infinity if self > 1, 0 if self < 1
       
  2042         # self ** -infinity is infinity if self < 1, 0 if self > 1
       
  2043         if other._isinfinity():
       
  2044             if (other._sign == 0) == (self_adj < 0):
       
  2045                 return _dec_from_triple(result_sign, '0', 0)
       
  2046             else:
       
  2047                 return Infsign[result_sign]
       
  2048 
       
  2049         # from here on, the result always goes through the call
       
  2050         # to _fix at the end of this function.
       
  2051         ans = None
       
  2052 
       
  2053         # crude test to catch cases of extreme overflow/underflow.  If
       
  2054         # log10(self)*other >= 10**bound and bound >= len(str(Emax))
       
  2055         # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
       
  2056         # self**other >= 10**(Emax+1), so overflow occurs.  The test
       
  2057         # for underflow is similar.
       
  2058         bound = self._log10_exp_bound() + other.adjusted()
       
  2059         if (self_adj >= 0) == (other._sign == 0):
       
  2060             # self > 1 and other +ve, or self < 1 and other -ve
       
  2061             # possibility of overflow
       
  2062             if bound >= len(str(context.Emax)):
       
  2063                 ans = _dec_from_triple(result_sign, '1', context.Emax+1)
       
  2064         else:
       
  2065             # self > 1 and other -ve, or self < 1 and other +ve
       
  2066             # possibility of underflow to 0
       
  2067             Etiny = context.Etiny()
       
  2068             if bound >= len(str(-Etiny)):
       
  2069                 ans = _dec_from_triple(result_sign, '1', Etiny-1)
       
  2070 
       
  2071         # try for an exact result with precision +1
       
  2072         if ans is None:
       
  2073             ans = self._power_exact(other, context.prec + 1)
       
  2074             if ans is not None and result_sign == 1:
       
  2075                 ans = _dec_from_triple(1, ans._int, ans._exp)
       
  2076 
       
  2077         # usual case: inexact result, x**y computed directly as exp(y*log(x))
       
  2078         if ans is None:
       
  2079             p = context.prec
       
  2080             x = _WorkRep(self)
       
  2081             xc, xe = x.int, x.exp
       
  2082             y = _WorkRep(other)
       
  2083             yc, ye = y.int, y.exp
       
  2084             if y.sign == 1:
       
  2085                 yc = -yc
       
  2086 
       
  2087             # compute correctly rounded result:  start with precision +3,
       
  2088             # then increase precision until result is unambiguously roundable
       
  2089             extra = 3
       
  2090             while True:
       
  2091                 coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
       
  2092                 if coeff % (5*10**(len(str(coeff))-p-1)):
       
  2093                     break
       
  2094                 extra += 3
       
  2095 
       
  2096             ans = _dec_from_triple(result_sign, str(coeff), exp)
       
  2097 
       
  2098         # the specification says that for non-integer other we need to
       
  2099         # raise Inexact, even when the result is actually exact.  In
       
  2100         # the same way, we need to raise Underflow here if the result
       
  2101         # is subnormal.  (The call to _fix will take care of raising
       
  2102         # Rounded and Subnormal, as usual.)
       
  2103         if not other._isinteger():
       
  2104             context._raise_error(Inexact)
       
  2105             # pad with zeros up to length context.prec+1 if necessary
       
  2106             if len(ans._int) <= context.prec:
       
  2107                 expdiff = context.prec+1 - len(ans._int)
       
  2108                 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
       
  2109                                        ans._exp-expdiff)
       
  2110             if ans.adjusted() < context.Emin:
       
  2111                 context._raise_error(Underflow)
       
  2112 
       
  2113         # unlike exp, ln and log10, the power function respects the
       
  2114         # rounding mode; no need to use ROUND_HALF_EVEN here
       
  2115         ans = ans._fix(context)
       
  2116         return ans
       
  2117 
       
  2118     def __rpow__(self, other, context=None):
       
  2119         """Swaps self/other and returns __pow__."""
       
  2120         other = _convert_other(other)
       
  2121         if other is NotImplemented:
       
  2122             return other
       
  2123         return other.__pow__(self, context=context)
       
  2124 
       
  2125     def normalize(self, context=None):
       
  2126         """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
       
  2127 
       
  2128         if context is None:
       
  2129             context = getcontext()
       
  2130 
       
  2131         if self._is_special:
       
  2132             ans = self._check_nans(context=context)
       
  2133             if ans:
       
  2134                 return ans
       
  2135 
       
  2136         dup = self._fix(context)
       
  2137         if dup._isinfinity():
       
  2138             return dup
       
  2139 
       
  2140         if not dup:
       
  2141             return _dec_from_triple(dup._sign, '0', 0)
       
  2142         exp_max = [context.Emax, context.Etop()][context._clamp]
       
  2143         end = len(dup._int)
       
  2144         exp = dup._exp
       
  2145         while dup._int[end-1] == '0' and exp < exp_max:
       
  2146             exp += 1
       
  2147             end -= 1
       
  2148         return _dec_from_triple(dup._sign, dup._int[:end], exp)
       
  2149 
       
  2150     def quantize(self, exp, rounding=None, context=None, watchexp=True):
       
  2151         """Quantize self so its exponent is the same as that of exp.
       
  2152 
       
  2153         Similar to self._rescale(exp._exp) but with error checking.
       
  2154         """
       
  2155         exp = _convert_other(exp, raiseit=True)
       
  2156 
       
  2157         if context is None:
       
  2158             context = getcontext()
       
  2159         if rounding is None:
       
  2160             rounding = context.rounding
       
  2161 
       
  2162         if self._is_special or exp._is_special:
       
  2163             ans = self._check_nans(exp, context)
       
  2164             if ans:
       
  2165                 return ans
       
  2166 
       
  2167             if exp._isinfinity() or self._isinfinity():
       
  2168                 if exp._isinfinity() and self._isinfinity():
       
  2169                     return Decimal(self)  # if both are inf, it is OK
       
  2170                 return context._raise_error(InvalidOperation,
       
  2171                                         'quantize with one INF')
       
  2172 
       
  2173         # if we're not watching exponents, do a simple rescale
       
  2174         if not watchexp:
       
  2175             ans = self._rescale(exp._exp, rounding)
       
  2176             # raise Inexact and Rounded where appropriate
       
  2177             if ans._exp > self._exp:
       
  2178                 context._raise_error(Rounded)
       
  2179                 if ans != self:
       
  2180                     context._raise_error(Inexact)
       
  2181             return ans
       
  2182 
       
  2183         # exp._exp should be between Etiny and Emax
       
  2184         if not (context.Etiny() <= exp._exp <= context.Emax):
       
  2185             return context._raise_error(InvalidOperation,
       
  2186                    'target exponent out of bounds in quantize')
       
  2187 
       
  2188         if not self:
       
  2189             ans = _dec_from_triple(self._sign, '0', exp._exp)
       
  2190             return ans._fix(context)
       
  2191 
       
  2192         self_adjusted = self.adjusted()
       
  2193         if self_adjusted > context.Emax:
       
  2194             return context._raise_error(InvalidOperation,
       
  2195                                         'exponent of quantize result too large for current context')
       
  2196         if self_adjusted - exp._exp + 1 > context.prec:
       
  2197             return context._raise_error(InvalidOperation,
       
  2198                                         'quantize result has too many digits for current context')
       
  2199 
       
  2200         ans = self._rescale(exp._exp, rounding)
       
  2201         if ans.adjusted() > context.Emax:
       
  2202             return context._raise_error(InvalidOperation,
       
  2203                                         'exponent of quantize result too large for current context')
       
  2204         if len(ans._int) > context.prec:
       
  2205             return context._raise_error(InvalidOperation,
       
  2206                                         'quantize result has too many digits for current context')
       
  2207 
       
  2208         # raise appropriate flags
       
  2209         if ans._exp > self._exp:
       
  2210             context._raise_error(Rounded)
       
  2211             if ans != self:
       
  2212                 context._raise_error(Inexact)
       
  2213         if ans and ans.adjusted() < context.Emin:
       
  2214             context._raise_error(Subnormal)
       
  2215 
       
  2216         # call to fix takes care of any necessary folddown
       
  2217         ans = ans._fix(context)
       
  2218         return ans
       
  2219 
       
  2220     def same_quantum(self, other):
       
  2221         """Return True if self and other have the same exponent; otherwise
       
  2222         return False.
       
  2223 
       
  2224         If either operand is a special value, the following rules are used:
       
  2225            * return True if both operands are infinities
       
  2226            * return True if both operands are NaNs
       
  2227            * otherwise, return False.
       
  2228         """
       
  2229         other = _convert_other(other, raiseit=True)
       
  2230         if self._is_special or other._is_special:
       
  2231             return (self.is_nan() and other.is_nan() or
       
  2232                     self.is_infinite() and other.is_infinite())
       
  2233         return self._exp == other._exp
       
  2234 
       
  2235     def _rescale(self, exp, rounding):
       
  2236         """Rescale self so that the exponent is exp, either by padding with zeros
       
  2237         or by truncating digits, using the given rounding mode.
       
  2238 
       
  2239         Specials are returned without change.  This operation is
       
  2240         quiet: it raises no flags, and uses no information from the
       
  2241         context.
       
  2242 
       
  2243         exp = exp to scale to (an integer)
       
  2244         rounding = rounding mode
       
  2245         """
       
  2246         if self._is_special:
       
  2247             return Decimal(self)
       
  2248         if not self:
       
  2249             return _dec_from_triple(self._sign, '0', exp)
       
  2250 
       
  2251         if self._exp >= exp:
       
  2252             # pad answer with zeros if necessary
       
  2253             return _dec_from_triple(self._sign,
       
  2254                                         self._int + '0'*(self._exp - exp), exp)
       
  2255 
       
  2256         # too many digits; round and lose data.  If self.adjusted() <
       
  2257         # exp-1, replace self by 10**(exp-1) before rounding
       
  2258         digits = len(self._int) + self._exp - exp
       
  2259         if digits < 0:
       
  2260             self = _dec_from_triple(self._sign, '1', exp-1)
       
  2261             digits = 0
       
  2262         this_function = getattr(self, self._pick_rounding_function[rounding])
       
  2263         changed = this_function(digits)
       
  2264         coeff = self._int[:digits] or '0'
       
  2265         if changed == 1:
       
  2266             coeff = str(int(coeff)+1)
       
  2267         return _dec_from_triple(self._sign, coeff, exp)
       
  2268 
       
  2269     def to_integral_exact(self, rounding=None, context=None):
       
  2270         """Rounds to a nearby integer.
       
  2271 
       
  2272         If no rounding mode is specified, take the rounding mode from
       
  2273         the context.  This method raises the Rounded and Inexact flags
       
  2274         when appropriate.
       
  2275 
       
  2276         See also: to_integral_value, which does exactly the same as
       
  2277         this method except that it doesn't raise Inexact or Rounded.
       
  2278         """
       
  2279         if self._is_special:
       
  2280             ans = self._check_nans(context=context)
       
  2281             if ans:
       
  2282                 return ans
       
  2283             return Decimal(self)
       
  2284         if self._exp >= 0:
       
  2285             return Decimal(self)
       
  2286         if not self:
       
  2287             return _dec_from_triple(self._sign, '0', 0)
       
  2288         if context is None:
       
  2289             context = getcontext()
       
  2290         if rounding is None:
       
  2291             rounding = context.rounding
       
  2292         context._raise_error(Rounded)
       
  2293         ans = self._rescale(0, rounding)
       
  2294         if ans != self:
       
  2295             context._raise_error(Inexact)
       
  2296         return ans
       
  2297 
       
  2298     def to_integral_value(self, rounding=None, context=None):
       
  2299         """Rounds to the nearest integer, without raising inexact, rounded."""
       
  2300         if context is None:
       
  2301             context = getcontext()
       
  2302         if rounding is None:
       
  2303             rounding = context.rounding
       
  2304         if self._is_special:
       
  2305             ans = self._check_nans(context=context)
       
  2306             if ans:
       
  2307                 return ans
       
  2308             return Decimal(self)
       
  2309         if self._exp >= 0:
       
  2310             return Decimal(self)
       
  2311         else:
       
  2312             return self._rescale(0, rounding)
       
  2313 
       
  2314     # the method name changed, but we provide also the old one, for compatibility
       
  2315     to_integral = to_integral_value
       
  2316 
       
  2317     def sqrt(self, context=None):
       
  2318         """Return the square root of self."""
       
  2319         if self._is_special:
       
  2320             ans = self._check_nans(context=context)
       
  2321             if ans:
       
  2322                 return ans
       
  2323 
       
  2324             if self._isinfinity() and self._sign == 0:
       
  2325                 return Decimal(self)
       
  2326 
       
  2327         if not self:
       
  2328             # exponent = self._exp // 2.  sqrt(-0) = -0
       
  2329             ans = _dec_from_triple(self._sign, '0', self._exp // 2)
       
  2330             return ans._fix(context)
       
  2331 
       
  2332         if context is None:
       
  2333             context = getcontext()
       
  2334 
       
  2335         if self._sign == 1:
       
  2336             return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
       
  2337 
       
  2338         # At this point self represents a positive number.  Let p be
       
  2339         # the desired precision and express self in the form c*100**e
       
  2340         # with c a positive real number and e an integer, c and e
       
  2341         # being chosen so that 100**(p-1) <= c < 100**p.  Then the
       
  2342         # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
       
  2343         # <= sqrt(c) < 10**p, so the closest representable Decimal at
       
  2344         # precision p is n*10**e where n = round_half_even(sqrt(c)),
       
  2345         # the closest integer to sqrt(c) with the even integer chosen
       
  2346         # in the case of a tie.
       
  2347         #
       
  2348         # To ensure correct rounding in all cases, we use the
       
  2349         # following trick: we compute the square root to an extra
       
  2350         # place (precision p+1 instead of precision p), rounding down.
       
  2351         # Then, if the result is inexact and its last digit is 0 or 5,
       
  2352         # we increase the last digit to 1 or 6 respectively; if it's
       
  2353         # exact we leave the last digit alone.  Now the final round to
       
  2354         # p places (or fewer in the case of underflow) will round
       
  2355         # correctly and raise the appropriate flags.
       
  2356 
       
  2357         # use an extra digit of precision
       
  2358         prec = context.prec+1
       
  2359 
       
  2360         # write argument in the form c*100**e where e = self._exp//2
       
  2361         # is the 'ideal' exponent, to be used if the square root is
       
  2362         # exactly representable.  l is the number of 'digits' of c in
       
  2363         # base 100, so that 100**(l-1) <= c < 100**l.
       
  2364         op = _WorkRep(self)
       
  2365         e = op.exp >> 1
       
  2366         if op.exp & 1:
       
  2367             c = op.int * 10
       
  2368             l = (len(self._int) >> 1) + 1
       
  2369         else:
       
  2370             c = op.int
       
  2371             l = len(self._int)+1 >> 1
       
  2372 
       
  2373         # rescale so that c has exactly prec base 100 'digits'
       
  2374         shift = prec-l
       
  2375         if shift >= 0:
       
  2376             c *= 100**shift
       
  2377             exact = True
       
  2378         else:
       
  2379             c, remainder = divmod(c, 100**-shift)
       
  2380             exact = not remainder
       
  2381         e -= shift
       
  2382 
       
  2383         # find n = floor(sqrt(c)) using Newton's method
       
  2384         n = 10**prec
       
  2385         while True:
       
  2386             q = c//n
       
  2387             if n <= q:
       
  2388                 break
       
  2389             else:
       
  2390                 n = n + q >> 1
       
  2391         exact = exact and n*n == c
       
  2392 
       
  2393         if exact:
       
  2394             # result is exact; rescale to use ideal exponent e
       
  2395             if shift >= 0:
       
  2396                 # assert n % 10**shift == 0
       
  2397                 n //= 10**shift
       
  2398             else:
       
  2399                 n *= 10**-shift
       
  2400             e += shift
       
  2401         else:
       
  2402             # result is not exact; fix last digit as described above
       
  2403             if n % 5 == 0:
       
  2404                 n += 1
       
  2405 
       
  2406         ans = _dec_from_triple(0, str(n), e)
       
  2407 
       
  2408         # round, and fit to current context
       
  2409         context = context._shallow_copy()
       
  2410         rounding = context._set_rounding(ROUND_HALF_EVEN)
       
  2411         ans = ans._fix(context)
       
  2412         context.rounding = rounding
       
  2413 
       
  2414         return ans
       
  2415 
       
  2416     def max(self, other, context=None):
       
  2417         """Returns the larger value.
       
  2418 
       
  2419         Like max(self, other) except if one is not a number, returns
       
  2420         NaN (and signals if one is sNaN).  Also rounds.
       
  2421         """
       
  2422         other = _convert_other(other, raiseit=True)
       
  2423 
       
  2424         if context is None:
       
  2425             context = getcontext()
       
  2426 
       
  2427         if self._is_special or other._is_special:
       
  2428             # If one operand is a quiet NaN and the other is number, then the
       
  2429             # number is always returned
       
  2430             sn = self._isnan()
       
  2431             on = other._isnan()
       
  2432             if sn or on:
       
  2433                 if on == 1 and sn != 2:
       
  2434                     return self._fix_nan(context)
       
  2435                 if sn == 1 and on != 2:
       
  2436                     return other._fix_nan(context)
       
  2437                 return self._check_nans(other, context)
       
  2438 
       
  2439         c = self.__cmp__(other)
       
  2440         if c == 0:
       
  2441             # If both operands are finite and equal in numerical value
       
  2442             # then an ordering is applied:
       
  2443             #
       
  2444             # If the signs differ then max returns the operand with the
       
  2445             # positive sign and min returns the operand with the negative sign
       
  2446             #
       
  2447             # If the signs are the same then the exponent is used to select
       
  2448             # the result.  This is exactly the ordering used in compare_total.
       
  2449             c = self.compare_total(other)
       
  2450 
       
  2451         if c == -1:
       
  2452             ans = other
       
  2453         else:
       
  2454             ans = self
       
  2455 
       
  2456         return ans._fix(context)
       
  2457 
       
  2458     def min(self, other, context=None):
       
  2459         """Returns the smaller value.
       
  2460 
       
  2461         Like min(self, other) except if one is not a number, returns
       
  2462         NaN (and signals if one is sNaN).  Also rounds.
       
  2463         """
       
  2464         other = _convert_other(other, raiseit=True)
       
  2465 
       
  2466         if context is None:
       
  2467             context = getcontext()
       
  2468 
       
  2469         if self._is_special or other._is_special:
       
  2470             # If one operand is a quiet NaN and the other is number, then the
       
  2471             # number is always returned
       
  2472             sn = self._isnan()
       
  2473             on = other._isnan()
       
  2474             if sn or on:
       
  2475                 if on == 1 and sn != 2:
       
  2476                     return self._fix_nan(context)
       
  2477                 if sn == 1 and on != 2:
       
  2478                     return other._fix_nan(context)
       
  2479                 return self._check_nans(other, context)
       
  2480 
       
  2481         c = self.__cmp__(other)
       
  2482         if c == 0:
       
  2483             c = self.compare_total(other)
       
  2484 
       
  2485         if c == -1:
       
  2486             ans = self
       
  2487         else:
       
  2488             ans = other
       
  2489 
       
  2490         return ans._fix(context)
       
  2491 
       
  2492     def _isinteger(self):
       
  2493         """Returns whether self is an integer"""
       
  2494         if self._is_special:
       
  2495             return False
       
  2496         if self._exp >= 0:
       
  2497             return True
       
  2498         rest = self._int[self._exp:]
       
  2499         return rest == '0'*len(rest)
       
  2500 
       
  2501     def _iseven(self):
       
  2502         """Returns True if self is even.  Assumes self is an integer."""
       
  2503         if not self or self._exp > 0:
       
  2504             return True
       
  2505         return self._int[-1+self._exp] in '02468'
       
  2506 
       
  2507     def adjusted(self):
       
  2508         """Return the adjusted exponent of self"""
       
  2509         try:
       
  2510             return self._exp + len(self._int) - 1
       
  2511         # If NaN or Infinity, self._exp is string
       
  2512         except TypeError:
       
  2513             return 0
       
  2514 
       
  2515     def canonical(self, context=None):
       
  2516         """Returns the same Decimal object.
       
  2517 
       
  2518         As we do not have different encodings for the same number, the
       
  2519         received object already is in its canonical form.
       
  2520         """
       
  2521         return self
       
  2522 
       
  2523     def compare_signal(self, other, context=None):
       
  2524         """Compares self to the other operand numerically.
       
  2525 
       
  2526         It's pretty much like compare(), but all NaNs signal, with signaling
       
  2527         NaNs taking precedence over quiet NaNs.
       
  2528         """
       
  2529         if context is None:
       
  2530             context = getcontext()
       
  2531 
       
  2532         self_is_nan = self._isnan()
       
  2533         other_is_nan = other._isnan()
       
  2534         if self_is_nan == 2:
       
  2535             return context._raise_error(InvalidOperation, 'sNaN',
       
  2536                                         self)
       
  2537         if other_is_nan == 2:
       
  2538             return context._raise_error(InvalidOperation, 'sNaN',
       
  2539                                         other)
       
  2540         if self_is_nan:
       
  2541             return context._raise_error(InvalidOperation, 'NaN in compare_signal',
       
  2542                                         self)
       
  2543         if other_is_nan:
       
  2544             return context._raise_error(InvalidOperation, 'NaN in compare_signal',
       
  2545                                         other)
       
  2546         return self.compare(other, context=context)
       
  2547 
       
  2548     def compare_total(self, other):
       
  2549         """Compares self to other using the abstract representations.
       
  2550 
       
  2551         This is not like the standard compare, which use their numerical
       
  2552         value. Note that a total ordering is defined for all possible abstract
       
  2553         representations.
       
  2554         """
       
  2555         # if one is negative and the other is positive, it's easy
       
  2556         if self._sign and not other._sign:
       
  2557             return Dec_n1
       
  2558         if not self._sign and other._sign:
       
  2559             return Dec_p1
       
  2560         sign = self._sign
       
  2561 
       
  2562         # let's handle both NaN types
       
  2563         self_nan = self._isnan()
       
  2564         other_nan = other._isnan()
       
  2565         if self_nan or other_nan:
       
  2566             if self_nan == other_nan:
       
  2567                 if self._int < other._int:
       
  2568                     if sign:
       
  2569                         return Dec_p1
       
  2570                     else:
       
  2571                         return Dec_n1
       
  2572                 if self._int > other._int:
       
  2573                     if sign:
       
  2574                         return Dec_n1
       
  2575                     else:
       
  2576                         return Dec_p1
       
  2577                 return Dec_0
       
  2578 
       
  2579             if sign:
       
  2580                 if self_nan == 1:
       
  2581                     return Dec_n1
       
  2582                 if other_nan == 1:
       
  2583                     return Dec_p1
       
  2584                 if self_nan == 2:
       
  2585                     return Dec_n1
       
  2586                 if other_nan == 2:
       
  2587                     return Dec_p1
       
  2588             else:
       
  2589                 if self_nan == 1:
       
  2590                     return Dec_p1
       
  2591                 if other_nan == 1:
       
  2592                     return Dec_n1
       
  2593                 if self_nan == 2:
       
  2594                     return Dec_p1
       
  2595                 if other_nan == 2:
       
  2596                     return Dec_n1
       
  2597 
       
  2598         if self < other:
       
  2599             return Dec_n1
       
  2600         if self > other:
       
  2601             return Dec_p1
       
  2602 
       
  2603         if self._exp < other._exp:
       
  2604             if sign:
       
  2605                 return Dec_p1
       
  2606             else:
       
  2607                 return Dec_n1
       
  2608         if self._exp > other._exp:
       
  2609             if sign:
       
  2610                 return Dec_n1
       
  2611             else:
       
  2612                 return Dec_p1
       
  2613         return Dec_0
       
  2614 
       
  2615 
       
  2616     def compare_total_mag(self, other):
       
  2617         """Compares self to other using abstract repr., ignoring sign.
       
  2618 
       
  2619         Like compare_total, but with operand's sign ignored and assumed to be 0.
       
  2620         """
       
  2621         s = self.copy_abs()
       
  2622         o = other.copy_abs()
       
  2623         return s.compare_total(o)
       
  2624 
       
  2625     def copy_abs(self):
       
  2626         """Returns a copy with the sign set to 0. """
       
  2627         return _dec_from_triple(0, self._int, self._exp, self._is_special)
       
  2628 
       
  2629     def copy_negate(self):
       
  2630         """Returns a copy with the sign inverted."""
       
  2631         if self._sign:
       
  2632             return _dec_from_triple(0, self._int, self._exp, self._is_special)
       
  2633         else:
       
  2634             return _dec_from_triple(1, self._int, self._exp, self._is_special)
       
  2635 
       
  2636     def copy_sign(self, other):
       
  2637         """Returns self with the sign of other."""
       
  2638         return _dec_from_triple(other._sign, self._int,
       
  2639                                 self._exp, self._is_special)
       
  2640 
       
  2641     def exp(self, context=None):
       
  2642         """Returns e ** self."""
       
  2643 
       
  2644         if context is None:
       
  2645             context = getcontext()
       
  2646 
       
  2647         # exp(NaN) = NaN
       
  2648         ans = self._check_nans(context=context)
       
  2649         if ans:
       
  2650             return ans
       
  2651 
       
  2652         # exp(-Infinity) = 0
       
  2653         if self._isinfinity() == -1:
       
  2654             return Dec_0
       
  2655 
       
  2656         # exp(0) = 1
       
  2657         if not self:
       
  2658             return Dec_p1
       
  2659 
       
  2660         # exp(Infinity) = Infinity
       
  2661         if self._isinfinity() == 1:
       
  2662             return Decimal(self)
       
  2663 
       
  2664         # the result is now guaranteed to be inexact (the true
       
  2665         # mathematical result is transcendental). There's no need to
       
  2666         # raise Rounded and Inexact here---they'll always be raised as
       
  2667         # a result of the call to _fix.
       
  2668         p = context.prec
       
  2669         adj = self.adjusted()
       
  2670 
       
  2671         # we only need to do any computation for quite a small range
       
  2672         # of adjusted exponents---for example, -29 <= adj <= 10 for
       
  2673         # the default context.  For smaller exponent the result is
       
  2674         # indistinguishable from 1 at the given precision, while for
       
  2675         # larger exponent the result either overflows or underflows.
       
  2676         if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
       
  2677             # overflow
       
  2678             ans = _dec_from_triple(0, '1', context.Emax+1)
       
  2679         elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
       
  2680             # underflow to 0
       
  2681             ans = _dec_from_triple(0, '1', context.Etiny()-1)
       
  2682         elif self._sign == 0 and adj < -p:
       
  2683             # p+1 digits; final round will raise correct flags
       
  2684             ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
       
  2685         elif self._sign == 1 and adj < -p-1:
       
  2686             # p+1 digits; final round will raise correct flags
       
  2687             ans = _dec_from_triple(0, '9'*(p+1), -p-1)
       
  2688         # general case
       
  2689         else:
       
  2690             op = _WorkRep(self)
       
  2691             c, e = op.int, op.exp
       
  2692             if op.sign == 1:
       
  2693                 c = -c
       
  2694 
       
  2695             # compute correctly rounded result: increase precision by
       
  2696             # 3 digits at a time until we get an unambiguously
       
  2697             # roundable result
       
  2698             extra = 3
       
  2699             while True:
       
  2700                 coeff, exp = _dexp(c, e, p+extra)
       
  2701                 if coeff % (5*10**(len(str(coeff))-p-1)):
       
  2702                     break
       
  2703                 extra += 3
       
  2704 
       
  2705             ans = _dec_from_triple(0, str(coeff), exp)
       
  2706 
       
  2707         # at this stage, ans should round correctly with *any*
       
  2708         # rounding mode, not just with ROUND_HALF_EVEN
       
  2709         context = context._shallow_copy()
       
  2710         rounding = context._set_rounding(ROUND_HALF_EVEN)
       
  2711         ans = ans._fix(context)
       
  2712         context.rounding = rounding
       
  2713 
       
  2714         return ans
       
  2715 
       
  2716     def is_canonical(self):
       
  2717         """Return True if self is canonical; otherwise return False.
       
  2718 
       
  2719         Currently, the encoding of a Decimal instance is always
       
  2720         canonical, so this method returns True for any Decimal.
       
  2721         """
       
  2722         return True
       
  2723 
       
  2724     def is_finite(self):
       
  2725         """Return True if self is finite; otherwise return False.
       
  2726 
       
  2727         A Decimal instance is considered finite if it is neither
       
  2728         infinite nor a NaN.
       
  2729         """
       
  2730         return not self._is_special
       
  2731 
       
  2732     def is_infinite(self):
       
  2733         """Return True if self is infinite; otherwise return False."""
       
  2734         return self._exp == 'F'
       
  2735 
       
  2736     def is_nan(self):
       
  2737         """Return True if self is a qNaN or sNaN; otherwise return False."""
       
  2738         return self._exp in ('n', 'N')
       
  2739 
       
  2740     def is_normal(self, context=None):
       
  2741         """Return True if self is a normal number; otherwise return False."""
       
  2742         if self._is_special or not self:
       
  2743             return False
       
  2744         if context is None:
       
  2745             context = getcontext()
       
  2746         return context.Emin <= self.adjusted() <= context.Emax
       
  2747 
       
  2748     def is_qnan(self):
       
  2749         """Return True if self is a quiet NaN; otherwise return False."""
       
  2750         return self._exp == 'n'
       
  2751 
       
  2752     def is_signed(self):
       
  2753         """Return True if self is negative; otherwise return False."""
       
  2754         return self._sign == 1
       
  2755 
       
  2756     def is_snan(self):
       
  2757         """Return True if self is a signaling NaN; otherwise return False."""
       
  2758         return self._exp == 'N'
       
  2759 
       
  2760     def is_subnormal(self, context=None):
       
  2761         """Return True if self is subnormal; otherwise return False."""
       
  2762         if self._is_special or not self:
       
  2763             return False
       
  2764         if context is None:
       
  2765             context = getcontext()
       
  2766         return self.adjusted() < context.Emin
       
  2767 
       
  2768     def is_zero(self):
       
  2769         """Return True if self is a zero; otherwise return False."""
       
  2770         return not self._is_special and self._int == '0'
       
  2771 
       
  2772     def _ln_exp_bound(self):
       
  2773         """Compute a lower bound for the adjusted exponent of self.ln().
       
  2774         In other words, compute r such that self.ln() >= 10**r.  Assumes
       
  2775         that self is finite and positive and that self != 1.
       
  2776         """
       
  2777 
       
  2778         # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
       
  2779         adj = self._exp + len(self._int) - 1
       
  2780         if adj >= 1:
       
  2781             # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
       
  2782             return len(str(adj*23//10)) - 1
       
  2783         if adj <= -2:
       
  2784             # argument <= 0.1
       
  2785             return len(str((-1-adj)*23//10)) - 1
       
  2786         op = _WorkRep(self)
       
  2787         c, e = op.int, op.exp
       
  2788         if adj == 0:
       
  2789             # 1 < self < 10
       
  2790             num = str(c-10**-e)
       
  2791             den = str(c)
       
  2792             return len(num) - len(den) - (num < den)
       
  2793         # adj == -1, 0.1 <= self < 1
       
  2794         return e + len(str(10**-e - c)) - 1
       
  2795 
       
  2796 
       
  2797     def ln(self, context=None):
       
  2798         """Returns the natural (base e) logarithm of self."""
       
  2799 
       
  2800         if context is None:
       
  2801             context = getcontext()
       
  2802 
       
  2803         # ln(NaN) = NaN
       
  2804         ans = self._check_nans(context=context)
       
  2805         if ans:
       
  2806             return ans
       
  2807 
       
  2808         # ln(0.0) == -Infinity
       
  2809         if not self:
       
  2810             return negInf
       
  2811 
       
  2812         # ln(Infinity) = Infinity
       
  2813         if self._isinfinity() == 1:
       
  2814             return Inf
       
  2815 
       
  2816         # ln(1.0) == 0.0
       
  2817         if self == Dec_p1:
       
  2818             return Dec_0
       
  2819 
       
  2820         # ln(negative) raises InvalidOperation
       
  2821         if self._sign == 1:
       
  2822             return context._raise_error(InvalidOperation,
       
  2823                                         'ln of a negative value')
       
  2824 
       
  2825         # result is irrational, so necessarily inexact
       
  2826         op = _WorkRep(self)
       
  2827         c, e = op.int, op.exp
       
  2828         p = context.prec
       
  2829 
       
  2830         # correctly rounded result: repeatedly increase precision by 3
       
  2831         # until we get an unambiguously roundable result
       
  2832         places = p - self._ln_exp_bound() + 2 # at least p+3 places
       
  2833         while True:
       
  2834             coeff = _dlog(c, e, places)
       
  2835             # assert len(str(abs(coeff)))-p >= 1
       
  2836             if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
       
  2837                 break
       
  2838             places += 3
       
  2839         ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
       
  2840 
       
  2841         context = context._shallow_copy()
       
  2842         rounding = context._set_rounding(ROUND_HALF_EVEN)
       
  2843         ans = ans._fix(context)
       
  2844         context.rounding = rounding
       
  2845         return ans
       
  2846 
       
  2847     def _log10_exp_bound(self):
       
  2848         """Compute a lower bound for the adjusted exponent of self.log10().
       
  2849         In other words, find r such that self.log10() >= 10**r.
       
  2850         Assumes that self is finite and positive and that self != 1.
       
  2851         """
       
  2852 
       
  2853         # For x >= 10 or x < 0.1 we only need a bound on the integer
       
  2854         # part of log10(self), and this comes directly from the
       
  2855         # exponent of x.  For 0.1 <= x <= 10 we use the inequalities
       
  2856         # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
       
  2857         # (1-1/x)/2.31 > 0.  If x < 1 then |log10(x)| > (1-x)/2.31 > 0
       
  2858 
       
  2859         adj = self._exp + len(self._int) - 1
       
  2860         if adj >= 1:
       
  2861             # self >= 10
       
  2862             return len(str(adj))-1
       
  2863         if adj <= -2:
       
  2864             # self < 0.1
       
  2865             return len(str(-1-adj))-1
       
  2866         op = _WorkRep(self)
       
  2867         c, e = op.int, op.exp
       
  2868         if adj == 0:
       
  2869             # 1 < self < 10
       
  2870             num = str(c-10**-e)
       
  2871             den = str(231*c)
       
  2872             return len(num) - len(den) - (num < den) + 2
       
  2873         # adj == -1, 0.1 <= self < 1
       
  2874         num = str(10**-e-c)
       
  2875         return len(num) + e - (num < "231") - 1
       
  2876 
       
  2877     def log10(self, context=None):
       
  2878         """Returns the base 10 logarithm of self."""
       
  2879 
       
  2880         if context is None:
       
  2881             context = getcontext()
       
  2882 
       
  2883         # log10(NaN) = NaN
       
  2884         ans = self._check_nans(context=context)
       
  2885         if ans:
       
  2886             return ans
       
  2887 
       
  2888         # log10(0.0) == -Infinity
       
  2889         if not self:
       
  2890             return negInf
       
  2891 
       
  2892         # log10(Infinity) = Infinity
       
  2893         if self._isinfinity() == 1:
       
  2894             return Inf
       
  2895 
       
  2896         # log10(negative or -Infinity) raises InvalidOperation
       
  2897         if self._sign == 1:
       
  2898             return context._raise_error(InvalidOperation,
       
  2899                                         'log10 of a negative value')
       
  2900 
       
  2901         # log10(10**n) = n
       
  2902         if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
       
  2903             # answer may need rounding
       
  2904             ans = Decimal(self._exp + len(self._int) - 1)
       
  2905         else:
       
  2906             # result is irrational, so necessarily inexact
       
  2907             op = _WorkRep(self)
       
  2908             c, e = op.int, op.exp
       
  2909             p = context.prec
       
  2910 
       
  2911             # correctly rounded result: repeatedly increase precision
       
  2912             # until result is unambiguously roundable
       
  2913             places = p-self._log10_exp_bound()+2
       
  2914             while True:
       
  2915                 coeff = _dlog10(c, e, places)
       
  2916                 # assert len(str(abs(coeff)))-p >= 1
       
  2917                 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
       
  2918                     break
       
  2919                 places += 3
       
  2920             ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
       
  2921 
       
  2922         context = context._shallow_copy()
       
  2923         rounding = context._set_rounding(ROUND_HALF_EVEN)
       
  2924         ans = ans._fix(context)
       
  2925         context.rounding = rounding
       
  2926         return ans
       
  2927 
       
  2928     def logb(self, context=None):
       
  2929         """ Returns the exponent of the magnitude of self's MSD.
       
  2930 
       
  2931         The result is the integer which is the exponent of the magnitude
       
  2932         of the most significant digit of self (as though it were truncated
       
  2933         to a single digit while maintaining the value of that digit and
       
  2934         without limiting the resulting exponent).
       
  2935         """
       
  2936         # logb(NaN) = NaN
       
  2937         ans = self._check_nans(context=context)
       
  2938         if ans:
       
  2939             return ans
       
  2940 
       
  2941         if context is None:
       
  2942             context = getcontext()
       
  2943 
       
  2944         # logb(+/-Inf) = +Inf
       
  2945         if self._isinfinity():
       
  2946             return Inf
       
  2947 
       
  2948         # logb(0) = -Inf, DivisionByZero
       
  2949         if not self:
       
  2950             return context._raise_error(DivisionByZero, 'logb(0)', 1)
       
  2951 
       
  2952         # otherwise, simply return the adjusted exponent of self, as a
       
  2953         # Decimal.  Note that no attempt is made to fit the result
       
  2954         # into the current context.
       
  2955         return Decimal(self.adjusted())
       
  2956 
       
  2957     def _islogical(self):
       
  2958         """Return True if self is a logical operand.
       
  2959 
       
  2960         For being logical, it must be a finite numbers with a sign of 0,
       
  2961         an exponent of 0, and a coefficient whose digits must all be
       
  2962         either 0 or 1.
       
  2963         """
       
  2964         if self._sign != 0 or self._exp != 0:
       
  2965             return False
       
  2966         for dig in self._int:
       
  2967             if dig not in '01':
       
  2968                 return False
       
  2969         return True
       
  2970 
       
  2971     def _fill_logical(self, context, opa, opb):
       
  2972         dif = context.prec - len(opa)
       
  2973         if dif > 0:
       
  2974             opa = '0'*dif + opa
       
  2975         elif dif < 0:
       
  2976             opa = opa[-context.prec:]
       
  2977         dif = context.prec - len(opb)
       
  2978         if dif > 0:
       
  2979             opb = '0'*dif + opb
       
  2980         elif dif < 0:
       
  2981             opb = opb[-context.prec:]
       
  2982         return opa, opb
       
  2983 
       
  2984     def logical_and(self, other, context=None):
       
  2985         """Applies an 'and' operation between self and other's digits."""
       
  2986         if context is None:
       
  2987             context = getcontext()
       
  2988         if not self._islogical() or not other._islogical():
       
  2989             return context._raise_error(InvalidOperation)
       
  2990 
       
  2991         # fill to context.prec
       
  2992         (opa, opb) = self._fill_logical(context, self._int, other._int)
       
  2993 
       
  2994         # make the operation, and clean starting zeroes
       
  2995         result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
       
  2996         return _dec_from_triple(0, result.lstrip('0') or '0', 0)
       
  2997 
       
  2998     def logical_invert(self, context=None):
       
  2999         """Invert all its digits."""
       
  3000         if context is None:
       
  3001             context = getcontext()
       
  3002         return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
       
  3003                                 context)
       
  3004 
       
  3005     def logical_or(self, other, context=None):
       
  3006         """Applies an 'or' operation between self and other's digits."""
       
  3007         if context is None:
       
  3008             context = getcontext()
       
  3009         if not self._islogical() or not other._islogical():
       
  3010             return context._raise_error(InvalidOperation)
       
  3011 
       
  3012         # fill to context.prec
       
  3013         (opa, opb) = self._fill_logical(context, self._int, other._int)
       
  3014 
       
  3015         # make the operation, and clean starting zeroes
       
  3016         result = "".join(str(int(a)|int(b)) for a,b in zip(opa,opb))
       
  3017         return _dec_from_triple(0, result.lstrip('0') or '0', 0)
       
  3018 
       
  3019     def logical_xor(self, other, context=None):
       
  3020         """Applies an 'xor' operation between self and other's digits."""
       
  3021         if context is None:
       
  3022             context = getcontext()
       
  3023         if not self._islogical() or not other._islogical():
       
  3024             return context._raise_error(InvalidOperation)
       
  3025 
       
  3026         # fill to context.prec
       
  3027         (opa, opb) = self._fill_logical(context, self._int, other._int)
       
  3028 
       
  3029         # make the operation, and clean starting zeroes
       
  3030         result = "".join(str(int(a)^int(b)) for a,b in zip(opa,opb))
       
  3031         return _dec_from_triple(0, result.lstrip('0') or '0', 0)
       
  3032 
       
  3033     def max_mag(self, other, context=None):
       
  3034         """Compares the values numerically with their sign ignored."""
       
  3035         other = _convert_other(other, raiseit=True)
       
  3036 
       
  3037         if context is None:
       
  3038             context = getcontext()
       
  3039 
       
  3040         if self._is_special or other._is_special:
       
  3041             # If one operand is a quiet NaN and the other is number, then the
       
  3042             # number is always returned
       
  3043             sn = self._isnan()
       
  3044             on = other._isnan()
       
  3045             if sn or on:
       
  3046                 if on == 1 and sn != 2:
       
  3047                     return self._fix_nan(context)
       
  3048                 if sn == 1 and on != 2:
       
  3049                     return other._fix_nan(context)
       
  3050                 return self._check_nans(other, context)
       
  3051 
       
  3052         c = self.copy_abs().__cmp__(other.copy_abs())
       
  3053         if c == 0:
       
  3054             c = self.compare_total(other)
       
  3055 
       
  3056         if c == -1:
       
  3057             ans = other
       
  3058         else:
       
  3059             ans = self
       
  3060 
       
  3061         return ans._fix(context)
       
  3062 
       
  3063     def min_mag(self, other, context=None):
       
  3064         """Compares the values numerically with their sign ignored."""
       
  3065         other = _convert_other(other, raiseit=True)
       
  3066 
       
  3067         if context is None:
       
  3068             context = getcontext()
       
  3069 
       
  3070         if self._is_special or other._is_special:
       
  3071             # If one operand is a quiet NaN and the other is number, then the
       
  3072             # number is always returned
       
  3073             sn = self._isnan()
       
  3074             on = other._isnan()
       
  3075             if sn or on:
       
  3076                 if on == 1 and sn != 2:
       
  3077                     return self._fix_nan(context)
       
  3078                 if sn == 1 and on != 2:
       
  3079                     return other._fix_nan(context)
       
  3080                 return self._check_nans(other, context)
       
  3081 
       
  3082         c = self.copy_abs().__cmp__(other.copy_abs())
       
  3083         if c == 0:
       
  3084             c = self.compare_total(other)
       
  3085 
       
  3086         if c == -1:
       
  3087             ans = self
       
  3088         else:
       
  3089             ans = other
       
  3090 
       
  3091         return ans._fix(context)
       
  3092 
       
  3093     def next_minus(self, context=None):
       
  3094         """Returns the largest representable number smaller than itself."""
       
  3095         if context is None:
       
  3096             context = getcontext()
       
  3097 
       
  3098         ans = self._check_nans(context=context)
       
  3099         if ans:
       
  3100             return ans
       
  3101 
       
  3102         if self._isinfinity() == -1:
       
  3103             return negInf
       
  3104         if self._isinfinity() == 1:
       
  3105             return _dec_from_triple(0, '9'*context.prec, context.Etop())
       
  3106 
       
  3107         context = context.copy()
       
  3108         context._set_rounding(ROUND_FLOOR)
       
  3109         context._ignore_all_flags()
       
  3110         new_self = self._fix(context)
       
  3111         if new_self != self:
       
  3112             return new_self
       
  3113         return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
       
  3114                             context)
       
  3115 
       
  3116     def next_plus(self, context=None):
       
  3117         """Returns the smallest representable number larger than itself."""
       
  3118         if context is None:
       
  3119             context = getcontext()
       
  3120 
       
  3121         ans = self._check_nans(context=context)
       
  3122         if ans:
       
  3123             return ans
       
  3124 
       
  3125         if self._isinfinity() == 1:
       
  3126             return Inf
       
  3127         if self._isinfinity() == -1:
       
  3128             return _dec_from_triple(1, '9'*context.prec, context.Etop())
       
  3129 
       
  3130         context = context.copy()
       
  3131         context._set_rounding(ROUND_CEILING)
       
  3132         context._ignore_all_flags()
       
  3133         new_self = self._fix(context)
       
  3134         if new_self != self:
       
  3135             return new_self
       
  3136         return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
       
  3137                             context)
       
  3138 
       
  3139     def next_toward(self, other, context=None):
       
  3140         """Returns the number closest to self, in the direction towards other.
       
  3141 
       
  3142         The result is the closest representable number to self
       
  3143         (excluding self) that is in the direction towards other,
       
  3144         unless both have the same value.  If the two operands are
       
  3145         numerically equal, then the result is a copy of self with the
       
  3146         sign set to be the same as the sign of other.
       
  3147         """
       
  3148         other = _convert_other(other, raiseit=True)
       
  3149 
       
  3150         if context is None:
       
  3151             context = getcontext()
       
  3152 
       
  3153         ans = self._check_nans(other, context)
       
  3154         if ans:
       
  3155             return ans
       
  3156 
       
  3157         comparison = self.__cmp__(other)
       
  3158         if comparison == 0:
       
  3159             return self.copy_sign(other)
       
  3160 
       
  3161         if comparison == -1:
       
  3162             ans = self.next_plus(context)
       
  3163         else: # comparison == 1
       
  3164             ans = self.next_minus(context)
       
  3165 
       
  3166         # decide which flags to raise using value of ans
       
  3167         if ans._isinfinity():
       
  3168             context._raise_error(Overflow,
       
  3169                                  'Infinite result from next_toward',
       
  3170                                  ans._sign)
       
  3171             context._raise_error(Rounded)
       
  3172             context._raise_error(Inexact)
       
  3173         elif ans.adjusted() < context.Emin:
       
  3174             context._raise_error(Underflow)
       
  3175             context._raise_error(Subnormal)
       
  3176             context._raise_error(Rounded)
       
  3177             context._raise_error(Inexact)
       
  3178             # if precision == 1 then we don't raise Clamped for a
       
  3179             # result 0E-Etiny.
       
  3180             if not ans:
       
  3181                 context._raise_error(Clamped)
       
  3182 
       
  3183         return ans
       
  3184 
       
  3185     def number_class(self, context=None):
       
  3186         """Returns an indication of the class of self.
       
  3187 
       
  3188         The class is one of the following strings:
       
  3189           sNaN
       
  3190           NaN
       
  3191           -Infinity
       
  3192           -Normal
       
  3193           -Subnormal
       
  3194           -Zero
       
  3195           +Zero
       
  3196           +Subnormal
       
  3197           +Normal
       
  3198           +Infinity
       
  3199         """
       
  3200         if self.is_snan():
       
  3201             return "sNaN"
       
  3202         if self.is_qnan():
       
  3203             return "NaN"
       
  3204         inf = self._isinfinity()
       
  3205         if inf == 1:
       
  3206             return "+Infinity"
       
  3207         if inf == -1:
       
  3208             return "-Infinity"
       
  3209         if self.is_zero():
       
  3210             if self._sign:
       
  3211                 return "-Zero"
       
  3212             else:
       
  3213                 return "+Zero"
       
  3214         if context is None:
       
  3215             context = getcontext()
       
  3216         if self.is_subnormal(context=context):
       
  3217             if self._sign:
       
  3218                 return "-Subnormal"
       
  3219             else:
       
  3220                 return "+Subnormal"
       
  3221         # just a normal, regular, boring number, :)
       
  3222         if self._sign:
       
  3223             return "-Normal"
       
  3224         else:
       
  3225             return "+Normal"
       
  3226 
       
  3227     def radix(self):
       
  3228         """Just returns 10, as this is Decimal, :)"""
       
  3229         return Decimal(10)
       
  3230 
       
  3231     def rotate(self, other, context=None):
       
  3232         """Returns a rotated copy of self, value-of-other times."""
       
  3233         if context is None:
       
  3234             context = getcontext()
       
  3235 
       
  3236         ans = self._check_nans(other, context)
       
  3237         if ans:
       
  3238             return ans
       
  3239 
       
  3240         if other._exp != 0:
       
  3241             return context._raise_error(InvalidOperation)
       
  3242         if not (-context.prec <= int(other) <= context.prec):
       
  3243             return context._raise_error(InvalidOperation)
       
  3244 
       
  3245         if self._isinfinity():
       
  3246             return Decimal(self)
       
  3247 
       
  3248         # get values, pad if necessary
       
  3249         torot = int(other)
       
  3250         rotdig = self._int
       
  3251         topad = context.prec - len(rotdig)
       
  3252         if topad:
       
  3253             rotdig = '0'*topad + rotdig
       
  3254 
       
  3255         # let's rotate!
       
  3256         rotated = rotdig[torot:] + rotdig[:torot]
       
  3257         return _dec_from_triple(self._sign,
       
  3258                                 rotated.lstrip('0') or '0', self._exp)
       
  3259 
       
  3260     def scaleb (self, other, context=None):
       
  3261         """Returns self operand after adding the second value to its exp."""
       
  3262         if context is None:
       
  3263             context = getcontext()
       
  3264 
       
  3265         ans = self._check_nans(other, context)
       
  3266         if ans:
       
  3267             return ans
       
  3268 
       
  3269         if other._exp != 0:
       
  3270             return context._raise_error(InvalidOperation)
       
  3271         liminf = -2 * (context.Emax + context.prec)
       
  3272         limsup =  2 * (context.Emax + context.prec)
       
  3273         if not (liminf <= int(other) <= limsup):
       
  3274             return context._raise_error(InvalidOperation)
       
  3275 
       
  3276         if self._isinfinity():
       
  3277             return Decimal(self)
       
  3278 
       
  3279         d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
       
  3280         d = d._fix(context)
       
  3281         return d
       
  3282 
       
  3283     def shift(self, other, context=None):
       
  3284         """Returns a shifted copy of self, value-of-other times."""
       
  3285         if context is None:
       
  3286             context = getcontext()
       
  3287 
       
  3288         ans = self._check_nans(other, context)
       
  3289         if ans:
       
  3290             return ans
       
  3291 
       
  3292         if other._exp != 0:
       
  3293             return context._raise_error(InvalidOperation)
       
  3294         if not (-context.prec <= int(other) <= context.prec):
       
  3295             return context._raise_error(InvalidOperation)
       
  3296 
       
  3297         if self._isinfinity():
       
  3298             return Decimal(self)
       
  3299 
       
  3300         # get values, pad if necessary
       
  3301         torot = int(other)
       
  3302         if not torot:
       
  3303             return Decimal(self)
       
  3304         rotdig = self._int
       
  3305         topad = context.prec - len(rotdig)
       
  3306         if topad:
       
  3307             rotdig = '0'*topad + rotdig
       
  3308 
       
  3309         # let's shift!
       
  3310         if torot < 0:
       
  3311             rotated = rotdig[:torot]
       
  3312         else:
       
  3313             rotated = rotdig + '0'*torot
       
  3314             rotated = rotated[-context.prec:]
       
  3315 
       
  3316         return _dec_from_triple(self._sign,
       
  3317                                     rotated.lstrip('0') or '0', self._exp)
       
  3318 
       
  3319     # Support for pickling, copy, and deepcopy
       
  3320     def __reduce__(self):
       
  3321         return (self.__class__, (str(self),))
       
  3322 
       
  3323     def __copy__(self):
       
  3324         if type(self) == Decimal:
       
  3325             return self     # I'm immutable; therefore I am my own clone
       
  3326         return self.__class__(str(self))
       
  3327 
       
  3328     def __deepcopy__(self, memo):
       
  3329         if type(self) == Decimal:
       
  3330             return self     # My components are also immutable
       
  3331         return self.__class__(str(self))
       
  3332 
       
  3333 def _dec_from_triple(sign, coefficient, exponent, special=False):
       
  3334     """Create a decimal instance directly, without any validation,
       
  3335     normalization (e.g. removal of leading zeros) or argument
       
  3336     conversion.
       
  3337 
       
  3338     This function is for *internal use only*.
       
  3339     """
       
  3340 
       
  3341     self = object.__new__(Decimal)
       
  3342     self._sign = sign
       
  3343     self._int = coefficient
       
  3344     self._exp = exponent
       
  3345     self._is_special = special
       
  3346 
       
  3347     return self
       
  3348 
       
  3349 ##### Context class #######################################################
       
  3350 
       
  3351 
       
  3352 # get rounding method function:
       
  3353 rounding_functions = [name for name in Decimal.__dict__.keys()
       
  3354                                     if name.startswith('_round_')]
       
  3355 for name in rounding_functions:
       
  3356     # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
       
  3357     globalname = name[1:].upper()
       
  3358     val = globals()[globalname]
       
  3359     Decimal._pick_rounding_function[val] = name
       
  3360 
       
  3361 del name, val, globalname, rounding_functions
       
  3362 
       
  3363 class _ContextManager(object):
       
  3364     """Context manager class to support localcontext().
       
  3365 
       
  3366       Sets a copy of the supplied context in __enter__() and restores
       
  3367       the previous decimal context in __exit__()
       
  3368     """
       
  3369     def __init__(self, new_context):
       
  3370         self.new_context = new_context.copy()
       
  3371     def __enter__(self):
       
  3372         self.saved_context = getcontext()
       
  3373         setcontext(self.new_context)
       
  3374         return self.new_context
       
  3375     def __exit__(self, t, v, tb):
       
  3376         setcontext(self.saved_context)
       
  3377 
       
  3378 class Context(object):
       
  3379     """Contains the context for a Decimal instance.
       
  3380 
       
  3381     Contains:
       
  3382     prec - precision (for use in rounding, division, square roots..)
       
  3383     rounding - rounding type (how you round)
       
  3384     traps - If traps[exception] = 1, then the exception is
       
  3385                     raised when it is caused.  Otherwise, a value is
       
  3386                     substituted in.
       
  3387     flags  - When an exception is caused, flags[exception] is incremented.
       
  3388              (Whether or not the trap_enabler is set)
       
  3389              Should be reset by user of Decimal instance.
       
  3390     Emin -   Minimum exponent
       
  3391     Emax -   Maximum exponent
       
  3392     capitals -      If 1, 1*10^1 is printed as 1E+1.
       
  3393                     If 0, printed as 1e1
       
  3394     _clamp - If 1, change exponents if too high (Default 0)
       
  3395     """
       
  3396 
       
  3397     def __init__(self, prec=None, rounding=None,
       
  3398                  traps=None, flags=None,
       
  3399                  Emin=None, Emax=None,
       
  3400                  capitals=None, _clamp=0,
       
  3401                  _ignored_flags=None):
       
  3402         if flags is None:
       
  3403             flags = []
       
  3404         if _ignored_flags is None:
       
  3405             _ignored_flags = []
       
  3406         if not isinstance(flags, dict):
       
  3407             flags = dict([(s,s in flags) for s in _signals])
       
  3408             del s
       
  3409         if traps is not None and not isinstance(traps, dict):
       
  3410             traps = dict([(s,s in traps) for s in _signals])
       
  3411             del s
       
  3412         for name, val in locals().items():
       
  3413             if val is None:
       
  3414                 setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
       
  3415             else:
       
  3416                 setattr(self, name, val)
       
  3417         del self.self
       
  3418 
       
  3419     def __repr__(self):
       
  3420         """Show the current context."""
       
  3421         s = []
       
  3422         s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
       
  3423                  'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
       
  3424                  % vars(self))
       
  3425         names = [f.__name__ for f, v in self.flags.items() if v]
       
  3426         s.append('flags=[' + ', '.join(names) + ']')
       
  3427         names = [t.__name__ for t, v in self.traps.items() if v]
       
  3428         s.append('traps=[' + ', '.join(names) + ']')
       
  3429         return ', '.join(s) + ')'
       
  3430 
       
  3431     def clear_flags(self):
       
  3432         """Reset all flags to zero"""
       
  3433         for flag in self.flags:
       
  3434             self.flags[flag] = 0
       
  3435 
       
  3436     def _shallow_copy(self):
       
  3437         """Returns a shallow copy from self."""
       
  3438         nc = Context(self.prec, self.rounding, self.traps,
       
  3439                      self.flags, self.Emin, self.Emax,
       
  3440                      self.capitals, self._clamp, self._ignored_flags)
       
  3441         return nc
       
  3442 
       
  3443     def copy(self):
       
  3444         """Returns a deep copy from self."""
       
  3445         nc = Context(self.prec, self.rounding, self.traps.copy(),
       
  3446                      self.flags.copy(), self.Emin, self.Emax,
       
  3447                      self.capitals, self._clamp, self._ignored_flags)
       
  3448         return nc
       
  3449     __copy__ = copy
       
  3450 
       
  3451     def _raise_error(self, condition, explanation = None, *args):
       
  3452         """Handles an error
       
  3453 
       
  3454         If the flag is in _ignored_flags, returns the default response.
       
  3455         Otherwise, it increments the flag, then, if the corresponding
       
  3456         trap_enabler is set, it reaises the exception.  Otherwise, it returns
       
  3457         the default value after incrementing the flag.
       
  3458         """
       
  3459         error = _condition_map.get(condition, condition)
       
  3460         if error in self._ignored_flags:
       
  3461             # Don't touch the flag
       
  3462             return error().handle(self, *args)
       
  3463 
       
  3464         self.flags[error] += 1
       
  3465         if not self.traps[error]:
       
  3466             # The errors define how to handle themselves.
       
  3467             return condition().handle(self, *args)
       
  3468 
       
  3469         # Errors should only be risked on copies of the context
       
  3470         # self._ignored_flags = []
       
  3471         raise error, explanation
       
  3472 
       
  3473     def _ignore_all_flags(self):
       
  3474         """Ignore all flags, if they are raised"""
       
  3475         return self._ignore_flags(*_signals)
       
  3476 
       
  3477     def _ignore_flags(self, *flags):
       
  3478         """Ignore the flags, if they are raised"""
       
  3479         # Do not mutate-- This way, copies of a context leave the original
       
  3480         # alone.
       
  3481         self._ignored_flags = (self._ignored_flags + list(flags))
       
  3482         return list(flags)
       
  3483 
       
  3484     def _regard_flags(self, *flags):
       
  3485         """Stop ignoring the flags, if they are raised"""
       
  3486         if flags and isinstance(flags[0], (tuple,list)):
       
  3487             flags = flags[0]
       
  3488         for flag in flags:
       
  3489             self._ignored_flags.remove(flag)
       
  3490 
       
  3491     def __hash__(self):
       
  3492         """A Context cannot be hashed."""
       
  3493         # We inherit object.__hash__, so we must deny this explicitly
       
  3494         raise TypeError("Cannot hash a Context.")
       
  3495 
       
  3496     def Etiny(self):
       
  3497         """Returns Etiny (= Emin - prec + 1)"""
       
  3498         return int(self.Emin - self.prec + 1)
       
  3499 
       
  3500     def Etop(self):
       
  3501         """Returns maximum exponent (= Emax - prec + 1)"""
       
  3502         return int(self.Emax - self.prec + 1)
       
  3503 
       
  3504     def _set_rounding(self, type):
       
  3505         """Sets the rounding type.
       
  3506 
       
  3507         Sets the rounding type, and returns the current (previous)
       
  3508         rounding type.  Often used like:
       
  3509 
       
  3510         context = context.copy()
       
  3511         # so you don't change the calling context
       
  3512         # if an error occurs in the middle.
       
  3513         rounding = context._set_rounding(ROUND_UP)
       
  3514         val = self.__sub__(other, context=context)
       
  3515         context._set_rounding(rounding)
       
  3516 
       
  3517         This will make it round up for that operation.
       
  3518         """
       
  3519         rounding = self.rounding
       
  3520         self.rounding= type
       
  3521         return rounding
       
  3522 
       
  3523     def create_decimal(self, num='0'):
       
  3524         """Creates a new Decimal instance but using self as context."""
       
  3525         d = Decimal(num, context=self)
       
  3526         if d._isnan() and len(d._int) > self.prec - self._clamp:
       
  3527             return self._raise_error(ConversionSyntax,
       
  3528                                      "diagnostic info too long in NaN")
       
  3529         return d._fix(self)
       
  3530 
       
  3531     # Methods
       
  3532     def abs(self, a):
       
  3533         """Returns the absolute value of the operand.
       
  3534 
       
  3535         If the operand is negative, the result is the same as using the minus
       
  3536         operation on the operand.  Otherwise, the result is the same as using
       
  3537         the plus operation on the operand.
       
  3538 
       
  3539         >>> ExtendedContext.abs(Decimal('2.1'))
       
  3540         Decimal("2.1")
       
  3541         >>> ExtendedContext.abs(Decimal('-100'))
       
  3542         Decimal("100")
       
  3543         >>> ExtendedContext.abs(Decimal('101.5'))
       
  3544         Decimal("101.5")
       
  3545         >>> ExtendedContext.abs(Decimal('-101.5'))
       
  3546         Decimal("101.5")
       
  3547         """
       
  3548         return a.__abs__(context=self)
       
  3549 
       
  3550     def add(self, a, b):
       
  3551         """Return the sum of the two operands.
       
  3552 
       
  3553         >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
       
  3554         Decimal("19.00")
       
  3555         >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
       
  3556         Decimal("1.02E+4")
       
  3557         """
       
  3558         return a.__add__(b, context=self)
       
  3559 
       
  3560     def _apply(self, a):
       
  3561         return str(a._fix(self))
       
  3562 
       
  3563     def canonical(self, a):
       
  3564         """Returns the same Decimal object.
       
  3565 
       
  3566         As we do not have different encodings for the same number, the
       
  3567         received object already is in its canonical form.
       
  3568 
       
  3569         >>> ExtendedContext.canonical(Decimal('2.50'))
       
  3570         Decimal("2.50")
       
  3571         """
       
  3572         return a.canonical(context=self)
       
  3573 
       
  3574     def compare(self, a, b):
       
  3575         """Compares values numerically.
       
  3576 
       
  3577         If the signs of the operands differ, a value representing each operand
       
  3578         ('-1' if the operand is less than zero, '0' if the operand is zero or
       
  3579         negative zero, or '1' if the operand is greater than zero) is used in
       
  3580         place of that operand for the comparison instead of the actual
       
  3581         operand.
       
  3582 
       
  3583         The comparison is then effected by subtracting the second operand from
       
  3584         the first and then returning a value according to the result of the
       
  3585         subtraction: '-1' if the result is less than zero, '0' if the result is
       
  3586         zero or negative zero, or '1' if the result is greater than zero.
       
  3587 
       
  3588         >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
       
  3589         Decimal("-1")
       
  3590         >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
       
  3591         Decimal("0")
       
  3592         >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
       
  3593         Decimal("0")
       
  3594         >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
       
  3595         Decimal("1")
       
  3596         >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
       
  3597         Decimal("1")
       
  3598         >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
       
  3599         Decimal("-1")
       
  3600         """
       
  3601         return a.compare(b, context=self)
       
  3602 
       
  3603     def compare_signal(self, a, b):
       
  3604         """Compares the values of the two operands numerically.
       
  3605 
       
  3606         It's pretty much like compare(), but all NaNs signal, with signaling
       
  3607         NaNs taking precedence over quiet NaNs.
       
  3608 
       
  3609         >>> c = ExtendedContext
       
  3610         >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
       
  3611         Decimal("-1")
       
  3612         >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
       
  3613         Decimal("0")
       
  3614         >>> c.flags[InvalidOperation] = 0
       
  3615         >>> print c.flags[InvalidOperation]
       
  3616         0
       
  3617         >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
       
  3618         Decimal("NaN")
       
  3619         >>> print c.flags[InvalidOperation]
       
  3620         1
       
  3621         >>> c.flags[InvalidOperation] = 0
       
  3622         >>> print c.flags[InvalidOperation]
       
  3623         0
       
  3624         >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
       
  3625         Decimal("NaN")
       
  3626         >>> print c.flags[InvalidOperation]
       
  3627         1
       
  3628         """
       
  3629         return a.compare_signal(b, context=self)
       
  3630 
       
  3631     def compare_total(self, a, b):
       
  3632         """Compares two operands using their abstract representation.
       
  3633 
       
  3634         This is not like the standard compare, which use their numerical
       
  3635         value. Note that a total ordering is defined for all possible abstract
       
  3636         representations.
       
  3637 
       
  3638         >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
       
  3639         Decimal("-1")
       
  3640         >>> ExtendedContext.compare_total(Decimal('-127'),  Decimal('12'))
       
  3641         Decimal("-1")
       
  3642         >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
       
  3643         Decimal("-1")
       
  3644         >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
       
  3645         Decimal("0")
       
  3646         >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('12.300'))
       
  3647         Decimal("1")
       
  3648         >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('NaN'))
       
  3649         Decimal("-1")
       
  3650         """
       
  3651         return a.compare_total(b)
       
  3652 
       
  3653     def compare_total_mag(self, a, b):
       
  3654         """Compares two operands using their abstract representation ignoring sign.
       
  3655 
       
  3656         Like compare_total, but with operand's sign ignored and assumed to be 0.
       
  3657         """
       
  3658         return a.compare_total_mag(b)
       
  3659 
       
  3660     def copy_abs(self, a):
       
  3661         """Returns a copy of the operand with the sign set to 0.
       
  3662 
       
  3663         >>> ExtendedContext.copy_abs(Decimal('2.1'))
       
  3664         Decimal("2.1")
       
  3665         >>> ExtendedContext.copy_abs(Decimal('-100'))
       
  3666         Decimal("100")
       
  3667         """
       
  3668         return a.copy_abs()
       
  3669 
       
  3670     def copy_decimal(self, a):
       
  3671         """Returns a copy of the decimal objet.
       
  3672 
       
  3673         >>> ExtendedContext.copy_decimal(Decimal('2.1'))
       
  3674         Decimal("2.1")
       
  3675         >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
       
  3676         Decimal("-1.00")
       
  3677         """
       
  3678         return Decimal(a)
       
  3679 
       
  3680     def copy_negate(self, a):
       
  3681         """Returns a copy of the operand with the sign inverted.
       
  3682 
       
  3683         >>> ExtendedContext.copy_negate(Decimal('101.5'))
       
  3684         Decimal("-101.5")
       
  3685         >>> ExtendedContext.copy_negate(Decimal('-101.5'))
       
  3686         Decimal("101.5")
       
  3687         """
       
  3688         return a.copy_negate()
       
  3689 
       
  3690     def copy_sign(self, a, b):
       
  3691         """Copies the second operand's sign to the first one.
       
  3692 
       
  3693         In detail, it returns a copy of the first operand with the sign
       
  3694         equal to the sign of the second operand.
       
  3695 
       
  3696         >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
       
  3697         Decimal("1.50")
       
  3698         >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
       
  3699         Decimal("1.50")
       
  3700         >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
       
  3701         Decimal("-1.50")
       
  3702         >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
       
  3703         Decimal("-1.50")
       
  3704         """
       
  3705         return a.copy_sign(b)
       
  3706 
       
  3707     def divide(self, a, b):
       
  3708         """Decimal division in a specified context.
       
  3709 
       
  3710         >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
       
  3711         Decimal("0.333333333")
       
  3712         >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
       
  3713         Decimal("0.666666667")
       
  3714         >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
       
  3715         Decimal("2.5")
       
  3716         >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
       
  3717         Decimal("0.1")
       
  3718         >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
       
  3719         Decimal("1")
       
  3720         >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
       
  3721         Decimal("4.00")
       
  3722         >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
       
  3723         Decimal("1.20")
       
  3724         >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
       
  3725         Decimal("10")
       
  3726         >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
       
  3727         Decimal("1000")
       
  3728         >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
       
  3729         Decimal("1.20E+6")
       
  3730         """
       
  3731         return a.__div__(b, context=self)
       
  3732 
       
  3733     def divide_int(self, a, b):
       
  3734         """Divides two numbers and returns the integer part of the result.
       
  3735 
       
  3736         >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
       
  3737         Decimal("0")
       
  3738         >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
       
  3739         Decimal("3")
       
  3740         >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
       
  3741         Decimal("3")
       
  3742         """
       
  3743         return a.__floordiv__(b, context=self)
       
  3744 
       
  3745     def divmod(self, a, b):
       
  3746         return a.__divmod__(b, context=self)
       
  3747 
       
  3748     def exp(self, a):
       
  3749         """Returns e ** a.
       
  3750 
       
  3751         >>> c = ExtendedContext.copy()
       
  3752         >>> c.Emin = -999
       
  3753         >>> c.Emax = 999
       
  3754         >>> c.exp(Decimal('-Infinity'))
       
  3755         Decimal("0")
       
  3756         >>> c.exp(Decimal('-1'))
       
  3757         Decimal("0.367879441")
       
  3758         >>> c.exp(Decimal('0'))
       
  3759         Decimal("1")
       
  3760         >>> c.exp(Decimal('1'))
       
  3761         Decimal("2.71828183")
       
  3762         >>> c.exp(Decimal('0.693147181'))
       
  3763         Decimal("2.00000000")
       
  3764         >>> c.exp(Decimal('+Infinity'))
       
  3765         Decimal("Infinity")
       
  3766         """
       
  3767         return a.exp(context=self)
       
  3768 
       
  3769     def fma(self, a, b, c):
       
  3770         """Returns a multiplied by b, plus c.
       
  3771 
       
  3772         The first two operands are multiplied together, using multiply,
       
  3773         the third operand is then added to the result of that
       
  3774         multiplication, using add, all with only one final rounding.
       
  3775 
       
  3776         >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
       
  3777         Decimal("22")
       
  3778         >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
       
  3779         Decimal("-8")
       
  3780         >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
       
  3781         Decimal("1.38435736E+12")
       
  3782         """
       
  3783         return a.fma(b, c, context=self)
       
  3784 
       
  3785     def is_canonical(self, a):
       
  3786         """Return True if the operand is canonical; otherwise return False.
       
  3787 
       
  3788         Currently, the encoding of a Decimal instance is always
       
  3789         canonical, so this method returns True for any Decimal.
       
  3790 
       
  3791         >>> ExtendedContext.is_canonical(Decimal('2.50'))
       
  3792         True
       
  3793         """
       
  3794         return a.is_canonical()
       
  3795 
       
  3796     def is_finite(self, a):
       
  3797         """Return True if the operand is finite; otherwise return False.
       
  3798 
       
  3799         A Decimal instance is considered finite if it is neither
       
  3800         infinite nor a NaN.
       
  3801 
       
  3802         >>> ExtendedContext.is_finite(Decimal('2.50'))
       
  3803         True
       
  3804         >>> ExtendedContext.is_finite(Decimal('-0.3'))
       
  3805         True
       
  3806         >>> ExtendedContext.is_finite(Decimal('0'))
       
  3807         True
       
  3808         >>> ExtendedContext.is_finite(Decimal('Inf'))
       
  3809         False
       
  3810         >>> ExtendedContext.is_finite(Decimal('NaN'))
       
  3811         False
       
  3812         """
       
  3813         return a.is_finite()
       
  3814 
       
  3815     def is_infinite(self, a):
       
  3816         """Return True if the operand is infinite; otherwise return False.
       
  3817 
       
  3818         >>> ExtendedContext.is_infinite(Decimal('2.50'))
       
  3819         False
       
  3820         >>> ExtendedContext.is_infinite(Decimal('-Inf'))
       
  3821         True
       
  3822         >>> ExtendedContext.is_infinite(Decimal('NaN'))
       
  3823         False
       
  3824         """
       
  3825         return a.is_infinite()
       
  3826 
       
  3827     def is_nan(self, a):
       
  3828         """Return True if the operand is a qNaN or sNaN;
       
  3829         otherwise return False.
       
  3830 
       
  3831         >>> ExtendedContext.is_nan(Decimal('2.50'))
       
  3832         False
       
  3833         >>> ExtendedContext.is_nan(Decimal('NaN'))
       
  3834         True
       
  3835         >>> ExtendedContext.is_nan(Decimal('-sNaN'))
       
  3836         True
       
  3837         """
       
  3838         return a.is_nan()
       
  3839 
       
  3840     def is_normal(self, a):
       
  3841         """Return True if the operand is a normal number;
       
  3842         otherwise return False.
       
  3843 
       
  3844         >>> c = ExtendedContext.copy()
       
  3845         >>> c.Emin = -999
       
  3846         >>> c.Emax = 999
       
  3847         >>> c.is_normal(Decimal('2.50'))
       
  3848         True
       
  3849         >>> c.is_normal(Decimal('0.1E-999'))
       
  3850         False
       
  3851         >>> c.is_normal(Decimal('0.00'))
       
  3852         False
       
  3853         >>> c.is_normal(Decimal('-Inf'))
       
  3854         False
       
  3855         >>> c.is_normal(Decimal('NaN'))
       
  3856         False
       
  3857         """
       
  3858         return a.is_normal(context=self)
       
  3859 
       
  3860     def is_qnan(self, a):
       
  3861         """Return True if the operand is a quiet NaN; otherwise return False.
       
  3862 
       
  3863         >>> ExtendedContext.is_qnan(Decimal('2.50'))
       
  3864         False
       
  3865         >>> ExtendedContext.is_qnan(Decimal('NaN'))
       
  3866         True
       
  3867         >>> ExtendedContext.is_qnan(Decimal('sNaN'))
       
  3868         False
       
  3869         """
       
  3870         return a.is_qnan()
       
  3871 
       
  3872     def is_signed(self, a):
       
  3873         """Return True if the operand is negative; otherwise return False.
       
  3874 
       
  3875         >>> ExtendedContext.is_signed(Decimal('2.50'))
       
  3876         False
       
  3877         >>> ExtendedContext.is_signed(Decimal('-12'))
       
  3878         True
       
  3879         >>> ExtendedContext.is_signed(Decimal('-0'))
       
  3880         True
       
  3881         """
       
  3882         return a.is_signed()
       
  3883 
       
  3884     def is_snan(self, a):
       
  3885         """Return True if the operand is a signaling NaN;
       
  3886         otherwise return False.
       
  3887 
       
  3888         >>> ExtendedContext.is_snan(Decimal('2.50'))
       
  3889         False
       
  3890         >>> ExtendedContext.is_snan(Decimal('NaN'))
       
  3891         False
       
  3892         >>> ExtendedContext.is_snan(Decimal('sNaN'))
       
  3893         True
       
  3894         """
       
  3895         return a.is_snan()
       
  3896 
       
  3897     def is_subnormal(self, a):
       
  3898         """Return True if the operand is subnormal; otherwise return False.
       
  3899 
       
  3900         >>> c = ExtendedContext.copy()
       
  3901         >>> c.Emin = -999
       
  3902         >>> c.Emax = 999
       
  3903         >>> c.is_subnormal(Decimal('2.50'))
       
  3904         False
       
  3905         >>> c.is_subnormal(Decimal('0.1E-999'))
       
  3906         True
       
  3907         >>> c.is_subnormal(Decimal('0.00'))
       
  3908         False
       
  3909         >>> c.is_subnormal(Decimal('-Inf'))
       
  3910         False
       
  3911         >>> c.is_subnormal(Decimal('NaN'))
       
  3912         False
       
  3913         """
       
  3914         return a.is_subnormal(context=self)
       
  3915 
       
  3916     def is_zero(self, a):
       
  3917         """Return True if the operand is a zero; otherwise return False.
       
  3918 
       
  3919         >>> ExtendedContext.is_zero(Decimal('0'))
       
  3920         True
       
  3921         >>> ExtendedContext.is_zero(Decimal('2.50'))
       
  3922         False
       
  3923         >>> ExtendedContext.is_zero(Decimal('-0E+2'))
       
  3924         True
       
  3925         """
       
  3926         return a.is_zero()
       
  3927 
       
  3928     def ln(self, a):
       
  3929         """Returns the natural (base e) logarithm of the operand.
       
  3930 
       
  3931         >>> c = ExtendedContext.copy()
       
  3932         >>> c.Emin = -999
       
  3933         >>> c.Emax = 999
       
  3934         >>> c.ln(Decimal('0'))
       
  3935         Decimal("-Infinity")
       
  3936         >>> c.ln(Decimal('1.000'))
       
  3937         Decimal("0")
       
  3938         >>> c.ln(Decimal('2.71828183'))
       
  3939         Decimal("1.00000000")
       
  3940         >>> c.ln(Decimal('10'))
       
  3941         Decimal("2.30258509")
       
  3942         >>> c.ln(Decimal('+Infinity'))
       
  3943         Decimal("Infinity")
       
  3944         """
       
  3945         return a.ln(context=self)
       
  3946 
       
  3947     def log10(self, a):
       
  3948         """Returns the base 10 logarithm of the operand.
       
  3949 
       
  3950         >>> c = ExtendedContext.copy()
       
  3951         >>> c.Emin = -999
       
  3952         >>> c.Emax = 999
       
  3953         >>> c.log10(Decimal('0'))
       
  3954         Decimal("-Infinity")
       
  3955         >>> c.log10(Decimal('0.001'))
       
  3956         Decimal("-3")
       
  3957         >>> c.log10(Decimal('1.000'))
       
  3958         Decimal("0")
       
  3959         >>> c.log10(Decimal('2'))
       
  3960         Decimal("0.301029996")
       
  3961         >>> c.log10(Decimal('10'))
       
  3962         Decimal("1")
       
  3963         >>> c.log10(Decimal('70'))
       
  3964         Decimal("1.84509804")
       
  3965         >>> c.log10(Decimal('+Infinity'))
       
  3966         Decimal("Infinity")
       
  3967         """
       
  3968         return a.log10(context=self)
       
  3969 
       
  3970     def logb(self, a):
       
  3971         """ Returns the exponent of the magnitude of the operand's MSD.
       
  3972 
       
  3973         The result is the integer which is the exponent of the magnitude
       
  3974         of the most significant digit of the operand (as though the
       
  3975         operand were truncated to a single digit while maintaining the
       
  3976         value of that digit and without limiting the resulting exponent).
       
  3977 
       
  3978         >>> ExtendedContext.logb(Decimal('250'))
       
  3979         Decimal("2")
       
  3980         >>> ExtendedContext.logb(Decimal('2.50'))
       
  3981         Decimal("0")
       
  3982         >>> ExtendedContext.logb(Decimal('0.03'))
       
  3983         Decimal("-2")
       
  3984         >>> ExtendedContext.logb(Decimal('0'))
       
  3985         Decimal("-Infinity")
       
  3986         """
       
  3987         return a.logb(context=self)
       
  3988 
       
  3989     def logical_and(self, a, b):
       
  3990         """Applies the logical operation 'and' between each operand's digits.
       
  3991 
       
  3992         The operands must be both logical numbers.
       
  3993 
       
  3994         >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
       
  3995         Decimal("0")
       
  3996         >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
       
  3997         Decimal("0")
       
  3998         >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
       
  3999         Decimal("0")
       
  4000         >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
       
  4001         Decimal("1")
       
  4002         >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
       
  4003         Decimal("1000")
       
  4004         >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
       
  4005         Decimal("10")
       
  4006         """
       
  4007         return a.logical_and(b, context=self)
       
  4008 
       
  4009     def logical_invert(self, a):
       
  4010         """Invert all the digits in the operand.
       
  4011 
       
  4012         The operand must be a logical number.
       
  4013 
       
  4014         >>> ExtendedContext.logical_invert(Decimal('0'))
       
  4015         Decimal("111111111")
       
  4016         >>> ExtendedContext.logical_invert(Decimal('1'))
       
  4017         Decimal("111111110")
       
  4018         >>> ExtendedContext.logical_invert(Decimal('111111111'))
       
  4019         Decimal("0")
       
  4020         >>> ExtendedContext.logical_invert(Decimal('101010101'))
       
  4021         Decimal("10101010")
       
  4022         """
       
  4023         return a.logical_invert(context=self)
       
  4024 
       
  4025     def logical_or(self, a, b):
       
  4026         """Applies the logical operation 'or' between each operand's digits.
       
  4027 
       
  4028         The operands must be both logical numbers.
       
  4029 
       
  4030         >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
       
  4031         Decimal("0")
       
  4032         >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
       
  4033         Decimal("1")
       
  4034         >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
       
  4035         Decimal("1")
       
  4036         >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
       
  4037         Decimal("1")
       
  4038         >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
       
  4039         Decimal("1110")
       
  4040         >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
       
  4041         Decimal("1110")
       
  4042         """
       
  4043         return a.logical_or(b, context=self)
       
  4044 
       
  4045     def logical_xor(self, a, b):
       
  4046         """Applies the logical operation 'xor' between each operand's digits.
       
  4047 
       
  4048         The operands must be both logical numbers.
       
  4049 
       
  4050         >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
       
  4051         Decimal("0")
       
  4052         >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
       
  4053         Decimal("1")
       
  4054         >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
       
  4055         Decimal("1")
       
  4056         >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
       
  4057         Decimal("0")
       
  4058         >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
       
  4059         Decimal("110")
       
  4060         >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
       
  4061         Decimal("1101")
       
  4062         """
       
  4063         return a.logical_xor(b, context=self)
       
  4064 
       
  4065     def max(self, a,b):
       
  4066         """max compares two values numerically and returns the maximum.
       
  4067 
       
  4068         If either operand is a NaN then the general rules apply.
       
  4069         Otherwise, the operands are compared as as though by the compare
       
  4070         operation.  If they are numerically equal then the left-hand operand
       
  4071         is chosen as the result.  Otherwise the maximum (closer to positive
       
  4072         infinity) of the two operands is chosen as the result.
       
  4073 
       
  4074         >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
       
  4075         Decimal("3")
       
  4076         >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
       
  4077         Decimal("3")
       
  4078         >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
       
  4079         Decimal("1")
       
  4080         >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
       
  4081         Decimal("7")
       
  4082         """
       
  4083         return a.max(b, context=self)
       
  4084 
       
  4085     def max_mag(self, a, b):
       
  4086         """Compares the values numerically with their sign ignored."""
       
  4087         return a.max_mag(b, context=self)
       
  4088 
       
  4089     def min(self, a,b):
       
  4090         """min compares two values numerically and returns the minimum.
       
  4091 
       
  4092         If either operand is a NaN then the general rules apply.
       
  4093         Otherwise, the operands are compared as as though by the compare
       
  4094         operation.  If they are numerically equal then the left-hand operand
       
  4095         is chosen as the result.  Otherwise the minimum (closer to negative
       
  4096         infinity) of the two operands is chosen as the result.
       
  4097 
       
  4098         >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
       
  4099         Decimal("2")
       
  4100         >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
       
  4101         Decimal("-10")
       
  4102         >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
       
  4103         Decimal("1.0")
       
  4104         >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
       
  4105         Decimal("7")
       
  4106         """
       
  4107         return a.min(b, context=self)
       
  4108 
       
  4109     def min_mag(self, a, b):
       
  4110         """Compares the values numerically with their sign ignored."""
       
  4111         return a.min_mag(b, context=self)
       
  4112 
       
  4113     def minus(self, a):
       
  4114         """Minus corresponds to unary prefix minus in Python.
       
  4115 
       
  4116         The operation is evaluated using the same rules as subtract; the
       
  4117         operation minus(a) is calculated as subtract('0', a) where the '0'
       
  4118         has the same exponent as the operand.
       
  4119 
       
  4120         >>> ExtendedContext.minus(Decimal('1.3'))
       
  4121         Decimal("-1.3")
       
  4122         >>> ExtendedContext.minus(Decimal('-1.3'))
       
  4123         Decimal("1.3")
       
  4124         """
       
  4125         return a.__neg__(context=self)
       
  4126 
       
  4127     def multiply(self, a, b):
       
  4128         """multiply multiplies two operands.
       
  4129 
       
  4130         If either operand is a special value then the general rules apply.
       
  4131         Otherwise, the operands are multiplied together ('long multiplication'),
       
  4132         resulting in a number which may be as long as the sum of the lengths
       
  4133         of the two operands.
       
  4134 
       
  4135         >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
       
  4136         Decimal("3.60")
       
  4137         >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
       
  4138         Decimal("21")
       
  4139         >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
       
  4140         Decimal("0.72")
       
  4141         >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
       
  4142         Decimal("-0.0")
       
  4143         >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
       
  4144         Decimal("4.28135971E+11")
       
  4145         """
       
  4146         return a.__mul__(b, context=self)
       
  4147 
       
  4148     def next_minus(self, a):
       
  4149         """Returns the largest representable number smaller than a.
       
  4150 
       
  4151         >>> c = ExtendedContext.copy()
       
  4152         >>> c.Emin = -999
       
  4153         >>> c.Emax = 999
       
  4154         >>> ExtendedContext.next_minus(Decimal('1'))
       
  4155         Decimal("0.999999999")
       
  4156         >>> c.next_minus(Decimal('1E-1007'))
       
  4157         Decimal("0E-1007")
       
  4158         >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
       
  4159         Decimal("-1.00000004")
       
  4160         >>> c.next_minus(Decimal('Infinity'))
       
  4161         Decimal("9.99999999E+999")
       
  4162         """
       
  4163         return a.next_minus(context=self)
       
  4164 
       
  4165     def next_plus(self, a):
       
  4166         """Returns the smallest representable number larger than a.
       
  4167 
       
  4168         >>> c = ExtendedContext.copy()
       
  4169         >>> c.Emin = -999
       
  4170         >>> c.Emax = 999
       
  4171         >>> ExtendedContext.next_plus(Decimal('1'))
       
  4172         Decimal("1.00000001")
       
  4173         >>> c.next_plus(Decimal('-1E-1007'))
       
  4174         Decimal("-0E-1007")
       
  4175         >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
       
  4176         Decimal("-1.00000002")
       
  4177         >>> c.next_plus(Decimal('-Infinity'))
       
  4178         Decimal("-9.99999999E+999")
       
  4179         """
       
  4180         return a.next_plus(context=self)
       
  4181 
       
  4182     def next_toward(self, a, b):
       
  4183         """Returns the number closest to a, in direction towards b.
       
  4184 
       
  4185         The result is the closest representable number from the first
       
  4186         operand (but not the first operand) that is in the direction
       
  4187         towards the second operand, unless the operands have the same
       
  4188         value.
       
  4189 
       
  4190         >>> c = ExtendedContext.copy()
       
  4191         >>> c.Emin = -999
       
  4192         >>> c.Emax = 999
       
  4193         >>> c.next_toward(Decimal('1'), Decimal('2'))
       
  4194         Decimal("1.00000001")
       
  4195         >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
       
  4196         Decimal("-0E-1007")
       
  4197         >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
       
  4198         Decimal("-1.00000002")
       
  4199         >>> c.next_toward(Decimal('1'), Decimal('0'))
       
  4200         Decimal("0.999999999")
       
  4201         >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
       
  4202         Decimal("0E-1007")
       
  4203         >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
       
  4204         Decimal("-1.00000004")
       
  4205         >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
       
  4206         Decimal("-0.00")
       
  4207         """
       
  4208         return a.next_toward(b, context=self)
       
  4209 
       
  4210     def normalize(self, a):
       
  4211         """normalize reduces an operand to its simplest form.
       
  4212 
       
  4213         Essentially a plus operation with all trailing zeros removed from the
       
  4214         result.
       
  4215 
       
  4216         >>> ExtendedContext.normalize(Decimal('2.1'))
       
  4217         Decimal("2.1")
       
  4218         >>> ExtendedContext.normalize(Decimal('-2.0'))
       
  4219         Decimal("-2")
       
  4220         >>> ExtendedContext.normalize(Decimal('1.200'))
       
  4221         Decimal("1.2")
       
  4222         >>> ExtendedContext.normalize(Decimal('-120'))
       
  4223         Decimal("-1.2E+2")
       
  4224         >>> ExtendedContext.normalize(Decimal('120.00'))
       
  4225         Decimal("1.2E+2")
       
  4226         >>> ExtendedContext.normalize(Decimal('0.00'))
       
  4227         Decimal("0")
       
  4228         """
       
  4229         return a.normalize(context=self)
       
  4230 
       
  4231     def number_class(self, a):
       
  4232         """Returns an indication of the class of the operand.
       
  4233 
       
  4234         The class is one of the following strings:
       
  4235           -sNaN
       
  4236           -NaN
       
  4237           -Infinity
       
  4238           -Normal
       
  4239           -Subnormal
       
  4240           -Zero
       
  4241           +Zero
       
  4242           +Subnormal
       
  4243           +Normal
       
  4244           +Infinity
       
  4245 
       
  4246         >>> c = Context(ExtendedContext)
       
  4247         >>> c.Emin = -999
       
  4248         >>> c.Emax = 999
       
  4249         >>> c.number_class(Decimal('Infinity'))
       
  4250         '+Infinity'
       
  4251         >>> c.number_class(Decimal('1E-10'))
       
  4252         '+Normal'
       
  4253         >>> c.number_class(Decimal('2.50'))
       
  4254         '+Normal'
       
  4255         >>> c.number_class(Decimal('0.1E-999'))
       
  4256         '+Subnormal'
       
  4257         >>> c.number_class(Decimal('0'))
       
  4258         '+Zero'
       
  4259         >>> c.number_class(Decimal('-0'))
       
  4260         '-Zero'
       
  4261         >>> c.number_class(Decimal('-0.1E-999'))
       
  4262         '-Subnormal'
       
  4263         >>> c.number_class(Decimal('-1E-10'))
       
  4264         '-Normal'
       
  4265         >>> c.number_class(Decimal('-2.50'))
       
  4266         '-Normal'
       
  4267         >>> c.number_class(Decimal('-Infinity'))
       
  4268         '-Infinity'
       
  4269         >>> c.number_class(Decimal('NaN'))
       
  4270         'NaN'
       
  4271         >>> c.number_class(Decimal('-NaN'))
       
  4272         'NaN'
       
  4273         >>> c.number_class(Decimal('sNaN'))
       
  4274         'sNaN'
       
  4275         """
       
  4276         return a.number_class(context=self)
       
  4277 
       
  4278     def plus(self, a):
       
  4279         """Plus corresponds to unary prefix plus in Python.
       
  4280 
       
  4281         The operation is evaluated using the same rules as add; the
       
  4282         operation plus(a) is calculated as add('0', a) where the '0'
       
  4283         has the same exponent as the operand.
       
  4284 
       
  4285         >>> ExtendedContext.plus(Decimal('1.3'))
       
  4286         Decimal("1.3")
       
  4287         >>> ExtendedContext.plus(Decimal('-1.3'))
       
  4288         Decimal("-1.3")
       
  4289         """
       
  4290         return a.__pos__(context=self)
       
  4291 
       
  4292     def power(self, a, b, modulo=None):
       
  4293         """Raises a to the power of b, to modulo if given.
       
  4294 
       
  4295         With two arguments, compute a**b.  If a is negative then b
       
  4296         must be integral.  The result will be inexact unless b is
       
  4297         integral and the result is finite and can be expressed exactly
       
  4298         in 'precision' digits.
       
  4299 
       
  4300         With three arguments, compute (a**b) % modulo.  For the
       
  4301         three argument form, the following restrictions on the
       
  4302         arguments hold:
       
  4303 
       
  4304          - all three arguments must be integral
       
  4305          - b must be nonnegative
       
  4306          - at least one of a or b must be nonzero
       
  4307          - modulo must be nonzero and have at most 'precision' digits
       
  4308 
       
  4309         The result of pow(a, b, modulo) is identical to the result
       
  4310         that would be obtained by computing (a**b) % modulo with
       
  4311         unbounded precision, but is computed more efficiently.  It is
       
  4312         always exact.
       
  4313 
       
  4314         >>> c = ExtendedContext.copy()
       
  4315         >>> c.Emin = -999
       
  4316         >>> c.Emax = 999
       
  4317         >>> c.power(Decimal('2'), Decimal('3'))
       
  4318         Decimal("8")
       
  4319         >>> c.power(Decimal('-2'), Decimal('3'))
       
  4320         Decimal("-8")
       
  4321         >>> c.power(Decimal('2'), Decimal('-3'))
       
  4322         Decimal("0.125")
       
  4323         >>> c.power(Decimal('1.7'), Decimal('8'))
       
  4324         Decimal("69.7575744")
       
  4325         >>> c.power(Decimal('10'), Decimal('0.301029996'))
       
  4326         Decimal("2.00000000")
       
  4327         >>> c.power(Decimal('Infinity'), Decimal('-1'))
       
  4328         Decimal("0")
       
  4329         >>> c.power(Decimal('Infinity'), Decimal('0'))
       
  4330         Decimal("1")
       
  4331         >>> c.power(Decimal('Infinity'), Decimal('1'))
       
  4332         Decimal("Infinity")
       
  4333         >>> c.power(Decimal('-Infinity'), Decimal('-1'))
       
  4334         Decimal("-0")
       
  4335         >>> c.power(Decimal('-Infinity'), Decimal('0'))
       
  4336         Decimal("1")
       
  4337         >>> c.power(Decimal('-Infinity'), Decimal('1'))
       
  4338         Decimal("-Infinity")
       
  4339         >>> c.power(Decimal('-Infinity'), Decimal('2'))
       
  4340         Decimal("Infinity")
       
  4341         >>> c.power(Decimal('0'), Decimal('0'))
       
  4342         Decimal("NaN")
       
  4343 
       
  4344         >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
       
  4345         Decimal("11")
       
  4346         >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
       
  4347         Decimal("-11")
       
  4348         >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
       
  4349         Decimal("1")
       
  4350         >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
       
  4351         Decimal("11")
       
  4352         >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
       
  4353         Decimal("11729830")
       
  4354         >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
       
  4355         Decimal("-0")
       
  4356         >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
       
  4357         Decimal("1")
       
  4358         """
       
  4359         return a.__pow__(b, modulo, context=self)
       
  4360 
       
  4361     def quantize(self, a, b):
       
  4362         """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
       
  4363 
       
  4364         The coefficient of the result is derived from that of the left-hand
       
  4365         operand.  It may be rounded using the current rounding setting (if the
       
  4366         exponent is being increased), multiplied by a positive power of ten (if
       
  4367         the exponent is being decreased), or is unchanged (if the exponent is
       
  4368         already equal to that of the right-hand operand).
       
  4369 
       
  4370         Unlike other operations, if the length of the coefficient after the
       
  4371         quantize operation would be greater than precision then an Invalid
       
  4372         operation condition is raised.  This guarantees that, unless there is
       
  4373         an error condition, the exponent of the result of a quantize is always
       
  4374         equal to that of the right-hand operand.
       
  4375 
       
  4376         Also unlike other operations, quantize will never raise Underflow, even
       
  4377         if the result is subnormal and inexact.
       
  4378 
       
  4379         >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
       
  4380         Decimal("2.170")
       
  4381         >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
       
  4382         Decimal("2.17")
       
  4383         >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
       
  4384         Decimal("2.2")
       
  4385         >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
       
  4386         Decimal("2")
       
  4387         >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
       
  4388         Decimal("0E+1")
       
  4389         >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
       
  4390         Decimal("-Infinity")
       
  4391         >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
       
  4392         Decimal("NaN")
       
  4393         >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
       
  4394         Decimal("-0")
       
  4395         >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
       
  4396         Decimal("-0E+5")
       
  4397         >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
       
  4398         Decimal("NaN")
       
  4399         >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
       
  4400         Decimal("NaN")
       
  4401         >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
       
  4402         Decimal("217.0")
       
  4403         >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
       
  4404         Decimal("217")
       
  4405         >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
       
  4406         Decimal("2.2E+2")
       
  4407         >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
       
  4408         Decimal("2E+2")
       
  4409         """
       
  4410         return a.quantize(b, context=self)
       
  4411 
       
  4412     def radix(self):
       
  4413         """Just returns 10, as this is Decimal, :)
       
  4414 
       
  4415         >>> ExtendedContext.radix()
       
  4416         Decimal("10")
       
  4417         """
       
  4418         return Decimal(10)
       
  4419 
       
  4420     def remainder(self, a, b):
       
  4421         """Returns the remainder from integer division.
       
  4422 
       
  4423         The result is the residue of the dividend after the operation of
       
  4424         calculating integer division as described for divide-integer, rounded
       
  4425         to precision digits if necessary.  The sign of the result, if
       
  4426         non-zero, is the same as that of the original dividend.
       
  4427 
       
  4428         This operation will fail under the same conditions as integer division
       
  4429         (that is, if integer division on the same two operands would fail, the
       
  4430         remainder cannot be calculated).
       
  4431 
       
  4432         >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
       
  4433         Decimal("2.1")
       
  4434         >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
       
  4435         Decimal("1")
       
  4436         >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
       
  4437         Decimal("-1")
       
  4438         >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
       
  4439         Decimal("0.2")
       
  4440         >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
       
  4441         Decimal("0.1")
       
  4442         >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
       
  4443         Decimal("1.0")
       
  4444         """
       
  4445         return a.__mod__(b, context=self)
       
  4446 
       
  4447     def remainder_near(self, a, b):
       
  4448         """Returns to be "a - b * n", where n is the integer nearest the exact
       
  4449         value of "x / b" (if two integers are equally near then the even one
       
  4450         is chosen).  If the result is equal to 0 then its sign will be the
       
  4451         sign of a.
       
  4452 
       
  4453         This operation will fail under the same conditions as integer division
       
  4454         (that is, if integer division on the same two operands would fail, the
       
  4455         remainder cannot be calculated).
       
  4456 
       
  4457         >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
       
  4458         Decimal("-0.9")
       
  4459         >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
       
  4460         Decimal("-2")
       
  4461         >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
       
  4462         Decimal("1")
       
  4463         >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
       
  4464         Decimal("-1")
       
  4465         >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
       
  4466         Decimal("0.2")
       
  4467         >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
       
  4468         Decimal("0.1")
       
  4469         >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
       
  4470         Decimal("-0.3")
       
  4471         """
       
  4472         return a.remainder_near(b, context=self)
       
  4473 
       
  4474     def rotate(self, a, b):
       
  4475         """Returns a rotated copy of a, b times.
       
  4476 
       
  4477         The coefficient of the result is a rotated copy of the digits in
       
  4478         the coefficient of the first operand.  The number of places of
       
  4479         rotation is taken from the absolute value of the second operand,
       
  4480         with the rotation being to the left if the second operand is
       
  4481         positive or to the right otherwise.
       
  4482 
       
  4483         >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
       
  4484         Decimal("400000003")
       
  4485         >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
       
  4486         Decimal("12")
       
  4487         >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
       
  4488         Decimal("891234567")
       
  4489         >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
       
  4490         Decimal("123456789")
       
  4491         >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
       
  4492         Decimal("345678912")
       
  4493         """
       
  4494         return a.rotate(b, context=self)
       
  4495 
       
  4496     def same_quantum(self, a, b):
       
  4497         """Returns True if the two operands have the same exponent.
       
  4498 
       
  4499         The result is never affected by either the sign or the coefficient of
       
  4500         either operand.
       
  4501 
       
  4502         >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
       
  4503         False
       
  4504         >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
       
  4505         True
       
  4506         >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
       
  4507         False
       
  4508         >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
       
  4509         True
       
  4510         """
       
  4511         return a.same_quantum(b)
       
  4512 
       
  4513     def scaleb (self, a, b):
       
  4514         """Returns the first operand after adding the second value its exp.
       
  4515 
       
  4516         >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
       
  4517         Decimal("0.0750")
       
  4518         >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
       
  4519         Decimal("7.50")
       
  4520         >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
       
  4521         Decimal("7.50E+3")
       
  4522         """
       
  4523         return a.scaleb (b, context=self)
       
  4524 
       
  4525     def shift(self, a, b):
       
  4526         """Returns a shifted copy of a, b times.
       
  4527 
       
  4528         The coefficient of the result is a shifted copy of the digits
       
  4529         in the coefficient of the first operand.  The number of places
       
  4530         to shift is taken from the absolute value of the second operand,
       
  4531         with the shift being to the left if the second operand is
       
  4532         positive or to the right otherwise.  Digits shifted into the
       
  4533         coefficient are zeros.
       
  4534 
       
  4535         >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
       
  4536         Decimal("400000000")
       
  4537         >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
       
  4538         Decimal("0")
       
  4539         >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
       
  4540         Decimal("1234567")
       
  4541         >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
       
  4542         Decimal("123456789")
       
  4543         >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
       
  4544         Decimal("345678900")
       
  4545         """
       
  4546         return a.shift(b, context=self)
       
  4547 
       
  4548     def sqrt(self, a):
       
  4549         """Square root of a non-negative number to context precision.
       
  4550 
       
  4551         If the result must be inexact, it is rounded using the round-half-even
       
  4552         algorithm.
       
  4553 
       
  4554         >>> ExtendedContext.sqrt(Decimal('0'))
       
  4555         Decimal("0")
       
  4556         >>> ExtendedContext.sqrt(Decimal('-0'))
       
  4557         Decimal("-0")
       
  4558         >>> ExtendedContext.sqrt(Decimal('0.39'))
       
  4559         Decimal("0.624499800")
       
  4560         >>> ExtendedContext.sqrt(Decimal('100'))
       
  4561         Decimal("10")
       
  4562         >>> ExtendedContext.sqrt(Decimal('1'))
       
  4563         Decimal("1")
       
  4564         >>> ExtendedContext.sqrt(Decimal('1.0'))
       
  4565         Decimal("1.0")
       
  4566         >>> ExtendedContext.sqrt(Decimal('1.00'))
       
  4567         Decimal("1.0")
       
  4568         >>> ExtendedContext.sqrt(Decimal('7'))
       
  4569         Decimal("2.64575131")
       
  4570         >>> ExtendedContext.sqrt(Decimal('10'))
       
  4571         Decimal("3.16227766")
       
  4572         >>> ExtendedContext.prec
       
  4573         9
       
  4574         """
       
  4575         return a.sqrt(context=self)
       
  4576 
       
  4577     def subtract(self, a, b):
       
  4578         """Return the difference between the two operands.
       
  4579 
       
  4580         >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
       
  4581         Decimal("0.23")
       
  4582         >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
       
  4583         Decimal("0.00")
       
  4584         >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
       
  4585         Decimal("-0.77")
       
  4586         """
       
  4587         return a.__sub__(b, context=self)
       
  4588 
       
  4589     def to_eng_string(self, a):
       
  4590         """Converts a number to a string, using scientific notation.
       
  4591 
       
  4592         The operation is not affected by the context.
       
  4593         """
       
  4594         return a.to_eng_string(context=self)
       
  4595 
       
  4596     def to_sci_string(self, a):
       
  4597         """Converts a number to a string, using scientific notation.
       
  4598 
       
  4599         The operation is not affected by the context.
       
  4600         """
       
  4601         return a.__str__(context=self)
       
  4602 
       
  4603     def to_integral_exact(self, a):
       
  4604         """Rounds to an integer.
       
  4605 
       
  4606         When the operand has a negative exponent, the result is the same
       
  4607         as using the quantize() operation using the given operand as the
       
  4608         left-hand-operand, 1E+0 as the right-hand-operand, and the precision
       
  4609         of the operand as the precision setting; Inexact and Rounded flags
       
  4610         are allowed in this operation.  The rounding mode is taken from the
       
  4611         context.
       
  4612 
       
  4613         >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
       
  4614         Decimal("2")
       
  4615         >>> ExtendedContext.to_integral_exact(Decimal('100'))
       
  4616         Decimal("100")
       
  4617         >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
       
  4618         Decimal("100")
       
  4619         >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
       
  4620         Decimal("102")
       
  4621         >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
       
  4622         Decimal("-102")
       
  4623         >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
       
  4624         Decimal("1.0E+6")
       
  4625         >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
       
  4626         Decimal("7.89E+77")
       
  4627         >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
       
  4628         Decimal("-Infinity")
       
  4629         """
       
  4630         return a.to_integral_exact(context=self)
       
  4631 
       
  4632     def to_integral_value(self, a):
       
  4633         """Rounds to an integer.
       
  4634 
       
  4635         When the operand has a negative exponent, the result is the same
       
  4636         as using the quantize() operation using the given operand as the
       
  4637         left-hand-operand, 1E+0 as the right-hand-operand, and the precision
       
  4638         of the operand as the precision setting, except that no flags will
       
  4639         be set.  The rounding mode is taken from the context.
       
  4640 
       
  4641         >>> ExtendedContext.to_integral_value(Decimal('2.1'))
       
  4642         Decimal("2")
       
  4643         >>> ExtendedContext.to_integral_value(Decimal('100'))
       
  4644         Decimal("100")
       
  4645         >>> ExtendedContext.to_integral_value(Decimal('100.0'))
       
  4646         Decimal("100")
       
  4647         >>> ExtendedContext.to_integral_value(Decimal('101.5'))
       
  4648         Decimal("102")
       
  4649         >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
       
  4650         Decimal("-102")
       
  4651         >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
       
  4652         Decimal("1.0E+6")
       
  4653         >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
       
  4654         Decimal("7.89E+77")
       
  4655         >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
       
  4656         Decimal("-Infinity")
       
  4657         """
       
  4658         return a.to_integral_value(context=self)
       
  4659 
       
  4660     # the method name changed, but we provide also the old one, for compatibility
       
  4661     to_integral = to_integral_value
       
  4662 
       
  4663 class _WorkRep(object):
       
  4664     __slots__ = ('sign','int','exp')
       
  4665     # sign: 0 or 1
       
  4666     # int:  int or long
       
  4667     # exp:  None, int, or string
       
  4668 
       
  4669     def __init__(self, value=None):
       
  4670         if value is None:
       
  4671             self.sign = None
       
  4672             self.int = 0
       
  4673             self.exp = None
       
  4674         elif isinstance(value, Decimal):
       
  4675             self.sign = value._sign
       
  4676             self.int = int(value._int)
       
  4677             self.exp = value._exp
       
  4678         else:
       
  4679             # assert isinstance(value, tuple)
       
  4680             self.sign = value[0]
       
  4681             self.int = value[1]
       
  4682             self.exp = value[2]
       
  4683 
       
  4684     def __repr__(self):
       
  4685         return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
       
  4686 
       
  4687     __str__ = __repr__
       
  4688 
       
  4689 
       
  4690 
       
  4691 def _normalize(op1, op2, prec = 0):
       
  4692     """Normalizes op1, op2 to have the same exp and length of coefficient.
       
  4693 
       
  4694     Done during addition.
       
  4695     """
       
  4696     if op1.exp < op2.exp:
       
  4697         tmp = op2
       
  4698         other = op1
       
  4699     else:
       
  4700         tmp = op1
       
  4701         other = op2
       
  4702 
       
  4703     # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
       
  4704     # Then adding 10**exp to tmp has the same effect (after rounding)
       
  4705     # as adding any positive quantity smaller than 10**exp; similarly
       
  4706     # for subtraction.  So if other is smaller than 10**exp we replace
       
  4707     # it with 10**exp.  This avoids tmp.exp - other.exp getting too large.
       
  4708     tmp_len = len(str(tmp.int))
       
  4709     other_len = len(str(other.int))
       
  4710     exp = tmp.exp + min(-1, tmp_len - prec - 2)
       
  4711     if other_len + other.exp - 1 < exp:
       
  4712         other.int = 1
       
  4713         other.exp = exp
       
  4714 
       
  4715     tmp.int *= 10 ** (tmp.exp - other.exp)
       
  4716     tmp.exp = other.exp
       
  4717     return op1, op2
       
  4718 
       
  4719 ##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
       
  4720 
       
  4721 # This function from Tim Peters was taken from here:
       
  4722 # http://mail.python.org/pipermail/python-list/1999-July/007758.html
       
  4723 # The correction being in the function definition is for speed, and
       
  4724 # the whole function is not resolved with math.log because of avoiding
       
  4725 # the use of floats.
       
  4726 def _nbits(n, correction = {
       
  4727         '0': 4, '1': 3, '2': 2, '3': 2,
       
  4728         '4': 1, '5': 1, '6': 1, '7': 1,
       
  4729         '8': 0, '9': 0, 'a': 0, 'b': 0,
       
  4730         'c': 0, 'd': 0, 'e': 0, 'f': 0}):
       
  4731     """Number of bits in binary representation of the positive integer n,
       
  4732     or 0 if n == 0.
       
  4733     """
       
  4734     if n < 0:
       
  4735         raise ValueError("The argument to _nbits should be nonnegative.")
       
  4736     hex_n = "%x" % n
       
  4737     return 4*len(hex_n) - correction[hex_n[0]]
       
  4738 
       
  4739 def _sqrt_nearest(n, a):
       
  4740     """Closest integer to the square root of the positive integer n.  a is
       
  4741     an initial approximation to the square root.  Any positive integer
       
  4742     will do for a, but the closer a is to the square root of n the
       
  4743     faster convergence will be.
       
  4744 
       
  4745     """
       
  4746     if n <= 0 or a <= 0:
       
  4747         raise ValueError("Both arguments to _sqrt_nearest should be positive.")
       
  4748 
       
  4749     b=0
       
  4750     while a != b:
       
  4751         b, a = a, a--n//a>>1
       
  4752     return a
       
  4753 
       
  4754 def _rshift_nearest(x, shift):
       
  4755     """Given an integer x and a nonnegative integer shift, return closest
       
  4756     integer to x / 2**shift; use round-to-even in case of a tie.
       
  4757 
       
  4758     """
       
  4759     b, q = 1L << shift, x >> shift
       
  4760     return q + (2*(x & (b-1)) + (q&1) > b)
       
  4761 
       
  4762 def _div_nearest(a, b):
       
  4763     """Closest integer to a/b, a and b positive integers; rounds to even
       
  4764     in the case of a tie.
       
  4765 
       
  4766     """
       
  4767     q, r = divmod(a, b)
       
  4768     return q + (2*r + (q&1) > b)
       
  4769 
       
  4770 def _ilog(x, M, L = 8):
       
  4771     """Integer approximation to M*log(x/M), with absolute error boundable
       
  4772     in terms only of x/M.
       
  4773 
       
  4774     Given positive integers x and M, return an integer approximation to
       
  4775     M * log(x/M).  For L = 8 and 0.1 <= x/M <= 10 the difference
       
  4776     between the approximation and the exact result is at most 22.  For
       
  4777     L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15.  In
       
  4778     both cases these are upper bounds on the error; it will usually be
       
  4779     much smaller."""
       
  4780 
       
  4781     # The basic algorithm is the following: let log1p be the function
       
  4782     # log1p(x) = log(1+x).  Then log(x/M) = log1p((x-M)/M).  We use
       
  4783     # the reduction
       
  4784     #
       
  4785     #    log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
       
  4786     #
       
  4787     # repeatedly until the argument to log1p is small (< 2**-L in
       
  4788     # absolute value).  For small y we can use the Taylor series
       
  4789     # expansion
       
  4790     #
       
  4791     #    log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
       
  4792     #
       
  4793     # truncating at T such that y**T is small enough.  The whole
       
  4794     # computation is carried out in a form of fixed-point arithmetic,
       
  4795     # with a real number z being represented by an integer
       
  4796     # approximation to z*M.  To avoid loss of precision, the y below
       
  4797     # is actually an integer approximation to 2**R*y*M, where R is the
       
  4798     # number of reductions performed so far.
       
  4799 
       
  4800     y = x-M
       
  4801     # argument reduction; R = number of reductions performed
       
  4802     R = 0
       
  4803     while (R <= L and long(abs(y)) << L-R >= M or
       
  4804            R > L and abs(y) >> R-L >= M):
       
  4805         y = _div_nearest(long(M*y) << 1,
       
  4806                          M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
       
  4807         R += 1
       
  4808 
       
  4809     # Taylor series with T terms
       
  4810     T = -int(-10*len(str(M))//(3*L))
       
  4811     yshift = _rshift_nearest(y, R)
       
  4812     w = _div_nearest(M, T)
       
  4813     for k in xrange(T-1, 0, -1):
       
  4814         w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
       
  4815 
       
  4816     return _div_nearest(w*y, M)
       
  4817 
       
  4818 def _dlog10(c, e, p):
       
  4819     """Given integers c, e and p with c > 0, p >= 0, compute an integer
       
  4820     approximation to 10**p * log10(c*10**e), with an absolute error of
       
  4821     at most 1.  Assumes that c*10**e is not exactly 1."""
       
  4822 
       
  4823     # increase precision by 2; compensate for this by dividing
       
  4824     # final result by 100
       
  4825     p += 2
       
  4826 
       
  4827     # write c*10**e as d*10**f with either:
       
  4828     #   f >= 0 and 1 <= d <= 10, or
       
  4829     #   f <= 0 and 0.1 <= d <= 1.
       
  4830     # Thus for c*10**e close to 1, f = 0
       
  4831     l = len(str(c))
       
  4832     f = e+l - (e+l >= 1)
       
  4833 
       
  4834     if p > 0:
       
  4835         M = 10**p
       
  4836         k = e+p-f
       
  4837         if k >= 0:
       
  4838             c *= 10**k
       
  4839         else:
       
  4840             c = _div_nearest(c, 10**-k)
       
  4841 
       
  4842         log_d = _ilog(c, M) # error < 5 + 22 = 27
       
  4843         log_10 = _log10_digits(p) # error < 1
       
  4844         log_d = _div_nearest(log_d*M, log_10)
       
  4845         log_tenpower = f*M # exact
       
  4846     else:
       
  4847         log_d = 0  # error < 2.31
       
  4848         log_tenpower = div_nearest(f, 10**-p) # error < 0.5
       
  4849 
       
  4850     return _div_nearest(log_tenpower+log_d, 100)
       
  4851 
       
  4852 def _dlog(c, e, p):
       
  4853     """Given integers c, e and p with c > 0, compute an integer
       
  4854     approximation to 10**p * log(c*10**e), with an absolute error of
       
  4855     at most 1.  Assumes that c*10**e is not exactly 1."""
       
  4856 
       
  4857     # Increase precision by 2. The precision increase is compensated
       
  4858     # for at the end with a division by 100.
       
  4859     p += 2
       
  4860 
       
  4861     # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
       
  4862     # or f <= 0 and 0.1 <= d <= 1.  Then we can compute 10**p * log(c*10**e)
       
  4863     # as 10**p * log(d) + 10**p*f * log(10).
       
  4864     l = len(str(c))
       
  4865     f = e+l - (e+l >= 1)
       
  4866 
       
  4867     # compute approximation to 10**p*log(d), with error < 27
       
  4868     if p > 0:
       
  4869         k = e+p-f
       
  4870         if k >= 0:
       
  4871             c *= 10**k
       
  4872         else:
       
  4873             c = _div_nearest(c, 10**-k)  # error of <= 0.5 in c
       
  4874 
       
  4875         # _ilog magnifies existing error in c by a factor of at most 10
       
  4876         log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
       
  4877     else:
       
  4878         # p <= 0: just approximate the whole thing by 0; error < 2.31
       
  4879         log_d = 0
       
  4880 
       
  4881     # compute approximation to f*10**p*log(10), with error < 11.
       
  4882     if f:
       
  4883         extra = len(str(abs(f)))-1
       
  4884         if p + extra >= 0:
       
  4885             # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
       
  4886             # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
       
  4887             f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
       
  4888         else:
       
  4889             f_log_ten = 0
       
  4890     else:
       
  4891         f_log_ten = 0
       
  4892 
       
  4893     # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
       
  4894     return _div_nearest(f_log_ten + log_d, 100)
       
  4895 
       
  4896 class _Log10Memoize(object):
       
  4897     """Class to compute, store, and allow retrieval of, digits of the
       
  4898     constant log(10) = 2.302585....  This constant is needed by
       
  4899     Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
       
  4900     def __init__(self):
       
  4901         self.digits = "23025850929940456840179914546843642076011014886"
       
  4902 
       
  4903     def getdigits(self, p):
       
  4904         """Given an integer p >= 0, return floor(10**p)*log(10).
       
  4905 
       
  4906         For example, self.getdigits(3) returns 2302.
       
  4907         """
       
  4908         # digits are stored as a string, for quick conversion to
       
  4909         # integer in the case that we've already computed enough
       
  4910         # digits; the stored digits should always be correct
       
  4911         # (truncated, not rounded to nearest).
       
  4912         if p < 0:
       
  4913             raise ValueError("p should be nonnegative")
       
  4914 
       
  4915         if p >= len(self.digits):
       
  4916             # compute p+3, p+6, p+9, ... digits; continue until at
       
  4917             # least one of the extra digits is nonzero
       
  4918             extra = 3
       
  4919             while True:
       
  4920                 # compute p+extra digits, correct to within 1ulp
       
  4921                 M = 10**(p+extra+2)
       
  4922                 digits = str(_div_nearest(_ilog(10*M, M), 100))
       
  4923                 if digits[-extra:] != '0'*extra:
       
  4924                     break
       
  4925                 extra += 3
       
  4926             # keep all reliable digits so far; remove trailing zeros
       
  4927             # and next nonzero digit
       
  4928             self.digits = digits.rstrip('0')[:-1]
       
  4929         return int(self.digits[:p+1])
       
  4930 
       
  4931 _log10_digits = _Log10Memoize().getdigits
       
  4932 
       
  4933 def _iexp(x, M, L=8):
       
  4934     """Given integers x and M, M > 0, such that x/M is small in absolute
       
  4935     value, compute an integer approximation to M*exp(x/M).  For 0 <=
       
  4936     x/M <= 2.4, the absolute error in the result is bounded by 60 (and
       
  4937     is usually much smaller)."""
       
  4938 
       
  4939     # Algorithm: to compute exp(z) for a real number z, first divide z
       
  4940     # by a suitable power R of 2 so that |z/2**R| < 2**-L.  Then
       
  4941     # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
       
  4942     # series
       
  4943     #
       
  4944     #     expm1(x) = x + x**2/2! + x**3/3! + ...
       
  4945     #
       
  4946     # Now use the identity
       
  4947     #
       
  4948     #     expm1(2x) = expm1(x)*(expm1(x)+2)
       
  4949     #
       
  4950     # R times to compute the sequence expm1(z/2**R),
       
  4951     # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
       
  4952 
       
  4953     # Find R such that x/2**R/M <= 2**-L
       
  4954     R = _nbits((long(x)<<L)//M)
       
  4955 
       
  4956     # Taylor series.  (2**L)**T > M
       
  4957     T = -int(-10*len(str(M))//(3*L))
       
  4958     y = _div_nearest(x, T)
       
  4959     Mshift = long(M)<<R
       
  4960     for i in xrange(T-1, 0, -1):
       
  4961         y = _div_nearest(x*(Mshift + y), Mshift * i)
       
  4962 
       
  4963     # Expansion
       
  4964     for k in xrange(R-1, -1, -1):
       
  4965         Mshift = long(M)<<(k+2)
       
  4966         y = _div_nearest(y*(y+Mshift), Mshift)
       
  4967 
       
  4968     return M+y
       
  4969 
       
  4970 def _dexp(c, e, p):
       
  4971     """Compute an approximation to exp(c*10**e), with p decimal places of
       
  4972     precision.
       
  4973 
       
  4974     Returns integers d, f such that:
       
  4975 
       
  4976       10**(p-1) <= d <= 10**p, and
       
  4977       (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
       
  4978 
       
  4979     In other words, d*10**f is an approximation to exp(c*10**e) with p
       
  4980     digits of precision, and with an error in d of at most 1.  This is
       
  4981     almost, but not quite, the same as the error being < 1ulp: when d
       
  4982     = 10**(p-1) the error could be up to 10 ulp."""
       
  4983 
       
  4984     # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
       
  4985     p += 2
       
  4986 
       
  4987     # compute log(10) with extra precision = adjusted exponent of c*10**e
       
  4988     extra = max(0, e + len(str(c)) - 1)
       
  4989     q = p + extra
       
  4990 
       
  4991     # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
       
  4992     # rounding down
       
  4993     shift = e+q
       
  4994     if shift >= 0:
       
  4995         cshift = c*10**shift
       
  4996     else:
       
  4997         cshift = c//10**-shift
       
  4998     quot, rem = divmod(cshift, _log10_digits(q))
       
  4999 
       
  5000     # reduce remainder back to original precision
       
  5001     rem = _div_nearest(rem, 10**extra)
       
  5002 
       
  5003     # error in result of _iexp < 120;  error after division < 0.62
       
  5004     return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
       
  5005 
       
  5006 def _dpower(xc, xe, yc, ye, p):
       
  5007     """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
       
  5008     y = yc*10**ye, compute x**y.  Returns a pair of integers (c, e) such that:
       
  5009 
       
  5010       10**(p-1) <= c <= 10**p, and
       
  5011       (c-1)*10**e < x**y < (c+1)*10**e
       
  5012 
       
  5013     in other words, c*10**e is an approximation to x**y with p digits
       
  5014     of precision, and with an error in c of at most 1.  (This is
       
  5015     almost, but not quite, the same as the error being < 1ulp: when c
       
  5016     == 10**(p-1) we can only guarantee error < 10ulp.)
       
  5017 
       
  5018     We assume that: x is positive and not equal to 1, and y is nonzero.
       
  5019     """
       
  5020 
       
  5021     # Find b such that 10**(b-1) <= |y| <= 10**b
       
  5022     b = len(str(abs(yc))) + ye
       
  5023 
       
  5024     # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
       
  5025     lxc = _dlog(xc, xe, p+b+1)
       
  5026 
       
  5027     # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
       
  5028     shift = ye-b
       
  5029     if shift >= 0:
       
  5030         pc = lxc*yc*10**shift
       
  5031     else:
       
  5032         pc = _div_nearest(lxc*yc, 10**-shift)
       
  5033 
       
  5034     if pc == 0:
       
  5035         # we prefer a result that isn't exactly 1; this makes it
       
  5036         # easier to compute a correctly rounded result in __pow__
       
  5037         if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
       
  5038             coeff, exp = 10**(p-1)+1, 1-p
       
  5039         else:
       
  5040             coeff, exp = 10**p-1, -p
       
  5041     else:
       
  5042         coeff, exp = _dexp(pc, -(p+1), p+1)
       
  5043         coeff = _div_nearest(coeff, 10)
       
  5044         exp += 1
       
  5045 
       
  5046     return coeff, exp
       
  5047 
       
  5048 def _log10_lb(c, correction = {
       
  5049         '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
       
  5050         '6': 23, '7': 16, '8': 10, '9': 5}):
       
  5051     """Compute a lower bound for 100*log10(c) for a positive integer c."""
       
  5052     if c <= 0:
       
  5053         raise ValueError("The argument to _log10_lb should be nonnegative.")
       
  5054     str_c = str(c)
       
  5055     return 100*len(str_c) - correction[str_c[0]]
       
  5056 
       
  5057 ##### Helper Functions ####################################################
       
  5058 
       
  5059 def _convert_other(other, raiseit=False):
       
  5060     """Convert other to Decimal.
       
  5061 
       
  5062     Verifies that it's ok to use in an implicit construction.
       
  5063     """
       
  5064     if isinstance(other, Decimal):
       
  5065         return other
       
  5066     if isinstance(other, (int, long)):
       
  5067         return Decimal(other)
       
  5068     if raiseit:
       
  5069         raise TypeError("Unable to convert %s to Decimal" % other)
       
  5070     return NotImplemented
       
  5071 
       
  5072 ##### Setup Specific Contexts ############################################
       
  5073 
       
  5074 # The default context prototype used by Context()
       
  5075 # Is mutable, so that new contexts can have different default values
       
  5076 
       
  5077 DefaultContext = Context(
       
  5078         prec=28, rounding=ROUND_HALF_EVEN,
       
  5079         traps=[DivisionByZero, Overflow, InvalidOperation],
       
  5080         flags=[],
       
  5081         Emax=999999999,
       
  5082         Emin=-999999999,
       
  5083         capitals=1
       
  5084 )
       
  5085 
       
  5086 # Pre-made alternate contexts offered by the specification
       
  5087 # Don't change these; the user should be able to select these
       
  5088 # contexts and be able to reproduce results from other implementations
       
  5089 # of the spec.
       
  5090 
       
  5091 BasicContext = Context(
       
  5092         prec=9, rounding=ROUND_HALF_UP,
       
  5093         traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
       
  5094         flags=[],
       
  5095 )
       
  5096 
       
  5097 ExtendedContext = Context(
       
  5098         prec=9, rounding=ROUND_HALF_EVEN,
       
  5099         traps=[],
       
  5100         flags=[],
       
  5101 )
       
  5102 
       
  5103 
       
  5104 ##### crud for parsing strings #############################################
       
  5105 import re
       
  5106 
       
  5107 # Regular expression used for parsing numeric strings.  Additional
       
  5108 # comments:
       
  5109 #
       
  5110 # 1. Uncomment the two '\s*' lines to allow leading and/or trailing
       
  5111 # whitespace.  But note that the specification disallows whitespace in
       
  5112 # a numeric string.
       
  5113 #
       
  5114 # 2. For finite numbers (not infinities and NaNs) the body of the
       
  5115 # number between the optional sign and the optional exponent must have
       
  5116 # at least one decimal digit, possibly after the decimal point.  The
       
  5117 # lookahead expression '(?=\d|\.\d)' checks this.
       
  5118 #
       
  5119 # As the flag UNICODE is not enabled here, we're explicitly avoiding any
       
  5120 # other meaning for \d than the numbers [0-9].
       
  5121 
       
  5122 import re
       
  5123 _parser = re.compile(r"""     # A numeric string consists of:
       
  5124 #    \s*
       
  5125     (?P<sign>[-+])?           # an optional sign, followed by either...
       
  5126     (
       
  5127         (?=\d|\.\d)           # ...a number (with at least one digit)
       
  5128         (?P<int>\d*)          # consisting of a (possibly empty) integer part
       
  5129         (\.(?P<frac>\d*))?    # followed by an optional fractional part
       
  5130         (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
       
  5131     |
       
  5132         Inf(inity)?           # ...an infinity, or...
       
  5133     |
       
  5134         (?P<signal>s)?        # ...an (optionally signaling)
       
  5135         NaN                   # NaN
       
  5136         (?P<diag>\d*)         # with (possibly empty) diagnostic information.
       
  5137     )
       
  5138 #    \s*
       
  5139     $
       
  5140 """, re.VERBOSE | re.IGNORECASE).match
       
  5141 
       
  5142 _all_zeros = re.compile('0*$').match
       
  5143 _exact_half = re.compile('50*$').match
       
  5144 del re
       
  5145 
       
  5146 
       
  5147 ##### Useful Constants (internal use only) ################################
       
  5148 
       
  5149 # Reusable defaults
       
  5150 Inf = Decimal('Inf')
       
  5151 negInf = Decimal('-Inf')
       
  5152 NaN = Decimal('NaN')
       
  5153 Dec_0 = Decimal(0)
       
  5154 Dec_p1 = Decimal(1)
       
  5155 Dec_n1 = Decimal(-1)
       
  5156 
       
  5157 # Infsign[sign] is infinity w/ that sign
       
  5158 Infsign = (Inf, negInf)
       
  5159 
       
  5160 
       
  5161 
       
  5162 if __name__ == '__main__':
       
  5163     import doctest, sys
       
  5164     doctest.testmod(sys.modules[__name__])