Package gnue :: Package common :: Package external :: Module decimal
[show private | hide private]

Module gnue.common.external.decimal

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
>>>

Classes
Context Contains the context for a Decimal instance.
Decimal Floating point class for decimal arithmetic.
_WorkRep  

Exceptions
Clamped Exponent of a 0 changed to fit bounds.
DecimalException Base exception class.
DivisionByZero Division by 0.
Inexact Had to round, losing information.
InvalidOperation An invalid operation was performed.
Overflow Numerical overflow.
Rounded Number got rounded (not necessarily changed during rounding).
Subnormal Exponent < Emin before rounding.
Underflow Numerical underflow with result rounded to 0.
ConversionSyntax Trying to convert badly formed string.
DivisionImpossible Cannot perform the division adequately.
DivisionUndefined Undefined result of division.
InvalidContext Invalid context.

Function Summary
  getcontext(_local)
Returns this thread's context.
  setcontext(context, _local)
Set this thread's context to context.
  _adjust_coefficients(op1, op2)
Adjust op1, op2 so that op2.int * 10 > op1.int >= op2.int.
  _convert_other(other)
Convert other to Decimal.
  _isinfinity(num)
Determines whether a string or float is infinity.
  _isnan(num)
Determines whether a string or float is NaN
  _normalize(op1, op2, shouldround, prec)
Normalizes op1, op2 to have the same exp and length of coefficient.
  _string2exact(s)

Variable Summary
Context BasicContext = Context(prec=9, rounding=ROUND_HALF_UP, E...
Context DefaultContext = Context(prec=28, rounding=ROUND_HALF_EV...
Context ExtendedContext = Context(prec=9, rounding=ROUND_HALF_EV...
str ROUND_CEILING = 'ROUND_CEILING'
str ROUND_DOWN = 'ROUND_DOWN'
str ROUND_FLOOR = 'ROUND_FLOOR'
str ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
str ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
str ROUND_HALF_UP = 'ROUND_HALF_UP'
str ROUND_UP = 'ROUND_UP'
dict _condition_map = {<class gnue.common.external.decimal.Di...
dict _infinity_map = {'+inf': 1, 'infinity': 1, '-inf': -1, '...
builtin_function_or_method _parser = _sre.SRE_Pattern.match
list _signals = [<class gnue.common.external.decimal.Clamped ...
str ALWAYS_ROUND = 'ALWAYS_ROUND'
Decimal Inf = Decimal("Infinity")
tuple Infsign = (Decimal("Infinity"), Decimal("-Infinity"))
Decimal NaN = Decimal("NaN")
Decimal negInf = Decimal("-Infinity")
str NEVER_ROUND = 'NEVER_ROUND'

Function Details

getcontext(_local=<thread._local object at 0xb76561e8>)

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.

setcontext(context, _local=<thread._local object at 0xb76561e8>)

Set this thread's context to context.

_adjust_coefficients(op1, op2)

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(other)

Convert other to Decimal.

Verifies that it's ok to use in an implicit construction.

_isinfinity(num)

Determines whether a string or float is infinity.

+1 for negative infinity; 0 for finite ; +1 for positive infinity

_isnan(num)

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

_normalize(op1, op2, shouldround=0, prec=0)

Normalizes op1, op2 to have the same exp and length of coefficient.

Done during addition.

_string2exact(s)


Variable Details

BasicContext

Type:
Context
Value:
Context(prec=9, rounding=ROUND_HALF_UP, Emin=-999999999, Emax=99999999\
9, capitals=1, flags=[], traps=[Clamped, Overflow, InvalidOperation, D\
ivisionByZero, Underflow])                                             

DefaultContext

Type:
Context
Value:
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=99999\
9999, capitals=1, flags=[], traps=[Overflow, InvalidOperation, Divisio\
nByZero])                                                              

ExtendedContext

Type:
Context
Value:
Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999\
999, capitals=1, flags=[], traps=[])                                   

ROUND_CEILING

Type:
str
Value:
'ROUND_CEILING'                                                        

ROUND_DOWN

Type:
str
Value:
'ROUND_DOWN'                                                           

ROUND_FLOOR

Type:
str
Value:
'ROUND_FLOOR'                                                          

ROUND_HALF_DOWN

Type:
str
Value:
'ROUND_HALF_DOWN'                                                      

ROUND_HALF_EVEN

Type:
str
Value:
'ROUND_HALF_EVEN'                                                      

ROUND_HALF_UP

Type:
str
Value:
'ROUND_HALF_UP'                                                        

ROUND_UP

Type:
str
Value:
'ROUND_UP'                                                             

_condition_map

Type:
dict
Value:
{<class gnue.common.external.decimal.ConversionSyntax at 0xb76637dc>: \
<class gnue.common.external.decimal.InvalidOperation at 0xb766374c>,
 <class gnue.common.external.decimal.DivisionImpossible at 0xb766383c>\
: <class gnue.common.external.decimal.InvalidOperation at 0xb766374c>,
 <class gnue.common.external.decimal.DivisionUndefined at 0xb766386c>:\
 <class gnue.common.external.decimal.InvalidOperation at 0xb766374c>,
 <class gnue.common.external.decimal.InvalidContext at 0xb76638cc>: <c\
lass gnue.common.external.decimal.InvalidOperation at 0xb766374c>}     

_infinity_map

Type:
dict
Value:
{'+inf': 1,
 '+infinity': 1,
 '-inf': -1,
 '-infinity': -1,
 'inf': 1,
 'infinity': 1}                                                        

_signals

Type:
list
Value:
[<class gnue.common.external.decimal.Clamped at 0xb766365c>,
 <class gnue.common.external.decimal.DivisionByZero at 0xb766380c>,
 <class gnue.common.external.decimal.Inexact at 0xb766389c>,
 <class gnue.common.external.decimal.Overflow at 0xb766132c>,
 <class gnue.common.external.decimal.Rounded at 0xb76638fc>,
 <class gnue.common.external.decimal.Underflow at 0xb766135c>,
 <class gnue.common.external.decimal.InvalidOperation at 0xb766374c>,
 <class gnue.common.external.decimal.Subnormal at 0xb76612fc>]         

ALWAYS_ROUND

Type:
str
Value:
'ALWAYS_ROUND'                                                         

Inf

Type:
Decimal
Value:
Decimal("Infinity")                                                    

Infsign

Type:
tuple
Value:
(Decimal("Infinity"), Decimal("-Infinity"))                            

NaN

Type:
Decimal
Value:
Decimal("NaN")                                                         

negInf

Type:
Decimal
Value:
Decimal("-Infinity")                                                   

NEVER_ROUND

Type:
str
Value:
'NEVER_ROUND'                                                          


GNUe Home

Private API

Developer's Corner