Commit d84efb3d authored by Raymond Hettinger's avatar Raymond Hettinger

* Added missing info on construction from a tuple.

* Added a recipe section.
parent 8de63a20
...@@ -292,9 +292,10 @@ as other Python numeric types. ...@@ -292,9 +292,10 @@ as other Python numeric types.
\begin{classdesc}{Decimal}{\optional{value \optional{, context}}} \begin{classdesc}{Decimal}{\optional{value \optional{, context}}}
Constructs a new \class{Decimal} object based from \var{value}. Constructs a new \class{Decimal} object based from \var{value}.
\var{value} can be an integer, string, or another \class{Decimal} object. \var{value} can be an integer, string, tuple, or another \class{Decimal}
If no \var{value} is given, returns \code{Decimal("0")}. If \var{value} is object. If no \var{value} is given, returns \code{Decimal("0")}. If
a string, it should conform to the decimal numeric string syntax: \var{value} is a string, it should conform to the decimal numeric string
syntax:
\begin{verbatim} \begin{verbatim}
sign ::= '+' | '-' sign ::= '+' | '-'
...@@ -309,6 +310,12 @@ as other Python numeric types. ...@@ -309,6 +310,12 @@ as other Python numeric types.
numeric-string ::= [sign] numeric-value | [sign] nan numeric-string ::= [sign] numeric-value | [sign] nan
\end{verbatim} \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 The supplied \var{context} or, if not specified, the current context
governs only the handling of mal-formed strings not conforming to the governs only the handling of mal-formed strings not conforming to the
numeric string syntax. If the context traps \constant{ConversionSyntax}, numeric string syntax. If the context traps \constant{ConversionSyntax},
...@@ -706,7 +713,6 @@ exception is raised upon encountering the condition. ...@@ -706,7 +713,6 @@ exception is raised upon encountering the condition.
reduced to fit by adding zeroes to the coefficient. reduced to fit by adding zeroes to the coefficient.
\end{classdesc*} \end{classdesc*}
\begin{classdesc*}{ConversionSyntax} \begin{classdesc*}{ConversionSyntax}
Trying to convert a mal-formed string such as: \code{Decimal('jump')}. Trying to convert a mal-formed string such as: \code{Decimal('jump')}.
...@@ -714,12 +720,10 @@ exception is raised upon encountering the condition. ...@@ -714,12 +720,10 @@ exception is raised upon encountering the condition.
syntax. If this signal is not trapped, returns \constant{NaN}. syntax. If this signal is not trapped, returns \constant{NaN}.
\end{classdesc*} \end{classdesc*}
\begin{classdesc*}{DecimalException} \begin{classdesc*}{DecimalException}
Base class for other signals. Base class for other signals.
\end{classdesc*} \end{classdesc*}
\begin{classdesc*}{DivisionByZero} \begin{classdesc*}{DivisionByZero}
Signals the division of a non-infinite number by zero. Signals the division of a non-infinite number by zero.
...@@ -729,7 +733,6 @@ exception is raised upon encountering the condition. ...@@ -729,7 +733,6 @@ exception is raised upon encountering the condition.
the inputs to the calculation. the inputs to the calculation.
\end{classdesc*} \end{classdesc*}
\begin{classdesc*}{DivisionImpossible} \begin{classdesc*}{DivisionImpossible}
Error performing a division operation. Caused when an intermediate result Error performing a division operation. Caused when an intermediate result
has more digits that the allowed by the current precision. If not trapped, has more digits that the allowed by the current precision. If not trapped,
...@@ -743,7 +746,6 @@ exception is raised upon encountering the condition. ...@@ -743,7 +746,6 @@ exception is raised upon encountering the condition.
It occurs only in the context of division operations. It occurs only in the context of division operations.
\end{classdesc*} \end{classdesc*}
\begin{classdesc*}{Inexact} \begin{classdesc*}{Inexact}
Indicates that rounding occurred and the result is not exact. Indicates that rounding occurred and the result is not exact.
...@@ -760,7 +762,6 @@ exception is raised upon encountering the condition. ...@@ -760,7 +762,6 @@ exception is raised upon encountering the condition.
rounding operation. If not trapped, returns \constant{NaN}. rounding operation. If not trapped, returns \constant{NaN}.
\end{classdesc*} \end{classdesc*}
\begin{classdesc*}{InvalidOperation} \begin{classdesc*}{InvalidOperation}
An invalid operation was performed. An invalid operation was performed.
...@@ -781,7 +782,6 @@ exception is raised upon encountering the condition. ...@@ -781,7 +782,6 @@ exception is raised upon encountering the condition.
\end{verbatim} \end{verbatim}
\end{classdesc*} \end{classdesc*}
\begin{classdesc*}{Overflow} \begin{classdesc*}{Overflow}
Numerical overflow. Numerical overflow.
...@@ -802,7 +802,6 @@ exception is raised upon encountering the condition. ...@@ -802,7 +802,6 @@ exception is raised upon encountering the condition.
loss of significant digits. loss of significant digits.
\end{classdesc*} \end{classdesc*}
\begin{classdesc*}{Subnormal} \begin{classdesc*}{Subnormal}
Exponent was lower than \member{Emin} prior to rounding. Exponent was lower than \member{Emin} prior to rounding.
...@@ -810,7 +809,6 @@ exception is raised upon encountering the condition. ...@@ -810,7 +809,6 @@ exception is raised upon encountering the condition.
If not trapped, returns the result unchanged. If not trapped, returns the result unchanged.
\end{classdesc*} \end{classdesc*}
\begin{classdesc*}{Underflow} \begin{classdesc*}{Underflow}
Numerical underflow with result rounded to zero. Numerical underflow with result rounded to zero.
...@@ -818,7 +816,6 @@ exception is raised upon encountering the condition. ...@@ -818,7 +816,6 @@ exception is raised upon encountering the condition.
\class{Inexact} and \class{Subnormal} are also signaled. \class{Inexact} and \class{Subnormal} are also signaled.
\end{classdesc*} \end{classdesc*}
The following table summarizes the hierarchy of signals: The following table summarizes the hierarchy of signals:
\begin{verbatim} \begin{verbatim}
...@@ -838,6 +835,8 @@ The following table summarizes the hierarchy of signals: ...@@ -838,6 +835,8 @@ The following table summarizes the hierarchy of signals:
Subnormal Subnormal
\end{verbatim} \end{verbatim}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Working with threads \label{decimal-threads}} \subsection{Working with threads \label{decimal-threads}}
...@@ -875,8 +874,129 @@ t3.start() ...@@ -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}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment