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