1 # Copyright (c) 2004 Python Software Foundation.
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>
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.
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.
21 This is a Py2.3 implementation of decimal floating point arithmetic based on
22 the General Decimal Arithmetic Specification:
24 www2.hursley.ibm.com/decimal/decarith.html
26 and IEEE standard 854-1987:
28 www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
30 Decimal floating point has finite precision with arbitrarily large bounds.
32 The purpose of the module is to support arithmetic using familiar
33 "schoolhouse" rules and to avoid the some of 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).
40 Here are some examples of using the decimal module:
42 >>> from decimal import *
43 >>> setcontext(ExtendedContext)
52 >>> Decimal("123.45e12345678901234567890")
53 Decimal("1.2345E+12345678901234567892")
54 >>> Decimal("1.33") + Decimal("1.27")
56 >>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41")
59 >>> print dig / Decimal(3)
61 >>> getcontext().prec = 18
62 >>> print dig / Decimal(3)
66 >>> print Decimal(3).sqrt()
68 >>> print Decimal(3) ** 123
69 4.85192780976896427E+58
70 >>> inf = Decimal(1) / Decimal(0)
73 >>> neginf = Decimal(-1) / Decimal(0)
76 >>> print neginf + inf
78 >>> print neginf * inf
82 >>> getcontext().traps[DivisionByZero] = 1
84 Traceback (most recent call last):
90 >>> c.traps[InvalidOperation] = 0
91 >>> print c.flags[InvalidOperation]
93 >>> c.divide(Decimal(0), Decimal(0))
95 >>> c.traps[InvalidOperation] = 1
96 >>> print c.flags[InvalidOperation]
98 >>> c.flags[InvalidOperation] = 0
99 >>> print c.flags[InvalidOperation]
101 >>> print c.divide(Decimal(0), Decimal(0))
102 Traceback (most recent call last):
106 InvalidOperation: 0 / 0
107 >>> print c.flags[InvalidOperation]
109 >>> c.flags[InvalidOperation] = 0
110 >>> c.traps[InvalidOperation] = 0
111 >>> print c.divide(Decimal(0), Decimal(0))
113 >>> print c.flags[InvalidOperation]
120 'Decimal', 'Context',
123 'DefaultContext', 'BasicContext', 'ExtendedContext',
126 'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
127 'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
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',
133 # Functions for manipulating contexts
134 'setcontext', 'getcontext', 'localcontext'
140 ROUND_DOWN
= 'ROUND_DOWN'
141 ROUND_HALF_UP
= 'ROUND_HALF_UP'
142 ROUND_HALF_EVEN
= 'ROUND_HALF_EVEN'
143 ROUND_CEILING
= 'ROUND_CEILING'
144 ROUND_FLOOR
= 'ROUND_FLOOR'
145 ROUND_UP
= 'ROUND_UP'
146 ROUND_HALF_DOWN
= 'ROUND_HALF_DOWN'
148 #Rounding decision (not part of the public API)
149 NEVER_ROUND
= 'NEVER_ROUND' # Round in division (non-divmod), sqrt ONLY
150 ALWAYS_ROUND
= 'ALWAYS_ROUND' # Every operation rounds at end.
154 class DecimalException(ArithmeticError):
155 """Base exception class.
157 Used exceptions derive from this.
158 If an exception derives from another exception besides this (such as
159 Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
160 called if the others are present. This isn't actually used for
163 handle -- Called when context._raise_error is called and the
164 trap_enabler is set. First argument is self, second is the
165 context. More arguments can be given, those being after
166 the explanation in _raise_error (For example,
167 context._raise_error(NewError, '(-x)!', self._sign) would
168 call NewError().handle(context, self._sign).)
170 To define a new exception, it should be sufficient to have it derive
171 from DecimalException.
173 def handle(self
, context
, *args
):
177 class Clamped(DecimalException
):
178 """Exponent of a 0 changed to fit bounds.
180 This occurs and signals clamped if the exponent of a result has been
181 altered in order to fit the constraints of a specific concrete
182 representation. This may occur when the exponent of a zero result would
183 be outside the bounds of a representation, or when a large normal
184 number would have an encoded exponent that cannot be represented. In
185 this latter case, the exponent is reduced to fit and the corresponding
186 number of zero digits are appended to the coefficient ("fold-down").
190 class InvalidOperation(DecimalException
):
191 """An invalid operation was performed.
193 Various bad things cause this:
195 Something creates a signaling NaN
201 x._rescale( non-integer )
206 An operand is invalid
208 def handle(self
, context
, *args
):
210 if args
[0] == 1: #sNaN, must drop 's' but keep diagnostics
211 return Decimal( (args
[1]._sign
, args
[1]._int
, 'n') )
214 class ConversionSyntax(InvalidOperation
):
215 """Trying to convert badly formed string.
217 This occurs and signals invalid-operation if an string is being
218 converted to a number and it does not conform to the numeric string
219 syntax. The result is [0,qNaN].
222 def handle(self
, context
, *args
):
223 return (0, (0,), 'n') #Passed to something which uses a tuple.
225 class DivisionByZero(DecimalException
, ZeroDivisionError):
228 This occurs and signals division-by-zero if division of a finite number
229 by zero was attempted (during a divide-integer or divide operation, or a
230 power operation with negative right-hand operand), and the dividend was
233 The result of the operation is [sign,inf], where sign is the exclusive
234 or of the signs of the operands for divide, or is 1 for an odd power of
238 def handle(self
, context
, sign
, double
= None, *args
):
239 if double
is not None:
240 return (Infsign
[sign
],)*2
243 class DivisionImpossible(InvalidOperation
):
244 """Cannot perform the division adequately.
246 This occurs and signals invalid-operation if the integer result of a
247 divide-integer or remainder operation had too many digits (would be
248 longer than precision). The result is [0,qNaN].
251 def handle(self
, context
, *args
):
254 class DivisionUndefined(InvalidOperation
, ZeroDivisionError):
255 """Undefined result of division.
257 This occurs and signals invalid-operation if division by zero was
258 attempted (during a divide-integer, divide, or remainder operation), and
259 the dividend is also zero. The result is [0,qNaN].
262 def handle(self
, context
, tup
=None, *args
):
264 return (NaN
, NaN
) #for 0 %0, 0 // 0
267 class Inexact(DecimalException
):
268 """Had to round, losing information.
270 This occurs and signals inexact whenever the result of an operation is
271 not exact (that is, it needed to be rounded and any discarded digits
272 were non-zero), or if an overflow or underflow condition occurs. The
273 result in all cases is unchanged.
275 The inexact signal may be tested (or trapped) to determine if a given
276 operation (or sequence of operations) was inexact.
280 class InvalidContext(InvalidOperation
):
281 """Invalid context. Unknown rounding, for example.
283 This occurs and signals invalid-operation if an invalid context was
284 detected during an operation. This can occur if contexts are not checked
285 on creation and either the precision exceeds the capability of the
286 underlying concrete representation or an unknown or unsupported rounding
287 was specified. These aspects of the context need only be checked when
288 the values are required to be used. The result is [0,qNaN].
291 def handle(self
, context
, *args
):
294 class Rounded(DecimalException
):
295 """Number got rounded (not necessarily changed during rounding).
297 This occurs and signals rounded whenever the result of an operation is
298 rounded (that is, some zero or non-zero digits were discarded from the
299 coefficient), or if an overflow or underflow condition occurs. The
300 result in all cases is unchanged.
302 The rounded signal may be tested (or trapped) to determine if a given
303 operation (or sequence of operations) caused a loss of precision.
307 class Subnormal(DecimalException
):
308 """Exponent < Emin before rounding.
310 This occurs and signals subnormal whenever the result of a conversion or
311 operation is subnormal (that is, its adjusted exponent is less than
312 Emin, before any rounding). The result in all cases is unchanged.
314 The subnormal signal may be tested (or trapped) to determine if a given
315 or operation (or sequence of operations) yielded a subnormal result.
319 class Overflow(Inexact
, Rounded
):
320 """Numerical overflow.
322 This occurs and signals overflow if the adjusted exponent of a result
323 (from a conversion or from an operation that is not an attempt to divide
324 by zero), after rounding, would be greater than the largest value that
325 can be handled by the implementation (the value Emax).
327 The result depends on the rounding mode:
329 For round-half-up and round-half-even (and for round-half-down and
330 round-up, if implemented), the result of the operation is [sign,inf],
331 where sign is the sign of the intermediate result. For round-down, the
332 result is the largest finite number that can be represented in the
333 current precision, with the sign of the intermediate result. For
334 round-ceiling, the result is the same as for round-down if the sign of
335 the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
336 the result is the same as for round-down if the sign of the intermediate
337 result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
341 def handle(self
, context
, sign
, *args
):
342 if context
.rounding
in (ROUND_HALF_UP
, ROUND_HALF_EVEN
,
343 ROUND_HALF_DOWN
, ROUND_UP
):
346 if context
.rounding
== ROUND_CEILING
:
348 return Decimal((sign
, (9,)*context
.prec
,
349 context
.Emax
-context
.prec
+1))
351 if context
.rounding
== ROUND_FLOOR
:
353 return Decimal( (sign
, (9,)*context
.prec
,
354 context
.Emax
-context
.prec
+1))
357 class Underflow(Inexact
, Rounded
, Subnormal
):
358 """Numerical underflow with result rounded to 0.
360 This occurs and signals underflow if a result is inexact and the
361 adjusted exponent of the result would be smaller (more negative) than
362 the smallest value that can be handled by the implementation (the value
363 Emin). That is, the result is both inexact and subnormal.
365 The result after an underflow will be a subnormal number rounded, if
366 necessary, so that its exponent is not less than Etiny. This may result
367 in 0 with the sign of the intermediate result and an exponent of Etiny.
369 In all cases, Inexact, Rounded, and Subnormal will also be raised.
372 # List of public traps and flags
373 _signals
= [Clamped
, DivisionByZero
, Inexact
, Overflow
, Rounded
,
374 Underflow
, InvalidOperation
, Subnormal
]
376 # Map conditions (per the spec) to signals
377 _condition_map
= {ConversionSyntax
:InvalidOperation
,
378 DivisionImpossible
:InvalidOperation
,
379 DivisionUndefined
:InvalidOperation
,
380 InvalidContext
:InvalidOperation
}
382 ##### Context Functions #######################################
384 # The getcontext() and setcontext() function manage access to a thread-local
385 # current context. Py2.4 offers direct support for thread locals. If that
386 # is not available, use threading.currentThread() which is slower but will
387 # work for older Pythons. If threads are not part of the build, create a
388 # mock threading object with threading.local() returning the module namespace.
393 # Python was compiled without threads; create a mock object instead
396 def local(self
, sys
=sys
):
397 return sys
.modules
[__name__
]
398 threading
= MockThreading()
399 del sys
, MockThreading
404 except AttributeError:
406 #To fix reloading, force it to create a new context
407 #Old contexts have different exceptions in their dicts, making problems.
408 if hasattr(threading
.currentThread(), '__decimal_context__'):
409 del threading
.currentThread().__decimal
_context
__
411 def setcontext(context
):
412 """Set this thread's context to context."""
413 if context
in (DefaultContext
, BasicContext
, ExtendedContext
):
414 context
= context
.copy()
415 context
.clear_flags()
416 threading
.currentThread().__decimal
_context
__ = context
419 """Returns this thread's context.
421 If this thread does not yet have a context, returns
422 a new context and sets this thread's context.
423 New contexts are copies of DefaultContext.
426 return threading
.currentThread().__decimal
_context
__
427 except AttributeError:
429 threading
.currentThread().__decimal
_context
__ = context
434 local
= threading
.local()
435 if hasattr(local
, '__decimal_context__'):
436 del local
.__decimal
_context
__
438 def getcontext(_local
=local
):
439 """Returns this thread's context.
441 If this thread does not yet have a context, returns
442 a new context and sets this thread's context.
443 New contexts are copies of DefaultContext.
446 return _local
.__decimal
_context
__
447 except AttributeError:
449 _local
.__decimal
_context
__ = context
452 def setcontext(context
, _local
=local
):
453 """Set this thread's context to context."""
454 if context
in (DefaultContext
, BasicContext
, ExtendedContext
):
455 context
= context
.copy()
456 context
.clear_flags()
457 _local
.__decimal
_context
__ = context
459 del threading
, local
# Don't contaminate the namespace
461 def localcontext(ctx
=None):
462 """Return a context manager for a copy of the supplied context
464 Uses a copy of the current context if no context is specified
465 The returned context manager creates a local decimal context
468 with localcontext() as ctx:
470 # Rest of sin calculation algorithm
471 # uses a precision 2 greater than normal
472 return +s # Convert result to normal precision
475 with localcontext(ExtendedContext):
476 # Rest of sin calculation algorithm
477 # uses the Extended Context from the
478 # General Decimal Arithmetic Specification
479 return +s # Convert result to normal context
482 # The string below can't be included in the docstring until Python 2.6
483 # as the doctest module doesn't understand __future__ statements
485 >>> from __future__ import with_statement
486 >>> print getcontext().prec
488 >>> with localcontext():
489 ... ctx = getcontext()
494 >>> with localcontext(ExtendedContext):
495 ... print getcontext().prec
498 >>> print getcontext().prec
501 if ctx
is None: ctx
= getcontext()
502 return _ContextManager(ctx
)
505 ##### Decimal class ###########################################
507 class Decimal(object):
508 """Floating point class for decimal arithmetic."""
510 __slots__
= ('_exp','_int','_sign', '_is_special')
511 # Generally, the value of the Decimal instance is given by
512 # (-1)**_sign * _int * 10**_exp
513 # Special values are signified by _is_special == True
515 # We're immutable, so use __new__ not __init__
516 def __new__(cls
, value
="0", context
=None):
517 """Create a decimal point instance.
519 >>> Decimal('3.14') # string input
521 >>> Decimal((0, (3, 1, 4), -2)) # tuple input (sign, digit_tuple, exponent)
523 >>> Decimal(314) # int or long
525 >>> Decimal(Decimal(314)) # another decimal instance
529 self
= object.__new
__(cls
)
530 self
._is
_special
= False
532 # From an internal working value
533 if isinstance(value
, _WorkRep
):
534 self
._sign
= value
.sign
535 self
._int
= tuple(map(int, str(value
.int)))
536 self
._exp
= int(value
.exp
)
539 # From another decimal
540 if isinstance(value
, Decimal
):
541 self
._exp
= value
._exp
542 self
._sign
= value
._sign
543 self
._int
= value
._int
544 self
._is
_special
= value
._is
_special
548 if isinstance(value
, (int,long)):
554 self
._int
= tuple(map(int, str(abs(value
))))
557 # tuple/list conversion (possibly from as_tuple())
558 if isinstance(value
, (list,tuple)):
560 raise ValueError, 'Invalid arguments'
561 if value
[0] not in (0,1):
562 raise ValueError, 'Invalid sign'
563 for digit
in value
[1]:
564 if not isinstance(digit
, (int,long)) or digit
< 0:
565 raise ValueError, "The second value in the tuple must be composed of non negative integer elements."
567 self
._sign
= value
[0]
568 self
._int
= tuple(value
[1])
569 if value
[2] in ('F','n','N'):
571 self
._is
_special
= True
573 self
._exp
= int(value
[2])
576 if isinstance(value
, float):
577 raise TypeError("Cannot convert float to Decimal. " +
578 "First convert the float to a string")
580 # Other argument types may require the context during interpretation
582 context
= getcontext()
585 # REs insist on real strings, so we can too.
586 if isinstance(value
, basestring
):
587 if _isinfinity(value
):
590 self
._is
_special
= True
591 if _isinfinity(value
) == 1:
597 sig
, sign
, diag
= _isnan(value
)
598 self
._is
_special
= True
599 if len(diag
) > context
.prec
: #Diagnostic info too long
600 self
._sign
, self
._int
, self
._exp
= \
601 context
._raise
_error
(ConversionSyntax
)
604 self
._exp
= 'n' #qNaN
606 self
._exp
= 'N' #sNaN
608 self
._int
= tuple(map(int, diag
)) #Diagnostic info
611 self
._sign
, self
._int
, self
._exp
= _string2exact(value
)
613 self
._is
_special
= True
614 self
._sign
, self
._int
, self
._exp
= context
._raise
_error
(ConversionSyntax
)
617 raise TypeError("Cannot convert %r to Decimal" % value
)
620 """Returns whether the number is not actually one.
634 def _isinfinity(self
):
635 """Returns whether the number is infinite
637 0 if finite or not a number
647 def _check_nans(self
, other
= None, context
=None):
648 """Returns whether the number is not actually one.
650 if self, other are sNaN, signal
651 if self, other are NaN return nan
654 Done before operations.
657 self_is_nan
= self
._isnan
()
661 other_is_nan
= other
._isnan
()
663 if self_is_nan
or other_is_nan
:
665 context
= getcontext()
668 return context
._raise
_error
(InvalidOperation
, 'sNaN',
670 if other_is_nan
== 2:
671 return context
._raise
_error
(InvalidOperation
, 'sNaN',
679 def __nonzero__(self
):
680 """Is the number non-zero?
687 return sum(self
._int
) != 0
689 def __cmp__(self
, other
, context
=None):
690 other
= _convert_other(other
)
691 if other
is NotImplemented:
694 if self
._is
_special
or other
._is
_special
:
695 ans
= self
._check
_nans
(other
, context
)
697 return 1 # Comparison involving NaN's always reports self > other
700 return cmp(self
._isinfinity
(), other
._isinfinity
())
702 if not self
and not other
:
703 return 0 #If both 0, sign comparison isn't certain.
705 #If different signs, neg one is less
706 if other
._sign
< self
._sign
:
708 if self
._sign
< other
._sign
:
711 self_adjusted
= self
.adjusted()
712 other_adjusted
= other
.adjusted()
713 if self_adjusted
== other_adjusted
and \
714 self
._int
+ (0,)*(self
._exp
- other
._exp
) == \
715 other
._int
+ (0,)*(other
._exp
- self
._exp
):
716 return 0 #equal, except in precision. ([0]*(-x) = [])
717 elif self_adjusted
> other_adjusted
and self
._int
[0] != 0:
718 return (-1)**self
._sign
719 elif self_adjusted
< other_adjusted
and other
._int
[0] != 0:
720 return -((-1)**self
._sign
)
722 # Need to round, so make sure we have a valid context
724 context
= getcontext()
726 context
= context
._shallow
_copy
()
727 rounding
= context
._set
_rounding
(ROUND_UP
) #round away from 0
729 flags
= context
._ignore
_all
_flags
()
730 res
= self
.__sub
__(other
, context
=context
)
732 context
._regard
_flags
(*flags
)
734 context
.rounding
= rounding
742 def __eq__(self
, other
):
743 if not isinstance(other
, (Decimal
, int, long)):
744 return NotImplemented
745 return self
.__cmp
__(other
) == 0
747 def __ne__(self
, other
):
748 if not isinstance(other
, (Decimal
, int, long)):
749 return NotImplemented
750 return self
.__cmp
__(other
) != 0
752 def compare(self
, other
, context
=None):
753 """Compares one to another.
759 Like __cmp__, but returns Decimal instances.
761 other
= _convert_other(other
)
762 if other
is NotImplemented:
765 #compare(NaN, NaN) = NaN
766 if (self
._is
_special
or other
and other
._is
_special
):
767 ans
= self
._check
_nans
(other
, context
)
771 return Decimal(self
.__cmp
__(other
, context
))
774 """x.__hash__() <==> hash(x)"""
775 # Decimal integers must hash the same as the ints
776 # Non-integer decimals are normalized and hashed as strings
777 # Normalization assures that hash(100E-1) == hash(10)
780 raise TypeError('Cannot hash a NaN value.')
781 return hash(str(self
))
783 if self
== Decimal(i
):
785 assert self
.__nonzero
__() # '-0' handled by integer case
786 return hash(str(self
.normalize()))
789 """Represents the number as a triple tuple.
791 To show the internals exactly as they are.
793 return (self
._sign
, self
._int
, self
._exp
)
796 """Represents the number as an instance of Decimal."""
797 # Invariant: eval(repr(d)) == d
798 return 'Decimal("%s")' % str(self
)
800 def __str__(self
, eng
= 0, context
=None):
801 """Return string representation of the number in scientific notation.
803 Captures all of the information in the underlying representation.
808 minus
= '-'*self
._sign
809 if self
._int
== (0,):
812 info
= ''.join(map(str, self
._int
))
813 if self
._isnan
() == 2:
814 return minus
+ 'sNaN' + info
815 return minus
+ 'NaN' + info
816 if self
._isinfinity
():
817 minus
= '-'*self
._sign
818 return minus
+ 'Infinity'
821 context
= getcontext()
823 tmp
= map(str, self
._int
)
824 numdigits
= len(self
._int
)
825 leftdigits
= self
._exp
+ numdigits
826 if eng
and not self
: #self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY
827 if self
._exp
< 0 and self
._exp
>= -6: #short, no need for e/E
828 s
= '-'*self
._sign
+ '0.' + '0'*(abs(self
._exp
))
830 #exp is closest mult. of 3 >= self._exp
831 exp
= ((self
._exp
- 1)// 3 + 1) * 3
833 s
= '0.'+'0'*(exp
- self
._exp
)
842 s
+= '+' #0.0e+3, not 0.0e3
844 s
= '-'*self
._sign
+ s
847 dotplace
= (leftdigits
-1)%3+1
848 adjexp
= leftdigits
-1 - (leftdigits
-1)%3
850 adjexp
= leftdigits
-1
854 elif self
._exp
< 0 and adjexp
>= 0:
855 tmp
.insert(leftdigits
, '.')
856 elif self
._exp
< 0 and adjexp
>= -6:
857 tmp
[0:0] = ['0'] * int(-leftdigits
)
860 if numdigits
> dotplace
:
861 tmp
.insert(dotplace
, '.')
862 elif numdigits
< dotplace
:
863 tmp
.extend(['0']*(dotplace
-numdigits
))
865 if not context
.capitals
:
871 tmp
.append(str(adjexp
))
873 while tmp
[0:1] == ['0']:
875 if len(tmp
) == 0 or tmp
[0] == '.' or tmp
[0].lower() == 'e':
882 def to_eng_string(self
, context
=None):
883 """Convert to engineering-type string.
885 Engineering notation has an exponent which is a multiple of 3, so there
886 are up to 3 digits left of the decimal place.
888 Same rules for when in exponential and when as a value as in __str__.
890 return self
.__str
__(eng
=1, context
=context
)
892 def __neg__(self
, context
=None):
893 """Returns a copy with the sign switched.
895 Rounds, if it has reason.
898 ans
= self
._check
_nans
(context
=context
)
903 # -Decimal('0') is Decimal('0'), not Decimal('-0')
911 context
= getcontext()
912 if context
._rounding
_decision
== ALWAYS_ROUND
:
913 return Decimal((sign
, self
._int
, self
._exp
))._fix
(context
)
914 return Decimal( (sign
, self
._int
, self
._exp
))
916 def __pos__(self
, context
=None):
917 """Returns a copy, unless it is a sNaN.
919 Rounds the number (if more then precision digits)
922 ans
= self
._check
_nans
(context
=context
)
932 context
= getcontext()
934 if context
._rounding
_decision
== ALWAYS_ROUND
:
935 ans
= self
._fix
(context
)
941 def __abs__(self
, round=1, context
=None):
942 """Returns the absolute value of self.
944 If the second argument is 0, do not round.
947 ans
= self
._check
_nans
(context
=context
)
953 context
= getcontext()
954 context
= context
._shallow
_copy
()
955 context
._set
_rounding
_decision
(NEVER_ROUND
)
958 ans
= self
.__neg
__(context
=context
)
960 ans
= self
.__pos
__(context
=context
)
964 def __add__(self
, other
, context
=None):
965 """Returns self + other.
967 -INF + INF (or the reverse) cause InvalidOperation errors.
969 other
= _convert_other(other
)
970 if other
is NotImplemented:
974 context
= getcontext()
976 if self
._is
_special
or other
._is
_special
:
977 ans
= self
._check
_nans
(other
, context
)
981 if self
._isinfinity
():
982 #If both INF, same sign => same as both, opposite => error.
983 if self
._sign
!= other
._sign
and other
._isinfinity
():
984 return context
._raise
_error
(InvalidOperation
, '-INF + INF')
986 if other
._isinfinity
():
987 return Decimal(other
) #Can't both be infinity here
989 shouldround
= context
._rounding
_decision
== ALWAYS_ROUND
991 exp
= min(self
._exp
, other
._exp
)
993 if context
.rounding
== ROUND_FLOOR
and self
._sign
!= other
._sign
:
994 #If the answer is 0, the sign should be negative, in this case.
997 if not self
and not other
:
998 sign
= min(self
._sign
, other
._sign
)
1001 return Decimal( (sign
, (0,), exp
))
1003 exp
= max(exp
, other
._exp
- context
.prec
-1)
1004 ans
= other
._rescale
(exp
, watchexp
=0, context
=context
)
1006 ans
= ans
._fix
(context
)
1009 exp
= max(exp
, self
._exp
- context
.prec
-1)
1010 ans
= self
._rescale
(exp
, watchexp
=0, context
=context
)
1012 ans
= ans
._fix
(context
)
1015 op1
= _WorkRep(self
)
1016 op2
= _WorkRep(other
)
1017 op1
, op2
= _normalize(op1
, op2
, shouldround
, context
.prec
)
1020 if op1
.sign
!= op2
.sign
:
1021 # Equal and opposite
1022 if op1
.int == op2
.int:
1023 if exp
< context
.Etiny():
1024 exp
= context
.Etiny()
1025 context
._raise
_error
(Clamped
)
1026 return Decimal((negativezero
, (0,), exp
))
1027 if op1
.int < op2
.int:
1029 #OK, now abs(op1) > abs(op2)
1032 op1
.sign
, op2
.sign
= op2
.sign
, op1
.sign
1035 #So we know the sign, and op1 > 0.
1038 op1
.sign
, op2
.sign
= (0, 0)
1041 #Now, op1 > abs(op2) > 0
1044 result
.int = op1
.int + op2
.int
1046 result
.int = op1
.int - op2
.int
1048 result
.exp
= op1
.exp
1049 ans
= Decimal(result
)
1051 ans
= ans
._fix
(context
)
1056 def __sub__(self
, other
, context
=None):
1057 """Return self + (-other)"""
1058 other
= _convert_other(other
)
1059 if other
is NotImplemented:
1062 if self
._is
_special
or other
._is
_special
:
1063 ans
= self
._check
_nans
(other
, context
=context
)
1067 # -Decimal(0) = Decimal(0), which we don't want since
1068 # (-0 - 0 = -0 + (-0) = -0, but -0 + 0 = 0.)
1069 # so we change the sign directly to a copy
1070 tmp
= Decimal(other
)
1071 tmp
._sign
= 1-tmp
._sign
1073 return self
.__add
__(tmp
, context
=context
)
1075 def __rsub__(self
, other
, context
=None):
1076 """Return other + (-self)"""
1077 other
= _convert_other(other
)
1078 if other
is NotImplemented:
1082 tmp
._sign
= 1 - tmp
._sign
1083 return other
.__add
__(tmp
, context
=context
)
1085 def _increment(self
, round=1, context
=None):
1086 """Special case of add, adding 1eExponent
1088 Since it is common, (rounding, for example) this adds
1089 (sign)*one E self._exp to the number more efficiently than add.
1092 Decimal('5.624e10')._increment() == Decimal('5.625e10')
1094 if self
._is
_special
:
1095 ans
= self
._check
_nans
(context
=context
)
1099 return Decimal(self
) # Must be infinite, and incrementing makes no difference
1104 while L
[spot
] == 10:
1111 ans
= Decimal((self
._sign
, L
, self
._exp
))
1114 context
= getcontext()
1115 if round and context
._rounding
_decision
== ALWAYS_ROUND
:
1116 ans
= ans
._fix
(context
)
1119 def __mul__(self
, other
, context
=None):
1120 """Return self * other.
1122 (+-) INF * 0 (or its reverse) raise InvalidOperation.
1124 other
= _convert_other(other
)
1125 if other
is NotImplemented:
1129 context
= getcontext()
1131 resultsign
= self
._sign ^ other
._sign
1133 if self
._is
_special
or other
._is
_special
:
1134 ans
= self
._check
_nans
(other
, context
)
1138 if self
._isinfinity
():
1140 return context
._raise
_error
(InvalidOperation
, '(+-)INF * 0')
1141 return Infsign
[resultsign
]
1143 if other
._isinfinity
():
1145 return context
._raise
_error
(InvalidOperation
, '0 * (+-)INF')
1146 return Infsign
[resultsign
]
1148 resultexp
= self
._exp
+ other
._exp
1149 shouldround
= context
._rounding
_decision
== ALWAYS_ROUND
1151 # Special case for multiplying by zero
1152 if not self
or not other
:
1153 ans
= Decimal((resultsign
, (0,), resultexp
))
1155 #Fixing in case the exponent is out of bounds
1156 ans
= ans
._fix
(context
)
1159 # Special case for multiplying by power of 10
1160 if self
._int
== (1,):
1161 ans
= Decimal((resultsign
, other
._int
, resultexp
))
1163 ans
= ans
._fix
(context
)
1165 if other
._int
== (1,):
1166 ans
= Decimal((resultsign
, self
._int
, resultexp
))
1168 ans
= ans
._fix
(context
)
1171 op1
= _WorkRep(self
)
1172 op2
= _WorkRep(other
)
1174 ans
= Decimal( (resultsign
, map(int, str(op1
.int * op2
.int)), resultexp
))
1176 ans
= ans
._fix
(context
)
1181 def __div__(self
, other
, context
=None):
1182 """Return self / other."""
1183 return self
._divide
(other
, context
=context
)
1184 __truediv__
= __div__
1186 def _divide(self
, other
, divmod = 0, context
=None):
1187 """Return a / b, to context.prec precision.
1195 Actually, if divmod is 2 or 3 a tuple is returned, but errors for
1196 computing the other value are not raised.
1198 other
= _convert_other(other
)
1199 if other
is NotImplemented:
1200 if divmod in (0, 1):
1201 return NotImplemented
1202 return (NotImplemented, NotImplemented)
1205 context
= getcontext()
1207 sign
= self
._sign ^ other
._sign
1209 if self
._is
_special
or other
._is
_special
:
1210 ans
= self
._check
_nans
(other
, context
)
1216 if self
._isinfinity
() and other
._isinfinity
():
1218 return (context
._raise
_error
(InvalidOperation
,
1219 '(+-)INF // (+-)INF'),
1220 context
._raise
_error
(InvalidOperation
,
1221 '(+-)INF % (+-)INF'))
1222 return context
._raise
_error
(InvalidOperation
, '(+-)INF/(+-)INF')
1224 if self
._isinfinity
():
1226 return (Infsign
[sign
],
1227 context
._raise
_error
(InvalidOperation
, 'INF % x'))
1229 return (Infsign
[sign
], NaN
)
1231 return (Infsign
[sign
],
1232 context
._raise
_error
(InvalidOperation
, 'INF % x'))
1233 return Infsign
[sign
]
1235 if other
._isinfinity
():
1237 return (Decimal((sign
, (0,), 0)), Decimal(self
))
1238 context
._raise
_error
(Clamped
, 'Division by infinity')
1239 return Decimal((sign
, (0,), context
.Etiny()))
1241 # Special cases for zeroes
1242 if not self
and not other
:
1244 return context
._raise
_error
(DivisionUndefined
, '0 / 0', 1)
1245 return context
._raise
_error
(DivisionUndefined
, '0 / 0')
1249 otherside
= Decimal(self
)
1250 otherside
._exp
= min(self
._exp
, other
._exp
)
1251 return (Decimal((sign
, (0,), 0)), otherside
)
1252 exp
= self
._exp
- other
._exp
1253 if exp
< context
.Etiny():
1254 exp
= context
.Etiny()
1255 context
._raise
_error
(Clamped
, '0e-x / y')
1256 if exp
> context
.Emax
:
1258 context
._raise
_error
(Clamped
, '0e+x / y')
1259 return Decimal( (sign
, (0,), exp
) )
1263 return context
._raise
_error
(DivisionByZero
, 'divmod(x,0)',
1265 return context
._raise
_error
(DivisionByZero
, 'x / 0', sign
)
1267 #OK, so neither = 0, INF or NaN
1269 shouldround
= context
._rounding
_decision
== ALWAYS_ROUND
1271 #If we're dividing into ints, and self < other, stop.
1272 #self.__abs__(0) does not round.
1273 if divmod and (self
.__abs
__(0, context
) < other
.__abs
__(0, context
)):
1275 if divmod == 1 or divmod == 3:
1276 exp
= min(self
._exp
, other
._exp
)
1277 ans2
= self
._rescale
(exp
, context
=context
, watchexp
=0)
1279 ans2
= ans2
._fix(context
)
1280 return (Decimal( (sign
, (0,), 0) ),
1284 #Don't round the mod part, if we don't need it.
1285 return (Decimal( (sign
, (0,), 0) ), Decimal(self
))
1287 op1
= _WorkRep(self
)
1288 op2
= _WorkRep(other
)
1289 op1
, op2
, adjust
= _adjust_coefficients(op1
, op2
)
1290 res
= _WorkRep( (sign
, 0, (op1
.exp
- op2
.exp
)) )
1291 if divmod and res
.exp
> context
.prec
+ 1:
1292 return context
._raise
_error
(DivisionImpossible
)
1294 prec_limit
= 10 ** context
.prec
1296 while op2
.int <= op1
.int:
1299 if res
.exp
== 0 and divmod:
1300 if res
.int >= prec_limit
and shouldround
:
1301 return context
._raise
_error
(DivisionImpossible
)
1302 otherside
= Decimal(op1
)
1303 frozen
= context
._ignore
_all
_flags
()
1305 exp
= min(self
._exp
, other
._exp
)
1306 otherside
= otherside
._rescale
(exp
, context
=context
, watchexp
=0)
1307 context
._regard
_flags
(*frozen
)
1309 otherside
= otherside
._fix
(context
)
1310 return (Decimal(res
), otherside
)
1312 if op1
.int == 0 and adjust
>= 0 and not divmod:
1314 if res
.int >= prec_limit
and shouldround
:
1316 return context
._raise
_error
(DivisionImpossible
)
1318 # Really, the answer is a bit higher, so adding a one to
1319 # the end will make sure the rounding is right.
1332 if res
.exp
== 0 and divmod and op2
.int > op1
.int:
1333 #Solves an error in precision. Same as a previous block.
1335 if res
.int >= prec_limit
and shouldround
:
1336 return context
._raise
_error
(DivisionImpossible
)
1337 otherside
= Decimal(op1
)
1338 frozen
= context
._ignore
_all
_flags
()
1340 exp
= min(self
._exp
, other
._exp
)
1341 otherside
= otherside
._rescale
(exp
, context
=context
)
1343 context
._regard
_flags
(*frozen
)
1345 return (Decimal(res
), otherside
)
1349 ans
= ans
._fix
(context
)
1352 def __rdiv__(self
, other
, context
=None):
1353 """Swaps self/other and returns __div__."""
1354 other
= _convert_other(other
)
1355 if other
is NotImplemented:
1357 return other
.__div
__(self
, context
=context
)
1358 __rtruediv__
= __rdiv__
1360 def __divmod__(self
, other
, context
=None):
1362 (self // other, self % other)
1364 return self
._divide
(other
, 1, context
)
1366 def __rdivmod__(self
, other
, context
=None):
1367 """Swaps self/other and returns __divmod__."""
1368 other
= _convert_other(other
)
1369 if other
is NotImplemented:
1371 return other
.__divmod
__(self
, context
=context
)
1373 def __mod__(self
, other
, context
=None):
1377 other
= _convert_other(other
)
1378 if other
is NotImplemented:
1381 if self
._is
_special
or other
._is
_special
:
1382 ans
= self
._check
_nans
(other
, context
)
1386 if self
and not other
:
1387 return context
._raise
_error
(InvalidOperation
, 'x % 0')
1389 return self
._divide
(other
, 3, context
)[1]
1391 def __rmod__(self
, other
, context
=None):
1392 """Swaps self/other and returns __mod__."""
1393 other
= _convert_other(other
)
1394 if other
is NotImplemented:
1396 return other
.__mod
__(self
, context
=context
)
1398 def remainder_near(self
, other
, context
=None):
1400 Remainder nearest to 0- abs(remainder-near) <= other/2
1402 other
= _convert_other(other
)
1403 if other
is NotImplemented:
1406 if self
._is
_special
or other
._is
_special
:
1407 ans
= self
._check
_nans
(other
, context
)
1410 if self
and not other
:
1411 return context
._raise
_error
(InvalidOperation
, 'x % 0')
1414 context
= getcontext()
1415 # If DivisionImpossible causes an error, do not leave Rounded/Inexact
1416 # ignored in the calling function.
1417 context
= context
._shallow
_copy
()
1418 flags
= context
._ignore
_flags
(Rounded
, Inexact
)
1419 #keep DivisionImpossible flags
1420 (side
, r
) = self
.__divmod
__(other
, context
=context
)
1423 context
._regard
_flags
(*flags
)
1426 context
= context
._shallow
_copy
()
1427 rounding
= context
._set
_rounding
_decision
(NEVER_ROUND
)
1430 comparison
= other
.__div
__(Decimal(-2), context
=context
)
1432 comparison
= other
.__div
__(Decimal(2), context
=context
)
1434 context
._set
_rounding
_decision
(rounding
)
1435 context
._regard
_flags
(*flags
)
1437 s1
, s2
= r
._sign
, comparison
._sign
1438 r
._sign
, comparison
._sign
= 0, 0
1441 r
._sign
, comparison
._sign
= s1
, s2
1443 self
.__divmod
__(other
, context
=context
)
1444 return r
._fix
(context
)
1445 r
._sign
, comparison
._sign
= s1
, s2
1447 rounding
= context
._set
_rounding
_decision
(NEVER_ROUND
)
1449 (side
, r
) = self
.__divmod
__(other
, context
=context
)
1450 context
._set
_rounding
_decision
(rounding
)
1454 decrease
= not side
._iseven
()
1455 rounding
= context
._set
_rounding
_decision
(NEVER_ROUND
)
1456 side
= side
.__abs
__(context
=context
)
1457 context
._set
_rounding
_decision
(rounding
)
1459 s1
, s2
= r
._sign
, comparison
._sign
1460 r
._sign
, comparison
._sign
= 0, 0
1461 if r
> comparison
or decrease
and r
== comparison
:
1462 r
._sign
, comparison
._sign
= s1
, s2
1464 if len(side
.__add
__(Decimal(1), context
=context
)._int
) >= context
.prec
:
1466 return context
._raise
_error
(DivisionImpossible
)[1]
1468 if self
._sign
== other
._sign
:
1469 r
= r
.__sub
__(other
, context
=context
)
1471 r
= r
.__add
__(other
, context
=context
)
1473 r
._sign
, comparison
._sign
= s1
, s2
1475 return r
._fix
(context
)
1477 def __floordiv__(self
, other
, context
=None):
1479 return self
._divide
(other
, 2, context
)[0]
1481 def __rfloordiv__(self
, other
, context
=None):
1482 """Swaps self/other and returns __floordiv__."""
1483 other
= _convert_other(other
)
1484 if other
is NotImplemented:
1486 return other
.__floordiv
__(self
, context
=context
)
1488 def __float__(self
):
1489 """Float representation."""
1490 return float(str(self
))
1493 """Converts self to an int, truncating if necessary."""
1494 if self
._is
_special
:
1496 context
= getcontext()
1497 return context
._raise
_error
(InvalidContext
)
1498 elif self
._isinfinity
():
1499 raise OverflowError, "Cannot convert infinity to long"
1501 s
= ''.join(map(str, self
._int
)) + '0'*self
._exp
1503 s
= ''.join(map(str, self
._int
))[:self
._exp
]
1506 sign
= '-'*self
._sign
1507 return int(sign
+ s
)
1510 """Converts to a long.
1512 Equivalent to long(int(self))
1514 return long(self
.__int
__())
1516 def _fix(self
, context
):
1517 """Round if it is necessary to keep self within prec precision.
1519 Rounds and fixes the exponent. Does not raise on a sNaN.
1522 self - Decimal instance
1523 context - context used.
1525 if self
._is
_special
:
1528 context
= getcontext()
1530 ans
= self
._fixexponents
(context
)
1531 if len(ans
._int
) > prec
:
1532 ans
= ans
._round
(prec
, context
=context
)
1533 ans
= ans
._fixexponents
(context
)
1536 def _fixexponents(self
, context
):
1537 """Fix the exponents and return a copy with the exponent in bounds.
1538 Only call if known to not be a special value.
1540 folddown
= context
._clamp
1543 ans_adjusted
= ans
.adjusted()
1544 if ans_adjusted
< Emin
:
1545 Etiny
= context
.Etiny()
1546 if ans
._exp
< Etiny
:
1550 context
._raise
_error
(Clamped
)
1552 ans
= ans
._rescale
(Etiny
, context
=context
)
1553 #It isn't zero, and exp < Emin => subnormal
1554 context
._raise
_error
(Subnormal
)
1555 if context
.flags
[Inexact
]:
1556 context
._raise
_error
(Underflow
)
1559 #Only raise subnormal if non-zero.
1560 context
._raise
_error
(Subnormal
)
1562 Etop
= context
.Etop()
1563 if folddown
and ans
._exp
> Etop
:
1564 context
._raise
_error
(Clamped
)
1565 ans
= ans
._rescale
(Etop
, context
=context
)
1568 if ans_adjusted
> Emax
:
1572 context
._raise
_error
(Clamped
)
1574 context
._raise
_error
(Inexact
)
1575 context
._raise
_error
(Rounded
)
1576 return context
._raise
_error
(Overflow
, 'above Emax', ans
._sign
)
1579 def _round(self
, prec
=None, rounding
=None, context
=None):
1580 """Returns a rounded version of self.
1582 You can specify the precision or rounding method. Otherwise, the
1583 context determines it.
1586 if self
._is
_special
:
1587 ans
= self
._check
_nans
(context
=context
)
1591 if self
._isinfinity
():
1592 return Decimal(self
)
1595 context
= getcontext()
1597 if rounding
is None:
1598 rounding
= context
.rounding
1605 exp
= len(self
._int
) - prec
+ self
._exp
1608 exp
= len(self
._int
) + self
._exp
- prec
1609 ans
= Decimal((self
._sign
, dig
, exp
))
1610 context
._raise
_error
(Rounded
)
1614 temp
= Decimal(self
)
1615 temp
._int
= (0,)+temp
._int
1618 exp
= self
._exp
+ len(self
._int
) - prec
- 1
1619 temp
= Decimal( (self
._sign
, (0, 1), exp
))
1622 temp
= Decimal(self
)
1624 numdigits
= len(temp
._int
)
1625 if prec
== numdigits
:
1628 # See if we need to extend precision
1629 expdiff
= prec
- numdigits
1631 tmp
= list(temp
._int
)
1632 tmp
.extend([0] * expdiff
)
1633 ans
= Decimal( (temp
._sign
, tmp
, temp
._exp
- expdiff
))
1636 #OK, but maybe all the lost digits are 0.
1637 lostdigits
= self
._int
[expdiff
:]
1638 if lostdigits
== (0,) * len(lostdigits
):
1639 ans
= Decimal( (temp
._sign
, temp
._int
[:prec
], temp
._exp
- expdiff
))
1640 #Rounded, but not Inexact
1641 context
._raise
_error
(Rounded
)
1644 # Okay, let's round and lose data
1646 this_function
= getattr(temp
, self
._pick
_rounding
_function
[rounding
])
1647 #Now we've got the rounding function
1649 if prec
!= context
.prec
:
1650 context
= context
._shallow
_copy
()
1652 ans
= this_function(prec
, expdiff
, context
)
1653 context
._raise
_error
(Rounded
)
1654 context
._raise
_error
(Inexact
, 'Changed in rounding')
1658 _pick_rounding_function
= {}
1660 def _round_down(self
, prec
, expdiff
, context
):
1661 """Also known as round-towards-0, truncate."""
1662 return Decimal( (self
._sign
, self
._int
[:prec
], self
._exp
- expdiff
) )
1664 def _round_half_up(self
, prec
, expdiff
, context
, tmp
= None):
1665 """Rounds 5 up (away from 0)"""
1668 tmp
= Decimal( (self
._sign
,self
._int
[:prec
], self
._exp
- expdiff
))
1669 if self
._int
[prec
] >= 5:
1670 tmp
= tmp
._increment
(round=0, context
=context
)
1671 if len(tmp
._int
) > prec
:
1672 return Decimal( (tmp
._sign
, tmp
._int
[:-1], tmp
._exp
+ 1))
1675 def _round_half_even(self
, prec
, expdiff
, context
):
1676 """Round 5 to even, rest to nearest."""
1678 tmp
= Decimal( (self
._sign
, self
._int
[:prec
], self
._exp
- expdiff
))
1679 half
= (self
._int
[prec
] == 5)
1681 for digit
in self
._int
[prec
+1:]:
1686 if self
._int
[prec
-1] & 1 == 0:
1688 return self
._round
_half
_up
(prec
, expdiff
, context
, tmp
)
1690 def _round_half_down(self
, prec
, expdiff
, context
):
1693 tmp
= Decimal( (self
._sign
, self
._int
[:prec
], self
._exp
- expdiff
))
1694 half
= (self
._int
[prec
] == 5)
1696 for digit
in self
._int
[prec
+1:]:
1702 return self
._round
_half
_up
(prec
, expdiff
, context
, tmp
)
1704 def _round_up(self
, prec
, expdiff
, context
):
1705 """Rounds away from 0."""
1706 tmp
= Decimal( (self
._sign
, self
._int
[:prec
], self
._exp
- expdiff
) )
1707 for digit
in self
._int
[prec
:]:
1709 tmp
= tmp
._increment
(round=1, context
=context
)
1710 if len(tmp
._int
) > prec
:
1711 return Decimal( (tmp
._sign
, tmp
._int
[:-1], tmp
._exp
+ 1))
1716 def _round_ceiling(self
, prec
, expdiff
, context
):
1717 """Rounds up (not away from 0 if negative.)"""
1719 return self
._round
_down
(prec
, expdiff
, context
)
1721 return self
._round
_up
(prec
, expdiff
, context
)
1723 def _round_floor(self
, prec
, expdiff
, context
):
1724 """Rounds down (not towards 0 if negative)"""
1726 return self
._round
_down
(prec
, expdiff
, context
)
1728 return self
._round
_up
(prec
, expdiff
, context
)
1730 def __pow__(self
, n
, modulo
= None, context
=None):
1731 """Return self ** n (mod modulo)
1733 If modulo is None (default), don't take it mod modulo.
1735 n
= _convert_other(n
)
1736 if n
is NotImplemented:
1740 context
= getcontext()
1742 if self
._is
_special
or n
._is
_special
or n
.adjusted() > 8:
1743 #Because the spot << doesn't work with really big exponents
1744 if n
._isinfinity
() or n
.adjusted() > 8:
1745 return context
._raise
_error
(InvalidOperation
, 'x ** INF')
1747 ans
= self
._check
_nans
(n
, context
)
1751 if not n
._isinteger
():
1752 return context
._raise
_error
(InvalidOperation
, 'x ** (non-integer)')
1754 if not self
and not n
:
1755 return context
._raise
_error
(InvalidOperation
, '0 ** 0')
1760 if self
== Decimal(1):
1763 sign
= self
._sign
and not n
._iseven
()
1766 if self
._isinfinity
():
1768 return context
._raise
_error
(InvalidOperation
, 'INF % x')
1770 return Infsign
[sign
]
1771 return Decimal( (sign
, (0,), 0) )
1773 #with ludicrously large exponent, just raise an overflow and return inf.
1774 if not modulo
and n
> 0 and (self
._exp
+ len(self
._int
) - 1) * n
> context
.Emax \
1777 tmp
= Decimal('inf')
1779 context
._raise
_error
(Rounded
)
1780 context
._raise
_error
(Inexact
)
1781 context
._raise
_error
(Overflow
, 'Big power', sign
)
1784 elength
= len(str(abs(n
)))
1785 firstprec
= context
.prec
1787 if not modulo
and firstprec
+ elength
+ 1 > DefaultContext
.Emax
:
1788 return context
._raise
_error
(Overflow
, 'Too much precision.', sign
)
1792 context
= context
._shallow
_copy
()
1793 context
.prec
= firstprec
+ elength
+ 1
1795 #n is a long now, not Decimal instance
1797 mul
= Decimal(1).__div
__(mul
, context
=context
)
1804 #Spot is the highest power of 2 less than n
1806 val
= val
.__mul
__(val
, context
=context
)
1807 if val
._isinfinity
():
1811 val
= val
.__mul
__(mul
, context
=context
)
1812 if modulo
is not None:
1813 val
= val
.__mod
__(modulo
, context
=context
)
1815 context
.prec
= firstprec
1817 if context
._rounding
_decision
== ALWAYS_ROUND
:
1818 return val
._fix
(context
)
1821 def __rpow__(self
, other
, context
=None):
1822 """Swaps self/other and returns __pow__."""
1823 other
= _convert_other(other
)
1824 if other
is NotImplemented:
1826 return other
.__pow
__(self
, context
=context
)
1828 def normalize(self
, context
=None):
1829 """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
1831 if self
._is
_special
:
1832 ans
= self
._check
_nans
(context
=context
)
1836 dup
= self
._fix
(context
)
1837 if dup
._isinfinity
():
1841 return Decimal( (dup
._sign
, (0,), 0) )
1844 while dup
._int
[end
-1] == 0:
1847 return Decimal( (dup
._sign
, dup
._int
[:end
], exp
) )
1850 def quantize(self
, exp
, rounding
=None, context
=None, watchexp
=1):
1851 """Quantize self so its exponent is the same as that of exp.
1853 Similar to self._rescale(exp._exp) but with error checking.
1855 if self
._is
_special
or exp
._is
_special
:
1856 ans
= self
._check
_nans
(exp
, context
)
1860 if exp
._isinfinity
() or self
._isinfinity
():
1861 if exp
._isinfinity
() and self
._isinfinity
():
1862 return self
#if both are inf, it is OK
1864 context
= getcontext()
1865 return context
._raise
_error
(InvalidOperation
,
1866 'quantize with one INF')
1867 return self
._rescale
(exp
._exp
, rounding
, context
, watchexp
)
1869 def same_quantum(self
, other
):
1870 """Test whether self and other have the same exponent.
1872 same as self._exp == other._exp, except NaN == sNaN
1874 if self
._is
_special
or other
._is
_special
:
1875 if self
._isnan
() or other
._isnan
():
1876 return self
._isnan
() and other
._isnan
() and True
1877 if self
._isinfinity
() or other
._isinfinity
():
1878 return self
._isinfinity
() and other
._isinfinity
() and True
1879 return self
._exp
== other
._exp
1881 def _rescale(self
, exp
, rounding
=None, context
=None, watchexp
=1):
1882 """Rescales so that the exponent is exp.
1884 exp = exp to scale to (an integer)
1885 rounding = rounding version
1886 watchexp: if set (default) an error is returned if exp is greater
1887 than Emax or less than Etiny.
1890 context
= getcontext()
1892 if self
._is
_special
:
1893 if self
._isinfinity
():
1894 return context
._raise
_error
(InvalidOperation
, 'rescale with an INF')
1896 ans
= self
._check
_nans
(context
=context
)
1900 if watchexp
and (context
.Emax
< exp
or context
.Etiny() > exp
):
1901 return context
._raise
_error
(InvalidOperation
, 'rescale(a, INF)')
1909 diff
= self
._exp
- exp
1910 digits
= len(self
._int
) + diff
1912 if watchexp
and digits
> context
.prec
:
1913 return context
._raise
_error
(InvalidOperation
, 'Rescale > prec')
1916 tmp
._int
= (0,) + tmp
._int
1920 tmp
._exp
= -digits
+ tmp
._exp
1923 tmp
= tmp
._round
(digits
, rounding
, context
=context
)
1925 if tmp
._int
[0] == 0 and len(tmp
._int
) > 1:
1926 tmp
._int
= tmp
._int
[1:]
1929 tmp_adjusted
= tmp
.adjusted()
1930 if tmp
and tmp_adjusted
< context
.Emin
:
1931 context
._raise
_error
(Subnormal
)
1932 elif tmp
and tmp_adjusted
> context
.Emax
:
1933 return context
._raise
_error
(InvalidOperation
, 'rescale(a, INF)')
1936 def to_integral(self
, rounding
=None, context
=None):
1937 """Rounds to the nearest integer, without raising inexact, rounded."""
1938 if self
._is
_special
:
1939 ans
= self
._check
_nans
(context
=context
)
1945 context
= getcontext()
1946 flags
= context
._ignore
_flags
(Rounded
, Inexact
)
1947 ans
= self
._rescale
(0, rounding
, context
=context
)
1948 context
._regard
_flags
(flags
)
1951 def sqrt(self
, context
=None):
1952 """Return the square root of self.
1954 Uses a converging algorithm (Xn+1 = 0.5*(Xn + self / Xn))
1955 Should quadratically approach the right answer.
1957 if self
._is
_special
:
1958 ans
= self
._check
_nans
(context
=context
)
1962 if self
._isinfinity
() and self
._sign
== 0:
1963 return Decimal(self
)
1966 #exponent = self._exp / 2, using round_down.
1968 # exp = (self._exp+1) // 2
1970 exp
= (self
._exp
) // 2
1973 return Decimal( (1, (0,), exp
))
1975 return Decimal( (0, (0,), exp
))
1978 context
= getcontext()
1981 return context
._raise
_error
(InvalidOperation
, 'sqrt(-x), x > 0')
1985 expadd
= tmp
._exp
// 2
1992 context
= context
._shallow
_copy
()
1993 flags
= context
._ignore
_all
_flags
()
1994 firstprec
= context
.prec
1996 if tmp
.adjusted() & 1 == 0:
1997 ans
= Decimal( (0, (8,1,9), tmp
.adjusted() - 2) )
1998 ans
= ans
.__add
__(tmp
.__mul
__(Decimal((0, (2,5,9), -2)),
1999 context
=context
), context
=context
)
2000 ans
._exp
-= 1 + tmp
.adjusted() // 2
2002 ans
= Decimal( (0, (2,5,9), tmp
._exp
+ len(tmp
._int
)- 3) )
2003 ans
= ans
.__add
__(tmp
.__mul
__(Decimal((0, (8,1,9), -3)),
2004 context
=context
), context
=context
)
2005 ans
._exp
-= 1 + tmp
.adjusted() // 2
2007 #ans is now a linear approximation.
2009 Emax
, Emin
= context
.Emax
, context
.Emin
2010 context
.Emax
, context
.Emin
= DefaultContext
.Emax
, DefaultContext
.Emin
2012 half
= Decimal('0.5')
2014 maxp
= firstprec
+ 2
2015 rounding
= context
._set
_rounding
(ROUND_HALF_EVEN
)
2017 context
.prec
= min(2*context
.prec
- 2, maxp
)
2018 ans
= half
.__mul
__(ans
.__add
__(tmp
.__div
__(ans
, context
=context
),
2019 context
=context
), context
=context
)
2020 if context
.prec
== maxp
:
2023 #round to the answer's precision-- the only error can be 1 ulp.
2024 context
.prec
= firstprec
2025 prevexp
= ans
.adjusted()
2026 ans
= ans
._round
(context
=context
)
2028 #Now, check if the other last digits are better.
2029 context
.prec
= firstprec
+ 1
2030 # In case we rounded up another digit and we should actually go lower.
2031 if prevexp
!= ans
.adjusted():
2036 lower
= ans
.__sub
__(Decimal((0, (5,), ans
._exp
-1)), context
=context
)
2037 context
._set
_rounding
(ROUND_UP
)
2038 if lower
.__mul
__(lower
, context
=context
) > (tmp
):
2039 ans
= ans
.__sub
__(Decimal((0, (1,), ans
._exp
)), context
=context
)
2042 upper
= ans
.__add
__(Decimal((0, (5,), ans
._exp
-1)),context
=context
)
2043 context
._set
_rounding
(ROUND_DOWN
)
2044 if upper
.__mul
__(upper
, context
=context
) < tmp
:
2045 ans
= ans
.__add
__(Decimal((0, (1,), ans
._exp
)),context
=context
)
2049 context
.prec
= firstprec
2050 context
.rounding
= rounding
2051 ans
= ans
._fix
(context
)
2053 rounding
= context
._set
_rounding
_decision
(NEVER_ROUND
)
2054 if not ans
.__mul
__(ans
, context
=context
) == self
:
2055 # Only rounded/inexact if here.
2056 context
._regard
_flags
(flags
)
2057 context
._raise
_error
(Rounded
)
2058 context
._raise
_error
(Inexact
)
2060 #Exact answer, so let's set the exponent right.
2062 # exp = (self._exp +1)// 2
2064 exp
= self
._exp
// 2
2065 context
.prec
+= ans
._exp
- exp
2066 ans
= ans
._rescale
(exp
, context
=context
)
2067 context
.prec
= firstprec
2068 context
._regard
_flags
(flags
)
2069 context
.Emax
, context
.Emin
= Emax
, Emin
2071 return ans
._fix
(context
)
2073 def max(self
, other
, context
=None):
2074 """Returns the larger value.
2076 like max(self, other) except if one is not a number, returns
2077 NaN (and signals if one is sNaN). Also rounds.
2079 other
= _convert_other(other
)
2080 if other
is NotImplemented:
2083 if self
._is
_special
or other
._is
_special
:
2084 # if one operand is a quiet NaN and the other is number, then the
2085 # number is always returned
2089 if on
== 1 and sn
!= 2:
2091 if sn
== 1 and on
!= 2:
2093 return self
._check
_nans
(other
, context
)
2096 c
= self
.__cmp
__(other
)
2098 # if both operands are finite and equal in numerical value
2099 # then an ordering is applied:
2101 # if the signs differ then max returns the operand with the
2102 # positive sign and min returns the operand with the negative sign
2104 # if the signs are the same then the exponent is used to select
2106 if self
._sign
!= other
._sign
:
2109 elif self
._exp
< other
._exp
and not self
._sign
:
2111 elif self
._exp
> other
._exp
and self
._sign
:
2117 context
= getcontext()
2118 if context
._rounding
_decision
== ALWAYS_ROUND
:
2119 return ans
._fix
(context
)
2122 def min(self
, other
, context
=None):
2123 """Returns the smaller value.
2125 like min(self, other) except if one is not a number, returns
2126 NaN (and signals if one is sNaN). Also rounds.
2128 other
= _convert_other(other
)
2129 if other
is NotImplemented:
2132 if self
._is
_special
or other
._is
_special
:
2133 # if one operand is a quiet NaN and the other is number, then the
2134 # number is always returned
2138 if on
== 1 and sn
!= 2:
2140 if sn
== 1 and on
!= 2:
2142 return self
._check
_nans
(other
, context
)
2145 c
= self
.__cmp
__(other
)
2147 # if both operands are finite and equal in numerical value
2148 # then an ordering is applied:
2150 # if the signs differ then max returns the operand with the
2151 # positive sign and min returns the operand with the negative sign
2153 # if the signs are the same then the exponent is used to select
2155 if self
._sign
!= other
._sign
:
2158 elif self
._exp
> other
._exp
and not self
._sign
:
2160 elif self
._exp
< other
._exp
and self
._sign
:
2166 context
= getcontext()
2167 if context
._rounding
_decision
== ALWAYS_ROUND
:
2168 return ans
._fix
(context
)
2171 def _isinteger(self
):
2172 """Returns whether self is an integer"""
2175 rest
= self
._int
[self
._exp
:]
2176 return rest
== (0,)*len(rest
)
2179 """Returns 1 if self is even. Assumes self is an integer."""
2182 return self
._int
[-1+self
._exp
] & 1 == 0
2185 """Return the adjusted exponent of self"""
2187 return self
._exp
+ len(self
._int
) - 1
2188 #If NaN or Infinity, self._exp is string
2192 # support for pickling, copy, and deepcopy
2193 def __reduce__(self
):
2194 return (self
.__class
__, (str(self
),))
2197 if type(self
) == Decimal
:
2198 return self
# I'm immutable; therefore I am my own clone
2199 return self
.__class
__(str(self
))
2201 def __deepcopy__(self
, memo
):
2202 if type(self
) == Decimal
:
2203 return self
# My components are also immutable
2204 return self
.__class
__(str(self
))
2206 ##### Context class ###########################################
2209 # get rounding method function:
2210 rounding_functions
= [name
for name
in Decimal
.__dict
__.keys() if name
.startswith('_round_')]
2211 for name
in rounding_functions
:
2212 #name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
2213 globalname
= name
[1:].upper()
2214 val
= globals()[globalname
]
2215 Decimal
._pick
_rounding
_function
[val
] = name
2217 del name
, val
, globalname
, rounding_functions
2219 class _ContextManager(object):
2220 """Context manager class to support localcontext().
2222 Sets a copy of the supplied context in __enter__() and restores
2223 the previous decimal context in __exit__()
2225 def __init__(self
, new_context
):
2226 self
.new_context
= new_context
.copy()
2227 def __enter__(self
):
2228 self
.saved_context
= getcontext()
2229 setcontext(self
.new_context
)
2230 return self
.new_context
2231 def __exit__(self
, t
, v
, tb
):
2232 setcontext(self
.saved_context
)
2234 class Context(object):
2235 """Contains the context for a Decimal instance.
2238 prec - precision (for use in rounding, division, square roots..)
2239 rounding - rounding type. (how you round)
2240 _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round?
2241 traps - If traps[exception] = 1, then the exception is
2242 raised when it is caused. Otherwise, a value is
2244 flags - When an exception is caused, flags[exception] is incremented.
2245 (Whether or not the trap_enabler is set)
2246 Should be reset by user of Decimal instance.
2247 Emin - Minimum exponent
2248 Emax - Maximum exponent
2249 capitals - If 1, 1*10^1 is printed as 1E+1.
2250 If 0, printed as 1e1
2251 _clamp - If 1, change exponents if too high (Default 0)
2254 def __init__(self
, prec
=None, rounding
=None,
2255 traps
=None, flags
=None,
2256 _rounding_decision
=None,
2257 Emin
=None, Emax
=None,
2258 capitals
=None, _clamp
=0,
2259 _ignored_flags
=None):
2262 if _ignored_flags
is None:
2264 if not isinstance(flags
, dict):
2265 flags
= dict([(s
,s
in flags
) for s
in _signals
])
2267 if traps
is not None and not isinstance(traps
, dict):
2268 traps
= dict([(s
,s
in traps
) for s
in _signals
])
2270 for name
, val
in locals().items():
2272 setattr(self
, name
, _copy
.copy(getattr(DefaultContext
, name
)))
2274 setattr(self
, name
, val
)
2278 """Show the current context."""
2280 s
.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' % vars(self
))
2281 s
.append('flags=[' + ', '.join([f
.__name
__ for f
, v
in self
.flags
.items() if v
]) + ']')
2282 s
.append('traps=[' + ', '.join([t
.__name
__ for t
, v
in self
.traps
.items() if v
]) + ']')
2283 return ', '.join(s
) + ')'
2285 def clear_flags(self
):
2286 """Reset all flags to zero"""
2287 for flag
in self
.flags
:
2288 self
.flags
[flag
] = 0
2290 def _shallow_copy(self
):
2291 """Returns a shallow copy from self."""
2292 nc
= Context(self
.prec
, self
.rounding
, self
.traps
, self
.flags
,
2293 self
._rounding
_decision
, self
.Emin
, self
.Emax
,
2294 self
.capitals
, self
._clamp
, self
._ignored
_flags
)
2298 """Returns a deep copy from self."""
2299 nc
= Context(self
.prec
, self
.rounding
, self
.traps
.copy(), self
.flags
.copy(),
2300 self
._rounding
_decision
, self
.Emin
, self
.Emax
,
2301 self
.capitals
, self
._clamp
, self
._ignored
_flags
)
2305 def _raise_error(self
, condition
, explanation
= None, *args
):
2308 If the flag is in _ignored_flags, returns the default response.
2309 Otherwise, it increments the flag, then, if the corresponding
2310 trap_enabler is set, it reaises the exception. Otherwise, it returns
2311 the default value after incrementing the flag.
2313 error
= _condition_map
.get(condition
, condition
)
2314 if error
in self
._ignored
_flags
:
2315 #Don't touch the flag
2316 return error().handle(self
, *args
)
2318 self
.flags
[error
] += 1
2319 if not self
.traps
[error
]:
2320 #The errors define how to handle themselves.
2321 return condition().handle(self
, *args
)
2323 # Errors should only be risked on copies of the context
2324 #self._ignored_flags = []
2325 raise error
, explanation
2327 def _ignore_all_flags(self
):
2328 """Ignore all flags, if they are raised"""
2329 return self
._ignore
_flags
(*_signals
)
2331 def _ignore_flags(self
, *flags
):
2332 """Ignore the flags, if they are raised"""
2333 # Do not mutate-- This way, copies of a context leave the original
2335 self
._ignored
_flags
= (self
._ignored
_flags
+ list(flags
))
2338 def _regard_flags(self
, *flags
):
2339 """Stop ignoring the flags, if they are raised"""
2340 if flags
and isinstance(flags
[0], (tuple,list)):
2343 self
._ignored
_flags
.remove(flag
)
2346 """A Context cannot be hashed."""
2347 # We inherit object.__hash__, so we must deny this explicitly
2348 raise TypeError, "Cannot hash a Context."
2351 """Returns Etiny (= Emin - prec + 1)"""
2352 return int(self
.Emin
- self
.prec
+ 1)
2355 """Returns maximum exponent (= Emax - prec + 1)"""
2356 return int(self
.Emax
- self
.prec
+ 1)
2358 def _set_rounding_decision(self
, type):
2359 """Sets the rounding decision.
2361 Sets the rounding decision, and returns the current (previous)
2362 rounding decision. Often used like:
2364 context = context._shallow_copy()
2365 # That so you don't change the calling context
2366 # if an error occurs in the middle (say DivisionImpossible is raised).
2368 rounding = context._set_rounding_decision(NEVER_ROUND)
2369 instance = instance / Decimal(2)
2370 context._set_rounding_decision(rounding)
2372 This will make it not round for that operation.
2375 rounding
= self
._rounding
_decision
2376 self
._rounding
_decision
= type
2379 def _set_rounding(self
, type):
2380 """Sets the rounding type.
2382 Sets the rounding type, and returns the current (previous)
2383 rounding type. Often used like:
2385 context = context.copy()
2386 # so you don't change the calling context
2387 # if an error occurs in the middle.
2388 rounding = context._set_rounding(ROUND_UP)
2389 val = self.__sub__(other, context=context)
2390 context._set_rounding(rounding)
2392 This will make it round up for that operation.
2394 rounding
= self
.rounding
2398 def create_decimal(self
, num
='0'):
2399 """Creates a new Decimal instance but using self as context."""
2400 d
= Decimal(num
, context
=self
)
2405 """Returns the absolute value of the operand.
2407 If the operand is negative, the result is the same as using the minus
2408 operation on the operand. Otherwise, the result is the same as using
2409 the plus operation on the operand.
2411 >>> ExtendedContext.abs(Decimal('2.1'))
2413 >>> ExtendedContext.abs(Decimal('-100'))
2415 >>> ExtendedContext.abs(Decimal('101.5'))
2417 >>> ExtendedContext.abs(Decimal('-101.5'))
2420 return a
.__abs
__(context
=self
)
2422 def add(self
, a
, b
):
2423 """Return the sum of the two operands.
2425 >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
2427 >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
2430 return a
.__add
__(b
, context
=self
)
2432 def _apply(self
, a
):
2433 return str(a
._fix
(self
))
2435 def compare(self
, a
, b
):
2436 """Compares values numerically.
2438 If the signs of the operands differ, a value representing each operand
2439 ('-1' if the operand is less than zero, '0' if the operand is zero or
2440 negative zero, or '1' if the operand is greater than zero) is used in
2441 place of that operand for the comparison instead of the actual
2444 The comparison is then effected by subtracting the second operand from
2445 the first and then returning a value according to the result of the
2446 subtraction: '-1' if the result is less than zero, '0' if the result is
2447 zero or negative zero, or '1' if the result is greater than zero.
2449 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
2451 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
2453 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
2455 >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
2457 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
2459 >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
2462 return a
.compare(b
, context
=self
)
2464 def divide(self
, a
, b
):
2465 """Decimal division in a specified context.
2467 >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
2468 Decimal("0.333333333")
2469 >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
2470 Decimal("0.666666667")
2471 >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
2473 >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
2475 >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
2477 >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
2479 >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
2481 >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
2483 >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
2485 >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
2488 return a
.__div
__(b
, context
=self
)
2490 def divide_int(self
, a
, b
):
2491 """Divides two numbers and returns the integer part of the result.
2493 >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
2495 >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
2497 >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
2500 return a
.__floordiv
__(b
, context
=self
)
2502 def divmod(self
, a
, b
):
2503 return a
.__divmod
__(b
, context
=self
)
2506 """max compares two values numerically and returns the maximum.
2508 If either operand is a NaN then the general rules apply.
2509 Otherwise, the operands are compared as as though by the compare
2510 operation. If they are numerically equal then the left-hand operand
2511 is chosen as the result. Otherwise the maximum (closer to positive
2512 infinity) of the two operands is chosen as the result.
2514 >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
2516 >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
2518 >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
2520 >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
2523 return a
.max(b
, context
=self
)
2526 """min compares two values numerically and returns the minimum.
2528 If either operand is a NaN then the general rules apply.
2529 Otherwise, the operands are compared as as though by the compare
2530 operation. If they are numerically equal then the left-hand operand
2531 is chosen as the result. Otherwise the minimum (closer to negative
2532 infinity) of the two operands is chosen as the result.
2534 >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
2536 >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
2538 >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
2540 >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
2543 return a
.min(b
, context
=self
)
2546 """Minus corresponds to unary prefix minus in Python.
2548 The operation is evaluated using the same rules as subtract; the
2549 operation minus(a) is calculated as subtract('0', a) where the '0'
2550 has the same exponent as the operand.
2552 >>> ExtendedContext.minus(Decimal('1.3'))
2554 >>> ExtendedContext.minus(Decimal('-1.3'))
2557 return a
.__neg
__(context
=self
)
2559 def multiply(self
, a
, b
):
2560 """multiply multiplies two operands.
2562 If either operand is a special value then the general rules apply.
2563 Otherwise, the operands are multiplied together ('long multiplication'),
2564 resulting in a number which may be as long as the sum of the lengths
2565 of the two operands.
2567 >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
2569 >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
2571 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
2573 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
2575 >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
2576 Decimal("4.28135971E+11")
2578 return a
.__mul
__(b
, context
=self
)
2580 def normalize(self
, a
):
2581 """normalize reduces an operand to its simplest form.
2583 Essentially a plus operation with all trailing zeros removed from the
2586 >>> ExtendedContext.normalize(Decimal('2.1'))
2588 >>> ExtendedContext.normalize(Decimal('-2.0'))
2590 >>> ExtendedContext.normalize(Decimal('1.200'))
2592 >>> ExtendedContext.normalize(Decimal('-120'))
2594 >>> ExtendedContext.normalize(Decimal('120.00'))
2596 >>> ExtendedContext.normalize(Decimal('0.00'))
2599 return a
.normalize(context
=self
)
2602 """Plus corresponds to unary prefix plus in Python.
2604 The operation is evaluated using the same rules as add; the
2605 operation plus(a) is calculated as add('0', a) where the '0'
2606 has the same exponent as the operand.
2608 >>> ExtendedContext.plus(Decimal('1.3'))
2610 >>> ExtendedContext.plus(Decimal('-1.3'))
2613 return a
.__pos
__(context
=self
)
2615 def power(self
, a
, b
, modulo
=None):
2616 """Raises a to the power of b, to modulo if given.
2618 The right-hand operand must be a whole number whose integer part (after
2619 any exponent has been applied) has no more than 9 digits and whose
2620 fractional part (if any) is all zeros before any rounding. The operand
2621 may be positive, negative, or zero; if negative, the absolute value of
2622 the power is used, and the left-hand operand is inverted (divided into
2625 If the increased precision needed for the intermediate calculations
2626 exceeds the capabilities of the implementation then an Invalid operation
2627 condition is raised.
2629 If, when raising to a negative power, an underflow occurs during the
2630 division into 1, the operation is not halted at that point but
2633 >>> ExtendedContext.power(Decimal('2'), Decimal('3'))
2635 >>> ExtendedContext.power(Decimal('2'), Decimal('-3'))
2637 >>> ExtendedContext.power(Decimal('1.7'), Decimal('8'))
2638 Decimal("69.7575744")
2639 >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-2'))
2641 >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-1'))
2643 >>> ExtendedContext.power(Decimal('Infinity'), Decimal('0'))
2645 >>> ExtendedContext.power(Decimal('Infinity'), Decimal('1'))
2647 >>> ExtendedContext.power(Decimal('Infinity'), Decimal('2'))
2649 >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-2'))
2651 >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-1'))
2653 >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('0'))
2655 >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('1'))
2656 Decimal("-Infinity")
2657 >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('2'))
2659 >>> ExtendedContext.power(Decimal('0'), Decimal('0'))
2662 return a
.__pow
__(b
, modulo
, context
=self
)
2664 def quantize(self
, a
, b
):
2665 """Returns a value equal to 'a' (rounded) and having the exponent of 'b'.
2667 The coefficient of the result is derived from that of the left-hand
2668 operand. It may be rounded using the current rounding setting (if the
2669 exponent is being increased), multiplied by a positive power of ten (if
2670 the exponent is being decreased), or is unchanged (if the exponent is
2671 already equal to that of the right-hand operand).
2673 Unlike other operations, if the length of the coefficient after the
2674 quantize operation would be greater than precision then an Invalid
2675 operation condition is raised. This guarantees that, unless there is an
2676 error condition, the exponent of the result of a quantize is always
2677 equal to that of the right-hand operand.
2679 Also unlike other operations, quantize will never raise Underflow, even
2680 if the result is subnormal and inexact.
2682 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
2684 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
2686 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
2688 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
2690 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
2692 >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
2693 Decimal("-Infinity")
2694 >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
2696 >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
2698 >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
2700 >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
2702 >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
2704 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
2706 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
2708 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
2710 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
2713 return a
.quantize(b
, context
=self
)
2715 def remainder(self
, a
, b
):
2716 """Returns the remainder from integer division.
2718 The result is the residue of the dividend after the operation of
2719 calculating integer division as described for divide-integer, rounded to
2720 precision digits if necessary. The sign of the result, if non-zero, is
2721 the same as that of the original dividend.
2723 This operation will fail under the same conditions as integer division
2724 (that is, if integer division on the same two operands would fail, the
2725 remainder cannot be calculated).
2727 >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
2729 >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
2731 >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
2733 >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
2735 >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
2737 >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
2740 return a
.__mod
__(b
, context
=self
)
2742 def remainder_near(self
, a
, b
):
2743 """Returns to be "a - b * n", where n is the integer nearest the exact
2744 value of "x / b" (if two integers are equally near then the even one
2745 is chosen). If the result is equal to 0 then its sign will be the
2748 This operation will fail under the same conditions as integer division
2749 (that is, if integer division on the same two operands would fail, the
2750 remainder cannot be calculated).
2752 >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
2754 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
2756 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
2758 >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
2760 >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
2762 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
2764 >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
2767 return a
.remainder_near(b
, context
=self
)
2769 def same_quantum(self
, a
, b
):
2770 """Returns True if the two operands have the same exponent.
2772 The result is never affected by either the sign or the coefficient of
2775 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
2777 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
2779 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
2781 >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
2784 return a
.same_quantum(b
)
2787 """Returns the square root of a non-negative number to context precision.
2789 If the result must be inexact, it is rounded using the round-half-even
2792 >>> ExtendedContext.sqrt(Decimal('0'))
2794 >>> ExtendedContext.sqrt(Decimal('-0'))
2796 >>> ExtendedContext.sqrt(Decimal('0.39'))
2797 Decimal("0.624499800")
2798 >>> ExtendedContext.sqrt(Decimal('100'))
2800 >>> ExtendedContext.sqrt(Decimal('1'))
2802 >>> ExtendedContext.sqrt(Decimal('1.0'))
2804 >>> ExtendedContext.sqrt(Decimal('1.00'))
2806 >>> ExtendedContext.sqrt(Decimal('7'))
2807 Decimal("2.64575131")
2808 >>> ExtendedContext.sqrt(Decimal('10'))
2809 Decimal("3.16227766")
2810 >>> ExtendedContext.prec
2813 return a
.sqrt(context
=self
)
2815 def subtract(self
, a
, b
):
2816 """Return the difference between the two operands.
2818 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
2820 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
2822 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
2825 return a
.__sub
__(b
, context
=self
)
2827 def to_eng_string(self
, a
):
2828 """Converts a number to a string, using scientific notation.
2830 The operation is not affected by the context.
2832 return a
.to_eng_string(context
=self
)
2834 def to_sci_string(self
, a
):
2835 """Converts a number to a string, using scientific notation.
2837 The operation is not affected by the context.
2839 return a
.__str
__(context
=self
)
2841 def to_integral(self
, a
):
2842 """Rounds to an integer.
2844 When the operand has a negative exponent, the result is the same
2845 as using the quantize() operation using the given operand as the
2846 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
2847 of the operand as the precision setting, except that no flags will
2848 be set. The rounding mode is taken from the context.
2850 >>> ExtendedContext.to_integral(Decimal('2.1'))
2852 >>> ExtendedContext.to_integral(Decimal('100'))
2854 >>> ExtendedContext.to_integral(Decimal('100.0'))
2856 >>> ExtendedContext.to_integral(Decimal('101.5'))
2858 >>> ExtendedContext.to_integral(Decimal('-101.5'))
2860 >>> ExtendedContext.to_integral(Decimal('10E+5'))
2862 >>> ExtendedContext.to_integral(Decimal('7.89E+77'))
2864 >>> ExtendedContext.to_integral(Decimal('-Inf'))
2865 Decimal("-Infinity")
2867 return a
.to_integral(context
=self
)
2869 class _WorkRep(object):
2870 __slots__
= ('sign','int','exp')
2873 # exp: None, int, or string
2875 def __init__(self
, value
=None):
2880 elif isinstance(value
, Decimal
):
2881 self
.sign
= value
._sign
2883 for digit
in value
._int
:
2884 cum
= cum
* 10 + digit
2886 self
.exp
= value
._exp
2888 # assert isinstance(value, tuple)
2889 self
.sign
= value
[0]
2894 return "(%r, %r, %r)" % (self
.sign
, self
.int, self
.exp
)
2900 def _normalize(op1
, op2
, shouldround
= 0, prec
= 0):
2901 """Normalizes op1, op2 to have the same exp and length of coefficient.
2903 Done during addition.
2905 # Yes, the exponent is a long, but the difference between exponents
2906 # must be an int-- otherwise you'd get a big memory problem.
2907 numdigits
= int(op1
.exp
- op2
.exp
)
2909 numdigits
= -numdigits
2917 if shouldround
and numdigits
> prec
+ 1:
2918 # Big difference in exponents - check the adjusted exponents
2919 tmp_len
= len(str(tmp
.int))
2920 other_len
= len(str(other
.int))
2921 if numdigits
> (other_len
+ prec
+ 1 - tmp_len
):
2922 # If the difference in adjusted exps is > prec+1, we know
2923 # other is insignificant, so might as well put a 1 after the precision.
2924 # (since this is only for addition.) Also stops use of massive longs.
2926 extend
= prec
+ 2 - tmp_len
2929 tmp
.int *= 10 ** extend
2935 tmp
.int *= 10 ** numdigits
2936 tmp
.exp
-= numdigits
2939 def _adjust_coefficients(op1
, op2
):
2940 """Adjust op1, op2 so that op2.int * 10 > op1.int >= op2.int.
2942 Returns the adjusted op1, op2 as well as the change in op1.exp-op2.exp.
2944 Used on _WorkRep instances during division.
2947 #If op1 is smaller, make it larger
2948 while op2
.int > op1
.int:
2953 #If op2 is too small, make it larger
2954 while op1
.int >= (10 * op2
.int):
2959 return op1
, op2
, adjust
2961 ##### Helper Functions ########################################
2963 def _convert_other(other
):
2964 """Convert other to Decimal.
2966 Verifies that it's ok to use in an implicit construction.
2968 if isinstance(other
, Decimal
):
2970 if isinstance(other
, (int, long)):
2971 return Decimal(other
)
2972 return NotImplemented
2983 def _isinfinity(num
):
2984 """Determines whether a string or float is infinity.
2986 +1 for negative infinity; 0 for finite ; +1 for positive infinity
2988 num
= str(num
).lower()
2989 return _infinity_map
.get(num
, 0)
2992 """Determines whether a string or float is NaN
2994 (1, sign, diagnostic info as string) => NaN
2995 (2, sign, diagnostic info as string) => sNaN
2998 num
= str(num
).lower()
3002 #get the sign, get rid of trailing [+-]
3006 elif num
[0] == '-': #elif avoids '+-nan'
3010 if num
.startswith('nan'):
3011 if len(num
) > 3 and not num
[3:].isdigit(): #diagnostic info
3013 return (1, sign
, num
[3:].lstrip('0'))
3014 if num
.startswith('snan'):
3015 if len(num
) > 4 and not num
[4:].isdigit():
3017 return (2, sign
, num
[4:].lstrip('0'))
3021 ##### Setup Specific Contexts ################################
3023 # The default context prototype used by Context()
3024 # Is mutable, so that new contexts can have different default values
3026 DefaultContext
= Context(
3027 prec
=28, rounding
=ROUND_HALF_EVEN
,
3028 traps
=[DivisionByZero
, Overflow
, InvalidOperation
],
3030 _rounding_decision
=ALWAYS_ROUND
,
3036 # Pre-made alternate contexts offered by the specification
3037 # Don't change these; the user should be able to select these
3038 # contexts and be able to reproduce results from other implementations
3041 BasicContext
= Context(
3042 prec
=9, rounding
=ROUND_HALF_UP
,
3043 traps
=[DivisionByZero
, Overflow
, InvalidOperation
, Clamped
, Underflow
],
3047 ExtendedContext
= Context(
3048 prec
=9, rounding
=ROUND_HALF_EVEN
,
3054 ##### Useful Constants (internal use only) ####################
3057 Inf
= Decimal('Inf')
3058 negInf
= Decimal('-Inf')
3060 #Infsign[sign] is infinity w/ that sign
3061 Infsign
= (Inf
, negInf
)
3063 NaN
= Decimal('NaN')
3066 ##### crud for parsing strings #################################
3069 # There's an optional sign at the start, and an optional exponent
3070 # at the end. The exponent has an optional sign and at least one
3071 # digit. In between, must have either at least one digit followed
3072 # by an optional fraction, or a decimal point followed by at least
3075 _parser
= re
.compile(r
"""
3079 (?P<int>\d+) (\. (?P<frac>\d*))?
3081 \. (?P<onlyfrac>\d+)
3083 ([eE](?P<exp>[-+]? \d+))?
3086 """, re
.VERBOSE
).match
#Uncomment the \s* to allow leading or trailing spaces.
3090 # return sign, n, p s.t. float string value == -1**sign * n * 10**p exactly
3092 def _string2exact(s
):
3095 raise ValueError("invalid literal for Decimal: %r" % s
)
3097 if m
.group('sign') == "-":
3102 exp
= m
.group('exp')
3108 intpart
= m
.group('int')
3111 fracpart
= m
.group('onlyfrac')
3113 fracpart
= m
.group('frac')
3114 if fracpart
is None:
3117 exp
-= len(fracpart
)
3119 mantissa
= intpart
+ fracpart
3120 tmp
= map(int, mantissa
)
3122 while tmp
and tmp
[0] == 0:
3128 return (sign
, tuple(backup
), exp
)
3129 return (sign
, (0,), exp
)
3130 mantissa
= tuple(tmp
)
3132 return (sign
, mantissa
, exp
)
3135 if __name__
== '__main__':
3137 doctest
.testmod(sys
.modules
[__name__
])