* Added missing info on construction from a tuple.

* Added a recipe section.
This commit is contained in:
Raymond Hettinger 2004-07-05 18:41:42 +00:00
parent 8de63a206e
commit d84efb3d93
1 changed files with 134 additions and 14 deletions

View File

@ -292,9 +292,10 @@ as other Python numeric types.
\begin{classdesc}{Decimal}{\optional{value \optional{, context}}}
Constructs a new \class{Decimal} object based from \var{value}.
\var{value} can be an integer, string, or another \class{Decimal} object.
If no \var{value} is given, returns \code{Decimal("0")}. If \var{value} is
a string, it should conform to the decimal numeric string syntax:
\var{value} can be an integer, string, tuple, or another \class{Decimal}
object. If no \var{value} is given, returns \code{Decimal("0")}. If
\var{value} is a string, it should conform to the decimal numeric string
syntax:
\begin{verbatim}
sign ::= '+' | '-'
@ -309,6 +310,12 @@ as other Python numeric types.
numeric-string ::= [sign] numeric-value | [sign] nan
\end{verbatim}
If \var{value} is a \class{tuple}, it should have three components,
a sign (\constant{0} for positive or \constant{1} for negative),
a \class{tuple} of digits, and an exponent represented as an integer.
For example, \samp{Decimal((0, (1, 4, 1, 4), -3))} returns
\samp{Decimal("1.414")}.
The supplied \var{context} or, if not specified, the current context
governs only the handling of mal-formed strings not conforming to the
numeric string syntax. If the context traps \constant{ConversionSyntax},
@ -706,7 +713,6 @@ exception is raised upon encountering the condition.
reduced to fit by adding zeroes to the coefficient.
\end{classdesc*}
\begin{classdesc*}{ConversionSyntax}
Trying to convert a mal-formed string such as: \code{Decimal('jump')}.
@ -714,12 +720,10 @@ exception is raised upon encountering the condition.
syntax. If this signal is not trapped, returns \constant{NaN}.
\end{classdesc*}
\begin{classdesc*}{DecimalException}
Base class for other signals.
\end{classdesc*}
\begin{classdesc*}{DivisionByZero}
Signals the division of a non-infinite number by zero.
@ -729,7 +733,6 @@ exception is raised upon encountering the condition.
the inputs to the calculation.
\end{classdesc*}
\begin{classdesc*}{DivisionImpossible}
Error performing a division operation. Caused when an intermediate result
has more digits that the allowed by the current precision. If not trapped,
@ -743,7 +746,6 @@ exception is raised upon encountering the condition.
It occurs only in the context of division operations.
\end{classdesc*}
\begin{classdesc*}{Inexact}
Indicates that rounding occurred and the result is not exact.
@ -760,7 +762,6 @@ exception is raised upon encountering the condition.
rounding operation. If not trapped, returns \constant{NaN}.
\end{classdesc*}
\begin{classdesc*}{InvalidOperation}
An invalid operation was performed.
@ -781,7 +782,6 @@ exception is raised upon encountering the condition.
\end{verbatim}
\end{classdesc*}
\begin{classdesc*}{Overflow}
Numerical overflow.
@ -802,7 +802,6 @@ exception is raised upon encountering the condition.
loss of significant digits.
\end{classdesc*}
\begin{classdesc*}{Subnormal}
Exponent was lower than \member{Emin} prior to rounding.
@ -810,7 +809,6 @@ exception is raised upon encountering the condition.
If not trapped, returns the result unchanged.
\end{classdesc*}
\begin{classdesc*}{Underflow}
Numerical underflow with result rounded to zero.
@ -818,7 +816,6 @@ exception is raised upon encountering the condition.
\class{Inexact} and \class{Subnormal} are also signaled.
\end{classdesc*}
The following table summarizes the hierarchy of signals:
\begin{verbatim}
@ -838,6 +835,8 @@ The following table summarizes the hierarchy of signals:
Subnormal
\end{verbatim}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Working with threads \label{decimal-threads}}
@ -875,8 +874,129 @@ t3.start()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Recipes \label{decimal-recipes}}
Here are some functions demonstrating ways to work with the
\class{Decimal} class:
\begin{verbatim}
from decimal import Decimal, getcontext
def moneyfmt(value, places=2, curr='$', sep=',', dp='.', pos='', neg='-'):
"""Convert Decimal to a money formatted string.
places: required number of places after the decimal point
curr: optional currency symbol before the sign (may be blank)
sep: optional grouping separator (comma, period, or blank)
dp: decimal point indicator (comma or period)
only set to blank if places is zero
pos: optional sign for positive numbers ("+" or blank)
neg: optional sign for negative numbers ("-" or blank)
leave blank to separately add brackets or a trailing minus
>>> d = Decimal('-1234567.8901')
>>> moneyfmt(d)
'-$1,234,567.89'
>>> moneyfmt(d, places=0, curr='', sep='.', dp='')
'-1.234.568'
>>> '($%s)' % moneyfmt(d, curr='', neg='')
'($1,234,567.89)'
"""
q = Decimal((0, (1,), -places)) # 2 places --> '0.01'
sign, digits, exp = value.quantize(q).as_tuple()
result = []
digits = map(str, digits)
build, next = result.append, digits.pop
for i in range(places):
build(next())
build(dp)
try:
while 1:
for i in range(3):
build(next())
if digits:
build(sep)
except IndexError:
pass
build(curr)
if sign:
build(neg)
else:
build(pos)
result.reverse()
return ''.join(result)
def pi():
"Compute Pi to the current precision"
getcontext().prec += 9 # extra digits for intermediate steps
one = Decimal(1) # substitute "one=1.0" for regular floats
lastc, t, c, n, na, d, da = 0*one, 3*one, 3*one, 1, 0, 0, 24*one
while c != lastc:
lastc = c
n, na = n+na, na+8
d, da = d+da, da+32
t = (t * n) / d
c += t
getcontext().prec -= 10
return c
def exp(x):
"""Return e raised to the power of x.
>>> print exp(Decimal(1))
2.718281828459045235360287471352662498
>>> print exp(Decimal(2))
7.389056098930650227230427460575007813
"""
getcontext().prec += 9 # extra digits for intermediate steps
one = Decimal(1) # substitute "one=1.0" for regular floats
i, laste, e, fact, num = 0*one, 0*one, one, one, one
while e != laste:
laste = e
i += 1
fact *= i
num *= x
e += num / fact
getcontext().prec -= 9
return e
def cos(x):
"""Return the cosine of x as measured in radians.
>>> print cos(Decimal('0.5'))
0.8775825618903727161162815826038296521
"""
getcontext().prec += 9 # extra digits for intermediate steps
one = Decimal(1) # substitute "one=1.0" for regular floats
i, laste, e, fact, num, sign = 0*one, 0*one, one, one, one, one
while e != laste:
laste = e
i += 2
fact *= i * (i-1)
num *= x * x
sign *= -1
e += num / fact * sign
getcontext().prec -= 9
return e
def sin(x):
"""Return the cosine of x as measured in radians.
>>> print sin(Decimal('0.5'))
0.4794255386042030002732879352155713880
"""
getcontext().prec += 9 # extra digits for intermediate steps
one = Decimal(1) # substitute "one=1.0" for regular floats
i, laste, e, fact, num, sign = one, 0*one, x, one, x, one
while e != laste:
laste = e
i += 2
fact *= i * (i-1)
num *= x * x
sign *= -1
e += num / fact * sign
getcontext().prec -= 9
return e
\end{verbatim}