Trees | Indices | Help |
|
---|
|
This is a Py2.3 implementation of decimal floating point arithmetic based on the General Decimal Arithmetic Specification: www2.hursley.ibm.com/decimal/decarith.html and IEEE standard 854-1987: www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html Decimal floating point has finite precision with arbitrarily large bounds. The purpose of the module is to support arithmetic using familiar "schoolhouse" rules and to avoid the some of tricky representation issues associated with binary floating point. The package is especially useful for financial applications or for contexts where users have expectations that are at odds with binary floating point (for instance, in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead of the expected Decimal("0.00") returned by decimal floating point). Here are some examples of using the decimal module: >>> from decimal import * >>> setcontext(ExtendedContext) >>> Decimal(0) Decimal("0") >>> Decimal("1") Decimal("1") >>> Decimal("-.0123") Decimal("-0.0123") >>> Decimal(123456) Decimal("123456") >>> Decimal("123.45e12345678901234567890") Decimal("1.2345E+12345678901234567892") >>> Decimal("1.33") + Decimal("1.27") Decimal("2.60") >>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41") Decimal("-2.20") >>> dig = Decimal(1) >>> print dig / Decimal(3) 0.333333333 >>> getcontext().prec = 18 >>> print dig / Decimal(3) 0.333333333333333333 >>> print dig.sqrt() 1 >>> print Decimal(3).sqrt() 1.73205080756887729 >>> print Decimal(3) ** 123 4.85192780976896427E+58 >>> inf = Decimal(1) / Decimal(0) >>> print inf Infinity >>> neginf = Decimal(-1) / Decimal(0) >>> print neginf -Infinity >>> print neginf + inf NaN >>> print neginf * inf -Infinity >>> print dig / 0 Infinity >>> getcontext().traps[DivisionByZero] = 1 >>> print dig / 0 Traceback (most recent call last): ... ... ... DivisionByZero: x / 0 >>> c = Context() >>> c.traps[InvalidOperation] = 0 >>> print c.flags[InvalidOperation] 0 >>> c.divide(Decimal(0), Decimal(0)) Decimal("NaN") >>> c.traps[InvalidOperation] = 1 >>> print c.flags[InvalidOperation] 1 >>> c.flags[InvalidOperation] = 0 >>> print c.flags[InvalidOperation] 0 >>> print c.divide(Decimal(0), Decimal(0)) Traceback (most recent call last): ... ... ... InvalidOperation: 0 / 0 >>> print c.flags[InvalidOperation] 1 >>> c.flags[InvalidOperation] = 0 >>> c.traps[InvalidOperation] = 0 >>> print c.divide(Decimal(0), Decimal(0)) NaN >>> print c.flags[InvalidOperation] 1 >>>
|
|||
DecimalException Base exception class. |
|||
Clamped Exponent of a 0 changed to fit bounds. |
|||
InvalidOperation An invalid operation was performed. |
|||
ConversionSyntax Trying to convert badly formed string. |
|||
DivisionByZero Division by 0. |
|||
DivisionImpossible Cannot perform the division adequately. |
|||
DivisionUndefined Undefined result of division. |
|||
Inexact Had to round, losing information. |
|||
InvalidContext Invalid context. |
|||
Rounded Number got rounded (not necessarily changed during rounding). |
|||
Subnormal Exponent < Emin before rounding. |
|||
Overflow Numerical overflow. |
|||
Underflow Numerical underflow with result rounded to 0. |
|||
Decimal Floating point class for decimal arithmetic. |
|||
_ContextManager Context manager class to support localcontext(). |
|||
Context Contains the context for a Decimal instance. |
|||
_WorkRep |
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|
|||
ROUND_DOWN =
|
|||
ROUND_HALF_UP =
|
|||
ROUND_HALF_EVEN =
|
|||
ROUND_CEILING =
|
|||
ROUND_FLOOR =
|
|||
ROUND_UP =
|
|||
ROUND_HALF_DOWN =
|
|||
NEVER_ROUND =
|
|||
ALWAYS_ROUND =
|
|||
_signals =
|
|||
_condition_map =
|
|||
_infinity_map =
|
|||
DefaultContext = Context(prec=28, rounding=ROUND_HALF_EVEN, Em
|
|||
BasicContext = Context(prec=9, rounding=ROUND_HALF_UP, Emin=-9
|
|||
ExtendedContext = Context(prec=9, rounding=ROUND_HALF_EVEN, Em
|
|||
Inf = Decimal("Infinity")
|
|||
negInf = Decimal("-Infinity")
|
|||
Infsign =
|
|||
NaN = Decimal("NaN")
|
Imports: _copy
|
Returns this thread's context. If this thread does not yet have a context, returns a new context and sets this thread's context. New contexts are copies of DefaultContext. |
Return a context manager for a copy of the supplied context Uses a copy of the current context if no context is specified The returned context manager creates a local decimal context in a with statement: def sin(x): with localcontext() as ctx: ctx.prec += 2 # Rest of sin calculation algorithm # uses a precision 2 greater than normal return +s # Convert result to normal precision def sin(x): with localcontext(ExtendedContext): # Rest of sin calculation algorithm # uses the Extended Context from the # General Decimal Arithmetic Specification return +s # Convert result to normal context |
Normalizes op1, op2 to have the same exp and length of coefficient. Done during addition. |
Adjust op1, op2 so that op2.int * 10 > op1.int >= op2.int. Returns the adjusted op1, op2 as well as the change in op1.exp-op2.exp. Used on _WorkRep instances during division. |
Convert other to Decimal. Verifies that it's ok to use in an implicit construction. |
Determines whether a string or float is infinity. +1 for negative infinity; 0 for finite ; +1 for positive infinity |
Determines whether a string or float is NaN (1, sign, diagnostic info as string) => NaN (2, sign, diagnostic info as string) => sNaN 0 => not a NaN |
match(string[, pos[, endpos]]) --> match object or None. Matches zero or more characters at the beginning of the string |
|
_signals
|
_condition_map
|
_infinity_map
|
DefaultContext
|
BasicContext
|
ExtendedContext
|
Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0 on Tue Jan 29 22:40:38 2008 | http://epydoc.sourceforge.net |