blob: e29e4ea5fe0977c3686be6f33cc760879c697109 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001
2:mod:`decimal` --- Decimal floating point arithmetic
3====================================================
4
5.. module:: decimal
6 :synopsis: Implementation of the General Decimal Arithmetic Specification.
7
Georg Brandl116aa622007-08-15 14:28:22 +00008.. moduleauthor:: Eric Price <eprice at tjhsst.edu>
9.. moduleauthor:: Facundo Batista <facundo at taniquetil.com.ar>
10.. moduleauthor:: Raymond Hettinger <python at rcn.com>
11.. moduleauthor:: Aahz <aahz at pobox.com>
12.. moduleauthor:: Tim Peters <tim.one at comcast.net>
Georg Brandl116aa622007-08-15 14:28:22 +000013.. sectionauthor:: Raymond D. Hettinger <python at rcn.com>
14
15
Georg Brandl116aa622007-08-15 14:28:22 +000016The :mod:`decimal` module provides support for decimal floating point
Thomas Wouters1b7f8912007-09-19 03:06:30 +000017arithmetic. It offers several advantages over the :class:`float` datatype:
Georg Brandl116aa622007-08-15 14:28:22 +000018
19* Decimal numbers can be represented exactly. In contrast, numbers like
20 :const:`1.1` do not have an exact representation in binary floating point. End
21 users typically would not expect :const:`1.1` to display as
22 :const:`1.1000000000000001` as it does with binary floating point.
23
24* The exactness carries over into arithmetic. In decimal floating point, ``0.1
Thomas Wouters1b7f8912007-09-19 03:06:30 +000025 + 0.1 + 0.1 - 0.3`` is exactly equal to zero. In binary floating point, the result
Georg Brandl116aa622007-08-15 14:28:22 +000026 is :const:`5.5511151231257827e-017`. While near to zero, the differences
27 prevent reliable equality testing and differences can accumulate. For this
28 reason, decimal would be preferred in accounting applications which have strict
29 equality invariants.
30
31* The decimal module incorporates a notion of significant places so that ``1.30
32 + 1.20`` is :const:`2.50`. The trailing zero is kept to indicate significance.
33 This is the customary presentation for monetary applications. For
34 multiplication, the "schoolbook" approach uses all the figures in the
35 multiplicands. For instance, ``1.3 * 1.2`` gives :const:`1.56` while ``1.30 *
36 1.20`` gives :const:`1.5600`.
37
38* Unlike hardware based binary floating point, the decimal module has a user
Thomas Wouters1b7f8912007-09-19 03:06:30 +000039 alterable precision (defaulting to 28 places) which can be as large as needed for
Georg Brandl116aa622007-08-15 14:28:22 +000040 a given problem::
41
42 >>> getcontext().prec = 6
43 >>> Decimal(1) / Decimal(7)
44 Decimal("0.142857")
45 >>> getcontext().prec = 28
46 >>> Decimal(1) / Decimal(7)
47 Decimal("0.1428571428571428571428571429")
48
49* Both binary and decimal floating point are implemented in terms of published
50 standards. While the built-in float type exposes only a modest portion of its
51 capabilities, the decimal module exposes all required parts of the standard.
52 When needed, the programmer has full control over rounding and signal handling.
53
54The module design is centered around three concepts: the decimal number, the
55context for arithmetic, and signals.
56
57A decimal number is immutable. It has a sign, coefficient digits, and an
58exponent. To preserve significance, the coefficient digits do not truncate
Thomas Wouters1b7f8912007-09-19 03:06:30 +000059trailing zeros. Decimals also include special values such as
Georg Brandl116aa622007-08-15 14:28:22 +000060:const:`Infinity`, :const:`-Infinity`, and :const:`NaN`. The standard also
61differentiates :const:`-0` from :const:`+0`.
62
63The context for arithmetic is an environment specifying precision, rounding
64rules, limits on exponents, flags indicating the results of operations, and trap
65enablers which determine whether signals are treated as exceptions. Rounding
66options include :const:`ROUND_CEILING`, :const:`ROUND_DOWN`,
67:const:`ROUND_FLOOR`, :const:`ROUND_HALF_DOWN`, :const:`ROUND_HALF_EVEN`,
Thomas Wouters1b7f8912007-09-19 03:06:30 +000068:const:`ROUND_HALF_UP`, :const:`ROUND_UP`, and :const:`ROUND_05UP`.
Georg Brandl116aa622007-08-15 14:28:22 +000069
70Signals are groups of exceptional conditions arising during the course of
71computation. Depending on the needs of the application, signals may be ignored,
72considered as informational, or treated as exceptions. The signals in the
73decimal module are: :const:`Clamped`, :const:`InvalidOperation`,
74:const:`DivisionByZero`, :const:`Inexact`, :const:`Rounded`, :const:`Subnormal`,
75:const:`Overflow`, and :const:`Underflow`.
76
77For each signal there is a flag and a trap enabler. When a signal is
78encountered, its flag is incremented from zero and, then, if the trap enabler is
79set to one, an exception is raised. Flags are sticky, so the user needs to
80reset them before monitoring a calculation.
81
82
83.. seealso::
84
Thomas Wouters1b7f8912007-09-19 03:06:30 +000085 * IBM's General Decimal Arithmetic Specification, `The General Decimal Arithmetic
86 Specification <http://www2.hursley.ibm.com/decimal/decarith.html>`_.
Georg Brandl116aa622007-08-15 14:28:22 +000087
Thomas Wouters1b7f8912007-09-19 03:06:30 +000088 * IEEE standard 854-1987, `Unofficial IEEE 854 Text
89 <http://www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html>`_.
Georg Brandl116aa622007-08-15 14:28:22 +000090
Christian Heimes5b5e81c2007-12-31 16:14:33 +000091.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +000092
93
94.. _decimal-tutorial:
95
96Quick-start Tutorial
97--------------------
98
99The usual start to using decimals is importing the module, viewing the current
100context with :func:`getcontext` and, if necessary, setting new values for
101precision, rounding, or enabled traps::
102
103 >>> from decimal import *
104 >>> getcontext()
105 Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
106 capitals=1, flags=[], traps=[Overflow, InvalidOperation,
107 DivisionByZero])
108
109 >>> getcontext().prec = 7 # Set a new precision
110
111Decimal instances can be constructed from integers, strings, or tuples. To
112create a Decimal from a :class:`float`, first convert it to a string. This
113serves as an explicit reminder of the details of the conversion (including
114representation error). Decimal numbers include special values such as
115:const:`NaN` which stands for "Not a number", positive and negative
116:const:`Infinity`, and :const:`-0`. ::
117
118 >>> Decimal(10)
119 Decimal("10")
120 >>> Decimal("3.14")
121 Decimal("3.14")
122 >>> Decimal((0, (3, 1, 4), -2))
123 Decimal("3.14")
124 >>> Decimal(str(2.0 ** 0.5))
125 Decimal("1.41421356237")
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000126 >>> Decimal(2) ** Decimal("0.5")
127 Decimal("1.414213562373095048801688724")
Georg Brandl116aa622007-08-15 14:28:22 +0000128 >>> Decimal("NaN")
129 Decimal("NaN")
130 >>> Decimal("-Infinity")
131 Decimal("-Infinity")
132
133The significance of a new Decimal is determined solely by the number of digits
134input. Context precision and rounding only come into play during arithmetic
135operations. ::
136
137 >>> getcontext().prec = 6
138 >>> Decimal('3.0')
139 Decimal("3.0")
140 >>> Decimal('3.1415926535')
141 Decimal("3.1415926535")
142 >>> Decimal('3.1415926535') + Decimal('2.7182818285')
143 Decimal("5.85987")
144 >>> getcontext().rounding = ROUND_UP
145 >>> Decimal('3.1415926535') + Decimal('2.7182818285')
146 Decimal("5.85988")
147
148Decimals interact well with much of the rest of Python. Here is a small decimal
149floating point flying circus::
150
151 >>> data = map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split())
152 >>> max(data)
153 Decimal("9.25")
154 >>> min(data)
155 Decimal("0.03")
156 >>> sorted(data)
157 [Decimal("0.03"), Decimal("1.00"), Decimal("1.34"), Decimal("1.87"),
158 Decimal("2.35"), Decimal("3.45"), Decimal("9.25")]
159 >>> sum(data)
160 Decimal("19.29")
161 >>> a,b,c = data[:3]
162 >>> str(a)
163 '1.34'
164 >>> float(a)
165 1.3400000000000001
166 >>> round(a, 1) # round() first converts to binary floating point
167 1.3
168 >>> int(a)
169 1
170 >>> a * 5
171 Decimal("6.70")
172 >>> a * b
173 Decimal("2.5058")
174 >>> c % a
175 Decimal("0.77")
176
Georg Brandl9afde1c2007-11-01 20:32:30 +0000177And some mathematical functions are also available to Decimal::
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000178
179 >>> Decimal(2).sqrt()
180 Decimal("1.414213562373095048801688724")
181 >>> Decimal(1).exp()
182 Decimal("2.718281828459045235360287471")
183 >>> Decimal("10").ln()
184 Decimal("2.302585092994045684017991455")
185 >>> Decimal("10").log10()
186 Decimal("1")
187
Georg Brandl116aa622007-08-15 14:28:22 +0000188The :meth:`quantize` method rounds a number to a fixed exponent. This method is
189useful for monetary applications that often round results to a fixed number of
190places::
191
192 >>> Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
193 Decimal("7.32")
194 >>> Decimal('7.325').quantize(Decimal('1.'), rounding=ROUND_UP)
195 Decimal("8")
196
197As shown above, the :func:`getcontext` function accesses the current context and
198allows the settings to be changed. This approach meets the needs of most
199applications.
200
201For more advanced work, it may be useful to create alternate contexts using the
202Context() constructor. To make an alternate active, use the :func:`setcontext`
203function.
204
205In accordance with the standard, the :mod:`Decimal` module provides two ready to
206use standard contexts, :const:`BasicContext` and :const:`ExtendedContext`. The
207former is especially useful for debugging because many of the traps are
208enabled::
209
210 >>> myothercontext = Context(prec=60, rounding=ROUND_HALF_DOWN)
211 >>> setcontext(myothercontext)
212 >>> Decimal(1) / Decimal(7)
213 Decimal("0.142857142857142857142857142857142857142857142857142857142857")
214
215 >>> ExtendedContext
216 Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
217 capitals=1, flags=[], traps=[])
218 >>> setcontext(ExtendedContext)
219 >>> Decimal(1) / Decimal(7)
220 Decimal("0.142857143")
221 >>> Decimal(42) / Decimal(0)
222 Decimal("Infinity")
223
224 >>> setcontext(BasicContext)
225 >>> Decimal(42) / Decimal(0)
226 Traceback (most recent call last):
227 File "<pyshell#143>", line 1, in -toplevel-
228 Decimal(42) / Decimal(0)
229 DivisionByZero: x / 0
230
231Contexts also have signal flags for monitoring exceptional conditions
232encountered during computations. The flags remain set until explicitly cleared,
233so it is best to clear the flags before each set of monitored computations by
234using the :meth:`clear_flags` method. ::
235
236 >>> setcontext(ExtendedContext)
237 >>> getcontext().clear_flags()
238 >>> Decimal(355) / Decimal(113)
239 Decimal("3.14159292")
240 >>> getcontext()
241 Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
242 capitals=1, flags=[Inexact, Rounded], traps=[])
243
244The *flags* entry shows that the rational approximation to :const:`Pi` was
245rounded (digits beyond the context precision were thrown away) and that the
246result is inexact (some of the discarded digits were non-zero).
247
248Individual traps are set using the dictionary in the :attr:`traps` field of a
249context::
250
251 >>> Decimal(1) / Decimal(0)
252 Decimal("Infinity")
253 >>> getcontext().traps[DivisionByZero] = 1
254 >>> Decimal(1) / Decimal(0)
255 Traceback (most recent call last):
256 File "<pyshell#112>", line 1, in -toplevel-
257 Decimal(1) / Decimal(0)
258 DivisionByZero: x / 0
259
260Most programs adjust the current context only once, at the beginning of the
261program. And, in many applications, data is converted to :class:`Decimal` with
262a single cast inside a loop. With context set and decimals created, the bulk of
263the program manipulates the data no differently than with other Python numeric
264types.
265
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000266.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +0000267
268
269.. _decimal-decimal:
270
271Decimal objects
272---------------
273
274
275.. class:: Decimal([value [, context]])
276
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000277 Construct a new :class:`Decimal` object based from *value*.
Georg Brandl116aa622007-08-15 14:28:22 +0000278
279 *value* can be an integer, string, tuple, or another :class:`Decimal` object. If
280 no *value* is given, returns ``Decimal("0")``. If *value* is a string, it
281 should conform to the decimal numeric string syntax::
282
283 sign ::= '+' | '-'
284 digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
285 indicator ::= 'e' | 'E'
286 digits ::= digit [digit]...
287 decimal-part ::= digits '.' [digits] | ['.'] digits
288 exponent-part ::= indicator [sign] digits
289 infinity ::= 'Infinity' | 'Inf'
290 nan ::= 'NaN' [digits] | 'sNaN' [digits]
291 numeric-value ::= decimal-part [exponent-part] | infinity
292 numeric-string ::= [sign] numeric-value | [sign] nan
293
294 If *value* is a :class:`tuple`, it should have three components, a sign
295 (:const:`0` for positive or :const:`1` for negative), a :class:`tuple` of
296 digits, and an integer exponent. For example, ``Decimal((0, (1, 4, 1, 4), -3))``
297 returns ``Decimal("1.414")``.
298
299 The *context* precision does not affect how many digits are stored. That is
300 determined exclusively by the number of digits in *value*. For example,
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000301 ``Decimal("3.00000")`` records all five zeros even if the context precision is
Georg Brandl116aa622007-08-15 14:28:22 +0000302 only three.
303
304 The purpose of the *context* argument is determining what to do if *value* is a
305 malformed string. If the context traps :const:`InvalidOperation`, an exception
306 is raised; otherwise, the constructor returns a new Decimal with the value of
307 :const:`NaN`.
308
309 Once constructed, :class:`Decimal` objects are immutable.
310
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000311Decimal floating point objects share many properties with the other built-in
Georg Brandl116aa622007-08-15 14:28:22 +0000312numeric types such as :class:`float` and :class:`int`. All of the usual math
313operations and special methods apply. Likewise, decimal objects can be copied,
314pickled, printed, used as dictionary keys, used as set elements, compared,
Neil Schemenauer16c70752007-09-21 20:19:23 +0000315sorted, and converted to another type (such as :class:`float` or :class:`int`).
Georg Brandl116aa622007-08-15 14:28:22 +0000316
317In addition to the standard numeric properties, decimal floating point objects
318also have a number of specialized methods:
319
320
321.. method:: Decimal.adjusted()
322
323 Return the adjusted exponent after shifting out the coefficient's rightmost
324 digits until only the lead digit remains: ``Decimal("321e+5").adjusted()``
325 returns seven. Used for determining the position of the most significant digit
326 with respect to the decimal point.
327
328
329.. method:: Decimal.as_tuple()
330
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000331 Return a tuple representation of the number: ``(sign, digit_tuple, exponent)``.
Georg Brandl116aa622007-08-15 14:28:22 +0000332
333
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000334.. method:: Decimal.canonical()
335
336 Return the canonical encoding of the argument. Currently, the
337 encoding of a :class:`Decimal` instance is always canonical, so
338 this operation returns its argument unchanged.
339
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000340
Georg Brandl116aa622007-08-15 14:28:22 +0000341.. method:: Decimal.compare(other[, context])
342
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000343 Compare the values of two Decimal instances. This operation
344 behaves in the same way as the usual comparison method
345 :meth:`__cmp__`, except that :meth:`compare` returns a Decimal
346 instance rather than an integer, and if either operand is a NaN
347 then the result is a NaN::
Georg Brandl116aa622007-08-15 14:28:22 +0000348
349 a or b is a NaN ==> Decimal("NaN")
350 a < b ==> Decimal("-1")
351 a == b ==> Decimal("0")
352 a > b ==> Decimal("1")
353
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000354.. method:: Decimal.compare_signal(other[, context])
355
356 This operation is identical to the :meth:`compare` method, except
357 that all NaNs signal. That is, if neither operand is a signaling
358 NaN then any quiet NaN operand is treated as though it were a
359 signaling NaN.
360
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000361
362.. method:: Decimal.compare_total(other)
363
364 Compare two operands using their abstract representation rather
365 than their numerical value. Similar to the :meth:`compare` method,
366 but the result gives a total ordering on :class:`Decimal`
367 instances. Two :class:`Decimal` instances with the same numeric
368 value but different representations compare unequal in this
369 ordering::
370
371 >>> Decimal("12.0").compare_total(Decimal("12"))
372 Decimal("-1")
373
374 Quiet and signaling NaNs are also included in the total ordering.
375 The result of this function is ``Decimal("0")`` if both operands
376 have the same representation, ``Decimal("-1")`` if the first
377 operand is lower in the total order than the second, and
378 ``Decimal("1")`` if the first operand is higher in the total order
379 than the second operand. See the specification for details of the
380 total order.
381
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000382
383.. method:: Decimal.compare_total_mag(other)
384
385 Compare two operands using their abstract representation rather
386 than their value as in :meth:`compare_total`, but ignoring the sign
387 of each operand. ``x.compare_total_mag(y)`` is equivalent to
388 ``x.copy_abs().compare_total(y.copy_abs())``.
389
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000390
391.. method:: Decimal.copy_abs()
392
393 Return the absolute value of the argument. This operation is
394 unaffected by the context and is quiet: no flags are changed and no
395 rounding is performed.
396
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000397
398.. method:: Decimal.copy_negate()
399
400 Return the negation of the argument. This operation is unaffected
401 by the context and is quiet: no flags are changed and no rounding
402 is performed.
403
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000404
405.. method:: Decimal.copy_sign(other)
406
407 Return a copy of the first operand with the sign set to be the
408 same as the sign of the second operand. For example::
409
410 >>> Decimal("2.3").copy_sign(Decimal("-1.5"))
411 Decimal("-2.3")
412
413 This operation is unaffected by the context and is quiet: no flags
414 are changed and no rounding is performed.
415
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000416
417.. method:: Decimal.exp([context])
418
419 Return the value of the (natural) exponential function ``e**x`` at the
420 given number. The result is correctly rounded using the
421 :const:`ROUND_HALF_EVEN` rounding mode.
422
423 >>> Decimal(1).exp()
424 Decimal("2.718281828459045235360287471")
425 >>> Decimal(321).exp()
426 Decimal("2.561702493119680037517373933E+139")
427
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000428
429.. method:: Decimal.fma(other, third[, context])
430
431 Fused multiply-add. Return self*other+third with no rounding of
432 the intermediate product self*other.
433
434 >>> Decimal(2).fma(3, 5)
435 Decimal("11")
436
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000437
438.. method:: Decimal.is_canonical()
439
440 Return :const:`True` if the argument is canonical and
441 :const:`False` otherwise. Currently, a :class:`Decimal` instance
442 is always canonical, so this operation always returns
443 :const:`True`.
444
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000445
446.. method:: is_finite()
447
448 Return :const:`True` if the argument is a finite number, and
449 :const:`False` if the argument is an infinity or a NaN.
450
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000451
452.. method:: is_infinite()
453
454 Return :const:`True` if the argument is either positive or
455 negative infinity and :const:`False` otherwise.
456
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000457
458.. method:: is_nan()
459
460 Return :const:`True` if the argument is a (quiet or signaling)
461 NaN and :const:`False` otherwise.
462
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000463
464.. method:: is_normal()
465
466 Return :const:`True` if the argument is a *normal* finite number.
467 Return :const:`False` if the argument is zero, subnormal, infinite
468 or a NaN.
469
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000470
471.. method:: is_qnan()
472
473 Return :const:`True` if the argument is a quiet NaN, and
474 :const:`False` otherwise.
475
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000476
477.. method:: is_signed()
478
479 Return :const:`True` if the argument has a negative sign and
480 :const:`False` otherwise. Note that zeros and NaNs can both carry
481 signs.
482
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000483
484.. method:: is_snan()
485
486 Return :const:`True` if the argument is a signaling NaN and
487 :const:`False` otherwise.
488
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000489
490.. method:: is_subnormal()
491
492 Return :const:`True` if the argument is subnormal, and
493 :const:`False` otherwise.
494
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000495
496.. method:: is_zero()
497
498 Return :const:`True` if the argument is a (positive or negative)
499 zero and :const:`False` otherwise.
500
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000501
502.. method:: Decimal.ln([context])
503
504 Return the natural (base e) logarithm of the operand. The result
505 is correctly rounded using the :const:`ROUND_HALF_EVEN` rounding
506 mode.
507
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000508
509.. method:: Decimal.log10([context])
510
511 Return the base ten logarithm of the operand. The result is
512 correctly rounded using the :const:`ROUND_HALF_EVEN` rounding mode.
513
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000514
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000515.. method:: Decimal.logb([context])
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000516
517 For a nonzero number, return the adjusted exponent of its operand
518 as a :class:`Decimal` instance. If the operand is a zero then
519 ``Decimal("-Infinity")`` is returned and the
520 :const:`DivisionByZero` flag is raised. If the operand is an
521 infinity then ``Decimal("Infinity")`` is returned.
522
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000523
524.. method:: Decimal.logical_and(other[, context])
525
526 :meth:`logical_and` is a logical operation which takes two
527 *logical operands* (see :ref:`logical_operands_label`). The result
528 is the digit-wise ``and`` of the two operands.
529
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000530
531.. method:: Decimal.logical_invert(other[, context])
532
533 :meth:`logical_invert` is a logical operation. The argument must
534 be a *logical operand* (see :ref:`logical_operands_label`). The
535 result is the digit-wise inversion of the operand.
536
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000537
538.. method:: Decimal.logical_or(other[, context])
539
540 :meth:`logical_or` is a logical operation which takes two *logical
541 operands* (see :ref:`logical_operands_label`). The result is the
542 digit-wise ``or`` of the two operands.
543
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000544
545.. method:: Decimal.logical_xor(other[, context])
546
547 :meth:`logical_xor` is a logical operation which takes two
548 *logical operands* (see :ref:`logical_operands_label`). The result
549 is the digit-wise exclusive or of the two operands.
550
Georg Brandl116aa622007-08-15 14:28:22 +0000551
552.. method:: Decimal.max(other[, context])
553
554 Like ``max(self, other)`` except that the context rounding rule is applied
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000555 before returning and that :const:`NaN` values are either signaled or ignored
Georg Brandl116aa622007-08-15 14:28:22 +0000556 (depending on the context and whether they are signaling or quiet).
557
Georg Brandl6554cb92007-12-02 23:15:43 +0000558
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000559.. method:: Decimal.max_mag(other[, context])
560
561 Similar to the :meth:`max` method, but the comparison is done using
562 the absolute values of the operands.
563
Georg Brandl116aa622007-08-15 14:28:22 +0000564
565.. method:: Decimal.min(other[, context])
566
567 Like ``min(self, other)`` except that the context rounding rule is applied
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000568 before returning and that :const:`NaN` values are either signaled or ignored
Georg Brandl116aa622007-08-15 14:28:22 +0000569 (depending on the context and whether they are signaling or quiet).
570
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000571.. method:: Decimal.min_mag(other[, context])
572
573 Similar to the :meth:`min` method, but the comparison is done using
574 the absolute values of the operands.
575
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000576
577.. method:: Decimal.next_minus([context])
578
579 Return the largest number representable in the given context (or
580 in the current thread's context if no context is given) that is smaller
581 than the given operand.
582
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000583
584.. method:: Decimal.next_plus([context])
585
586 Return the smallest number representable in the given context (or
587 in the current thread's context if no context is given) that is
588 larger than the given operand.
589
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000590
591.. method:: Decimal.next_toward(other[, context])
592
593 If the two operands are unequal, return the number closest to the
594 first operand in the direction of the second operand. If both
595 operands are numerically equal, return a copy of the first operand
596 with the sign set to be the same as the sign of the second operand.
597
Georg Brandl116aa622007-08-15 14:28:22 +0000598
599.. method:: Decimal.normalize([context])
600
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000601 Normalize the number by stripping the rightmost trailing zeros and converting
Georg Brandl116aa622007-08-15 14:28:22 +0000602 any result equal to :const:`Decimal("0")` to :const:`Decimal("0e0")`. Used for
603 producing canonical values for members of an equivalence class. For example,
604 ``Decimal("32.100")`` and ``Decimal("0.321000e+2")`` both normalize to the
605 equivalent value ``Decimal("32.1")``.
606
Georg Brandl6554cb92007-12-02 23:15:43 +0000607
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000608.. method:: Decimal.number_class([context])
Georg Brandl116aa622007-08-15 14:28:22 +0000609
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000610 Return a string describing the *class* of the operand. The
611 returned value is one of the following ten strings.
Georg Brandl116aa622007-08-15 14:28:22 +0000612
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000613 * ``"-Infinity"``, indicating that the operand is negative infinity.
614 * ``"-Normal"``, indicating that the operand is a negative normal number.
615 * ``"-Subnormal"``, indicating that the operand is negative and subnormal.
616 * ``"-Zero"``, indicating that the operand is a negative zero.
617 * ``"+Zero"``, indicating that the operand is a positive zero.
618 * ``"+Subnormal"``, indicating that the operand is positive and subnormal.
619 * ``"+Normal"``, indicating that the operand is a positive normal number.
620 * ``"+Infinity"``, indicating that the operand is positive infinity.
621 * ``"NaN"``, indicating that the operand is a quiet NaN (Not a Number).
622 * ``"sNaN"``, indicating that the operand is a signaling NaN.
Georg Brandl116aa622007-08-15 14:28:22 +0000623
Georg Brandl116aa622007-08-15 14:28:22 +0000624
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000625.. method:: Decimal.quantize(exp[, rounding[, context[, watchexp]]])
626
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000627 Return a value equal to the first operand after rounding and
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000628 having the exponent of the second operand.
629
630 >>> Decimal("1.41421356").quantize(Decimal("1.000"))
631 Decimal("1.414")
632
633 Unlike other operations, if the length of the coefficient after the
634 quantize operation would be greater than precision, then an
635 :const:`InvalidOperation` is signaled. This guarantees that, unless
636 there is an error condition, the quantized exponent is always equal
637 to that of the right-hand operand.
638
639 Also unlike other operations, quantize never signals Underflow,
640 even if the result is subnormal and inexact.
641
642 If the exponent of the second operand is larger than that of the
643 first then rounding may be necessary. In this case, the rounding
644 mode is determined by the ``rounding`` argument if given, else by
645 the given ``context`` argument; if neither argument is given the
646 rounding mode of the current thread's context is used.
647
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000648 If *watchexp* is set (default), then an error is returned whenever the
649 resulting exponent is greater than :attr:`Emax` or less than :attr:`Etiny`.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000650
651.. method:: Decimal.radix()
652
653 Return ``Decimal(10)``, the radix (base) in which the
654 :class:`Decimal` class does all its arithmetic. Included for
655 compatibility with the specification.
656
Georg Brandl116aa622007-08-15 14:28:22 +0000657
658.. method:: Decimal.remainder_near(other[, context])
659
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000660 Compute the modulo as either a positive or negative value depending on which is
Georg Brandl116aa622007-08-15 14:28:22 +0000661 closest to zero. For instance, ``Decimal(10).remainder_near(6)`` returns
662 ``Decimal("-2")`` which is closer to zero than ``Decimal("4")``.
663
664 If both are equally close, the one chosen will have the same sign as *self*.
665
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000666.. method:: Decimal.rotate(other[, context])
667
668 Return the result of rotating the digits of the first operand by
669 an amount specified by the second operand. The second operand
670 must be an integer in the range -precision through precision. The
671 absolute value of the second operand gives the number of places to
672 rotate. If the second operand is positive then rotation is to the
673 left; otherwise rotation is to the right. The coefficient of the
674 first operand is padded on the left with zeros to length precision
675 if necessary. The sign and exponent of the first operand are
676 unchanged.
677
Georg Brandl116aa622007-08-15 14:28:22 +0000678
679.. method:: Decimal.same_quantum(other[, context])
680
681 Test whether self and other have the same exponent or whether both are
682 :const:`NaN`.
683
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000684.. method:: Decimal.scaleb(other[, context])
685
686 Return the first operand with exponent adjusted by the second.
687 Equivalently, return the first operand multiplied by ``10**other``.
688 The second operand must be an integer.
689
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000690
691.. method:: Decimal.shift(other[, context])
692
693 Return the result of shifting the digits of the first operand by
694 an amount specified by the second operand. The second operand must
695 be an integer in the range -precision through precision. The
696 absolute value of the second operand gives the number of places to
697 shift. If the second operand is positive then the shift is to the
698 left; otherwise the shift is to the right. Digits shifted into the
699 coefficient are zeros. The sign and exponent of the first operand
700 are unchanged.
701
Georg Brandl116aa622007-08-15 14:28:22 +0000702
703.. method:: Decimal.sqrt([context])
704
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000705 Return the square root of the argument to full precision.
Georg Brandl116aa622007-08-15 14:28:22 +0000706
707
708.. method:: Decimal.to_eng_string([context])
709
710 Convert to an engineering-type string.
711
712 Engineering notation has an exponent which is a multiple of 3, so there are up
713 to 3 digits left of the decimal place. For example, converts
714 ``Decimal('123E+1')`` to ``Decimal("1.23E+3")``
715
Georg Brandl116aa622007-08-15 14:28:22 +0000716.. method:: Decimal.to_integral([rounding[, context]])
717
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000718 Identical to the :meth:`to_integral_value` method. The ``to_integral``
719 name has been kept for compatibility with older versions.
720
721.. method:: Decimal.to_integral_exact([rounding[, context]])
722
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000723 Round to the nearest integer, signaling
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000724 :const:`Inexact` or :const:`Rounded` as appropriate if rounding
725 occurs. The rounding mode is determined by the ``rounding``
726 parameter if given, else by the given ``context``. If neither
727 parameter is given then the rounding mode of the current context is
728 used.
729
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000730
731.. method:: Decimal.to_integral_value([rounding[, context]])
732
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000733 Round to the nearest integer without signaling :const:`Inexact` or
Georg Brandl116aa622007-08-15 14:28:22 +0000734 :const:`Rounded`. If given, applies *rounding*; otherwise, uses the rounding
735 method in either the supplied *context* or the current context.
736
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000737
738.. method:: Decimal.trim()
739
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000740 Return the decimal with *insignificant* trailing zeros removed.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000741 Here, a trailing zero is considered insignificant either if it
742 follows the decimal point, or if the exponent of the argument (that
743 is, the last element of the :meth:`as_tuple` representation) is
744 positive.
745
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000746
747.. _logical_operands_label:
748
749Logical operands
750^^^^^^^^^^^^^^^^
751
752The :meth:`logical_and`, :meth:`logical_invert`, :meth:`logical_or`,
753and :meth:`logical_xor` methods expect their arguments to be *logical
754operands*. A *logical operand* is a :class:`Decimal` instance whose
755exponent and sign are both zero, and whose digits are all either
756:const:`0` or :const:`1`.
757
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000758.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +0000759
760
761.. _decimal-context:
762
763Context objects
764---------------
765
766Contexts are environments for arithmetic operations. They govern precision, set
767rules for rounding, determine which signals are treated as exceptions, and limit
768the range for exponents.
769
770Each thread has its own current context which is accessed or changed using the
771:func:`getcontext` and :func:`setcontext` functions:
772
773
774.. function:: getcontext()
775
776 Return the current context for the active thread.
777
778
779.. function:: setcontext(c)
780
781 Set the current context for the active thread to *c*.
782
783Beginning with Python 2.5, you can also use the :keyword:`with` statement and
784the :func:`localcontext` function to temporarily change the active context.
785
786
787.. function:: localcontext([c])
788
789 Return a context manager that will set the current context for the active thread
790 to a copy of *c* on entry to the with-statement and restore the previous context
791 when exiting the with-statement. If no context is specified, a copy of the
792 current context is used.
793
Georg Brandl116aa622007-08-15 14:28:22 +0000794 For example, the following code sets the current decimal precision to 42 places,
795 performs a calculation, and then automatically restores the previous context::
796
Georg Brandl116aa622007-08-15 14:28:22 +0000797 from decimal import localcontext
798
799 with localcontext() as ctx:
800 ctx.prec = 42 # Perform a high precision calculation
801 s = calculate_something()
802 s = +s # Round the final result back to the default precision
803
804New contexts can also be created using the :class:`Context` constructor
805described below. In addition, the module provides three pre-made contexts:
806
807
808.. class:: BasicContext
809
810 This is a standard context defined by the General Decimal Arithmetic
811 Specification. Precision is set to nine. Rounding is set to
812 :const:`ROUND_HALF_UP`. All flags are cleared. All traps are enabled (treated
813 as exceptions) except :const:`Inexact`, :const:`Rounded`, and
814 :const:`Subnormal`.
815
816 Because many of the traps are enabled, this context is useful for debugging.
817
818
819.. class:: ExtendedContext
820
821 This is a standard context defined by the General Decimal Arithmetic
822 Specification. Precision is set to nine. Rounding is set to
823 :const:`ROUND_HALF_EVEN`. All flags are cleared. No traps are enabled (so that
824 exceptions are not raised during computations).
825
826 Because the trapped are disabled, this context is useful for applications that
827 prefer to have result value of :const:`NaN` or :const:`Infinity` instead of
828 raising exceptions. This allows an application to complete a run in the
829 presence of conditions that would otherwise halt the program.
830
831
832.. class:: DefaultContext
833
834 This context is used by the :class:`Context` constructor as a prototype for new
835 contexts. Changing a field (such a precision) has the effect of changing the
836 default for new contexts creating by the :class:`Context` constructor.
837
838 This context is most useful in multi-threaded environments. Changing one of the
839 fields before threads are started has the effect of setting system-wide
840 defaults. Changing the fields after threads have started is not recommended as
841 it would require thread synchronization to prevent race conditions.
842
843 In single threaded environments, it is preferable to not use this context at
844 all. Instead, simply create contexts explicitly as described below.
845
846 The default values are precision=28, rounding=ROUND_HALF_EVEN, and enabled traps
847 for Overflow, InvalidOperation, and DivisionByZero.
848
849In addition to the three supplied contexts, new contexts can be created with the
850:class:`Context` constructor.
851
852
853.. class:: Context(prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=1)
854
855 Creates a new context. If a field is not specified or is :const:`None`, the
856 default values are copied from the :const:`DefaultContext`. If the *flags*
857 field is not specified or is :const:`None`, all flags are cleared.
858
859 The *prec* field is a positive integer that sets the precision for arithmetic
860 operations in the context.
861
862 The *rounding* option is one of:
863
864 * :const:`ROUND_CEILING` (towards :const:`Infinity`),
865 * :const:`ROUND_DOWN` (towards zero),
866 * :const:`ROUND_FLOOR` (towards :const:`-Infinity`),
867 * :const:`ROUND_HALF_DOWN` (to nearest with ties going towards zero),
868 * :const:`ROUND_HALF_EVEN` (to nearest with ties going to nearest even integer),
869 * :const:`ROUND_HALF_UP` (to nearest with ties going away from zero), or
870 * :const:`ROUND_UP` (away from zero).
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000871 * :const:`ROUND_05UP` (away from zero if last digit after rounding towards zero
872 would have been 0 or 5; otherwise towards zero)
Georg Brandl116aa622007-08-15 14:28:22 +0000873
874 The *traps* and *flags* fields list any signals to be set. Generally, new
875 contexts should only set traps and leave the flags clear.
876
877 The *Emin* and *Emax* fields are integers specifying the outer limits allowable
878 for exponents.
879
880 The *capitals* field is either :const:`0` or :const:`1` (the default). If set to
881 :const:`1`, exponents are printed with a capital :const:`E`; otherwise, a
882 lowercase :const:`e` is used: :const:`Decimal('6.02e+23')`.
883
Georg Brandl116aa622007-08-15 14:28:22 +0000884
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000885The :class:`Context` class defines several general purpose methods as
886well as a large number of methods for doing arithmetic directly in a
887given context. In addition, for each of the :class:`Decimal` methods
888described above (with the exception of the :meth:`adjusted` and
889:meth:`as_tuple` methods) there is a corresponding :class:`Context`
890method. For example, ``C.exp(x)`` is equivalent to
891``x.exp(context=C)``.
Georg Brandl116aa622007-08-15 14:28:22 +0000892
893.. method:: Context.clear_flags()
894
895 Resets all of the flags to :const:`0`.
896
897
898.. method:: Context.copy()
899
900 Return a duplicate of the context.
901
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000902.. method:: Context.copy_decimal(num)
903
904 Return a copy of the Decimal instance num.
Georg Brandl116aa622007-08-15 14:28:22 +0000905
906.. method:: Context.create_decimal(num)
907
908 Creates a new Decimal instance from *num* but using *self* as context. Unlike
909 the :class:`Decimal` constructor, the context precision, rounding method, flags,
910 and traps are applied to the conversion.
911
912 This is useful because constants are often given to a greater precision than is
913 needed by the application. Another benefit is that rounding immediately
914 eliminates unintended effects from digits beyond the current precision. In the
915 following example, using unrounded inputs means that adding zero to a sum can
916 change the result::
917
918 >>> getcontext().prec = 3
919 >>> Decimal("3.4445") + Decimal("1.0023")
920 Decimal("4.45")
921 >>> Decimal("3.4445") + Decimal(0) + Decimal("1.0023")
922 Decimal("4.44")
923
924
925.. method:: Context.Etiny()
926
927 Returns a value equal to ``Emin - prec + 1`` which is the minimum exponent value
928 for subnormal results. When underflow occurs, the exponent is set to
929 :const:`Etiny`.
930
931
932.. method:: Context.Etop()
933
934 Returns a value equal to ``Emax - prec + 1``.
935
936The usual approach to working with decimals is to create :class:`Decimal`
937instances and then apply arithmetic operations which take place within the
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000938current context for the active thread. An alternative approach is to use context
Georg Brandl116aa622007-08-15 14:28:22 +0000939methods for calculating within a specific context. The methods are similar to
940those for the :class:`Decimal` class and are only briefly recounted here.
941
942
943.. method:: Context.abs(x)
944
945 Returns the absolute value of *x*.
946
947
948.. method:: Context.add(x, y)
949
950 Return the sum of *x* and *y*.
951
952
Georg Brandl116aa622007-08-15 14:28:22 +0000953.. method:: Context.divide(x, y)
954
955 Return *x* divided by *y*.
956
957
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000958.. method:: Context.divide_int(x, y)
959
960 Return *x* divided by *y*, truncated to an integer.
961
962
Georg Brandl116aa622007-08-15 14:28:22 +0000963.. method:: Context.divmod(x, y)
964
965 Divides two numbers and returns the integer part of the result.
966
967
Georg Brandl116aa622007-08-15 14:28:22 +0000968.. method:: Context.minus(x)
969
970 Minus corresponds to the unary prefix minus operator in Python.
971
972
973.. method:: Context.multiply(x, y)
974
975 Return the product of *x* and *y*.
976
977
Georg Brandl116aa622007-08-15 14:28:22 +0000978.. method:: Context.plus(x)
979
980 Plus corresponds to the unary prefix plus operator in Python. This operation
981 applies the context precision and rounding, so it is *not* an identity
982 operation.
983
984
985.. method:: Context.power(x, y[, modulo])
986
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000987 Return ``x`` to the power of ``y``, reduced modulo ``modulo`` if
988 given.
Georg Brandl116aa622007-08-15 14:28:22 +0000989
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000990 With two arguments, compute ``x**y``. If ``x`` is negative then
991 ``y`` must be integral. The result will be inexact unless ``y`` is
992 integral and the result is finite and can be expressed exactly in
993 'precision' digits. The result should always be correctly rounded,
994 using the rounding mode of the current thread's context.
Georg Brandl116aa622007-08-15 14:28:22 +0000995
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000996 With three arguments, compute ``(x**y) % modulo``. For the three
997 argument form, the following restrictions on the arguments hold:
Georg Brandl116aa622007-08-15 14:28:22 +0000998
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000999 - all three arguments must be integral
1000 - ``y`` must be nonnegative
1001 - at least one of ``x`` or ``y`` must be nonzero
1002 - ``modulo`` must be nonzero and have at most 'precision' digits
Georg Brandl116aa622007-08-15 14:28:22 +00001003
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001004 The result of ``Context.power(x, y, modulo)`` is identical to
1005 the result that would be obtained by computing ``(x**y) %
1006 modulo`` with unbounded precision, but is computed more
1007 efficiently. It is always exact.
Georg Brandl116aa622007-08-15 14:28:22 +00001008
Georg Brandl116aa622007-08-15 14:28:22 +00001009
1010.. method:: Context.remainder(x, y)
1011
1012 Returns the remainder from integer division.
1013
1014 The sign of the result, if non-zero, is the same as that of the original
1015 dividend.
1016
Georg Brandl116aa622007-08-15 14:28:22 +00001017.. method:: Context.subtract(x, y)
1018
1019 Return the difference between *x* and *y*.
1020
Georg Brandl116aa622007-08-15 14:28:22 +00001021.. method:: Context.to_sci_string(x)
1022
1023 Converts a number to a string using scientific notation.
1024
Christian Heimes5b5e81c2007-12-31 16:14:33 +00001025.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +00001026
1027
1028.. _decimal-signals:
1029
1030Signals
1031-------
1032
1033Signals represent conditions that arise during computation. Each corresponds to
1034one context flag and one context trap enabler.
1035
1036The context flag is incremented whenever the condition is encountered. After the
1037computation, flags may be checked for informational purposes (for instance, to
1038determine whether a computation was exact). After checking the flags, be sure to
1039clear all flags before starting the next computation.
1040
1041If the context's trap enabler is set for the signal, then the condition causes a
1042Python exception to be raised. For example, if the :class:`DivisionByZero` trap
1043is set, then a :exc:`DivisionByZero` exception is raised upon encountering the
1044condition.
1045
1046
1047.. class:: Clamped
1048
1049 Altered an exponent to fit representation constraints.
1050
1051 Typically, clamping occurs when an exponent falls outside the context's
1052 :attr:`Emin` and :attr:`Emax` limits. If possible, the exponent is reduced to
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001053 fit by adding zeros to the coefficient.
Georg Brandl116aa622007-08-15 14:28:22 +00001054
1055
1056.. class:: DecimalException
1057
1058 Base class for other signals and a subclass of :exc:`ArithmeticError`.
1059
1060
1061.. class:: DivisionByZero
1062
1063 Signals the division of a non-infinite number by zero.
1064
1065 Can occur with division, modulo division, or when raising a number to a negative
1066 power. If this signal is not trapped, returns :const:`Infinity` or
1067 :const:`-Infinity` with the sign determined by the inputs to the calculation.
1068
1069
1070.. class:: Inexact
1071
1072 Indicates that rounding occurred and the result is not exact.
1073
1074 Signals when non-zero digits were discarded during rounding. The rounded result
1075 is returned. The signal flag or trap is used to detect when results are
1076 inexact.
1077
1078
1079.. class:: InvalidOperation
1080
1081 An invalid operation was performed.
1082
1083 Indicates that an operation was requested that does not make sense. If not
1084 trapped, returns :const:`NaN`. Possible causes include::
1085
1086 Infinity - Infinity
1087 0 * Infinity
1088 Infinity / Infinity
1089 x % 0
1090 Infinity % x
1091 x._rescale( non-integer )
1092 sqrt(-x) and x > 0
1093 0 ** 0
1094 x ** (non-integer)
1095 x ** Infinity
1096
1097
1098.. class:: Overflow
1099
1100 Numerical overflow.
1101
1102 Indicates the exponent is larger than :attr:`Emax` after rounding has occurred.
1103 If not trapped, the result depends on the rounding mode, either pulling inward
1104 to the largest representable finite number or rounding outward to
1105 :const:`Infinity`. In either case, :class:`Inexact` and :class:`Rounded` are
1106 also signaled.
1107
1108
1109.. class:: Rounded
1110
1111 Rounding occurred though possibly no information was lost.
1112
1113 Signaled whenever rounding discards digits; even if those digits are zero (such
1114 as rounding :const:`5.00` to :const:`5.0`). If not trapped, returns the result
1115 unchanged. This signal is used to detect loss of significant digits.
1116
1117
1118.. class:: Subnormal
1119
1120 Exponent was lower than :attr:`Emin` prior to rounding.
1121
1122 Occurs when an operation result is subnormal (the exponent is too small). If not
1123 trapped, returns the result unchanged.
1124
1125
1126.. class:: Underflow
1127
1128 Numerical underflow with result rounded to zero.
1129
1130 Occurs when a subnormal result is pushed to zero by rounding. :class:`Inexact`
1131 and :class:`Subnormal` are also signaled.
1132
1133The following table summarizes the hierarchy of signals::
1134
1135 exceptions.ArithmeticError(exceptions.Exception)
1136 DecimalException
1137 Clamped
1138 DivisionByZero(DecimalException, exceptions.ZeroDivisionError)
1139 Inexact
1140 Overflow(Inexact, Rounded)
1141 Underflow(Inexact, Rounded, Subnormal)
1142 InvalidOperation
1143 Rounded
1144 Subnormal
1145
Christian Heimes5b5e81c2007-12-31 16:14:33 +00001146.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +00001147
1148
1149.. _decimal-notes:
1150
1151Floating Point Notes
1152--------------------
1153
1154
1155Mitigating round-off error with increased precision
1156^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1157
1158The use of decimal floating point eliminates decimal representation error
1159(making it possible to represent :const:`0.1` exactly); however, some operations
1160can still incur round-off error when non-zero digits exceed the fixed precision.
1161
1162The effects of round-off error can be amplified by the addition or subtraction
1163of nearly offsetting quantities resulting in loss of significance. Knuth
1164provides two instructive examples where rounded floating point arithmetic with
1165insufficient precision causes the breakdown of the associative and distributive
1166properties of addition::
1167
1168 # Examples from Seminumerical Algorithms, Section 4.2.2.
1169 >>> from decimal import Decimal, getcontext
1170 >>> getcontext().prec = 8
1171
1172 >>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')
1173 >>> (u + v) + w
1174 Decimal("9.5111111")
1175 >>> u + (v + w)
1176 Decimal("10")
1177
1178 >>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
1179 >>> (u*v) + (u*w)
1180 Decimal("0.01")
1181 >>> u * (v+w)
1182 Decimal("0.0060000")
1183
1184The :mod:`decimal` module makes it possible to restore the identities by
1185expanding the precision sufficiently to avoid loss of significance::
1186
1187 >>> getcontext().prec = 20
1188 >>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')
1189 >>> (u + v) + w
1190 Decimal("9.51111111")
1191 >>> u + (v + w)
1192 Decimal("9.51111111")
1193 >>>
1194 >>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
1195 >>> (u*v) + (u*w)
1196 Decimal("0.0060000")
1197 >>> u * (v+w)
1198 Decimal("0.0060000")
1199
1200
1201Special values
1202^^^^^^^^^^^^^^
1203
1204The number system for the :mod:`decimal` module provides special values
1205including :const:`NaN`, :const:`sNaN`, :const:`-Infinity`, :const:`Infinity`,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001206and two zeros, :const:`+0` and :const:`-0`.
Georg Brandl116aa622007-08-15 14:28:22 +00001207
1208Infinities can be constructed directly with: ``Decimal('Infinity')``. Also,
1209they can arise from dividing by zero when the :exc:`DivisionByZero` signal is
1210not trapped. Likewise, when the :exc:`Overflow` signal is not trapped, infinity
1211can result from rounding beyond the limits of the largest representable number.
1212
1213The infinities are signed (affine) and can be used in arithmetic operations
1214where they get treated as very large, indeterminate numbers. For instance,
1215adding a constant to infinity gives another infinite result.
1216
1217Some operations are indeterminate and return :const:`NaN`, or if the
1218:exc:`InvalidOperation` signal is trapped, raise an exception. For example,
1219``0/0`` returns :const:`NaN` which means "not a number". This variety of
1220:const:`NaN` is quiet and, once created, will flow through other computations
1221always resulting in another :const:`NaN`. This behavior can be useful for a
1222series of computations that occasionally have missing inputs --- it allows the
1223calculation to proceed while flagging specific results as invalid.
1224
1225A variant is :const:`sNaN` which signals rather than remaining quiet after every
1226operation. This is a useful return value when an invalid result needs to
1227interrupt a calculation for special handling.
1228
1229The signed zeros can result from calculations that underflow. They keep the sign
1230that would have resulted if the calculation had been carried out to greater
1231precision. Since their magnitude is zero, both positive and negative zeros are
1232treated as equal and their sign is informational.
1233
1234In addition to the two signed zeros which are distinct yet equal, there are
1235various representations of zero with differing precisions yet equivalent in
1236value. This takes a bit of getting used to. For an eye accustomed to
1237normalized floating point representations, it is not immediately obvious that
1238the following calculation returns a value equal to zero::
1239
1240 >>> 1 / Decimal('Infinity')
1241 Decimal("0E-1000000026")
1242
Christian Heimes5b5e81c2007-12-31 16:14:33 +00001243.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +00001244
1245
1246.. _decimal-threads:
1247
1248Working with threads
1249--------------------
1250
1251The :func:`getcontext` function accesses a different :class:`Context` object for
1252each thread. Having separate thread contexts means that threads may make
1253changes (such as ``getcontext.prec=10``) without interfering with other threads.
1254
1255Likewise, the :func:`setcontext` function automatically assigns its target to
1256the current thread.
1257
1258If :func:`setcontext` has not been called before :func:`getcontext`, then
1259:func:`getcontext` will automatically create a new context for use in the
1260current thread.
1261
1262The new context is copied from a prototype context called *DefaultContext*. To
1263control the defaults so that each thread will use the same values throughout the
1264application, directly modify the *DefaultContext* object. This should be done
1265*before* any threads are started so that there won't be a race condition between
1266threads calling :func:`getcontext`. For example::
1267
1268 # Set applicationwide defaults for all threads about to be launched
1269 DefaultContext.prec = 12
1270 DefaultContext.rounding = ROUND_DOWN
1271 DefaultContext.traps = ExtendedContext.traps.copy()
1272 DefaultContext.traps[InvalidOperation] = 1
1273 setcontext(DefaultContext)
1274
1275 # Afterwards, the threads can be started
1276 t1.start()
1277 t2.start()
1278 t3.start()
1279 . . .
1280
Christian Heimes5b5e81c2007-12-31 16:14:33 +00001281.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +00001282
1283
1284.. _decimal-recipes:
1285
1286Recipes
1287-------
1288
1289Here are a few recipes that serve as utility functions and that demonstrate ways
1290to work with the :class:`Decimal` class::
1291
1292 def moneyfmt(value, places=2, curr='', sep=',', dp='.',
1293 pos='', neg='-', trailneg=''):
1294 """Convert Decimal to a money formatted string.
1295
1296 places: required number of places after the decimal point
1297 curr: optional currency symbol before the sign (may be blank)
1298 sep: optional grouping separator (comma, period, space, or blank)
1299 dp: decimal point indicator (comma or period)
1300 only specify as blank when places is zero
1301 pos: optional sign for positive numbers: '+', space or blank
1302 neg: optional sign for negative numbers: '-', '(', space or blank
1303 trailneg:optional trailing minus indicator: '-', ')', space or blank
1304
1305 >>> d = Decimal('-1234567.8901')
1306 >>> moneyfmt(d, curr='$')
1307 '-$1,234,567.89'
1308 >>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-')
1309 '1.234.568-'
1310 >>> moneyfmt(d, curr='$', neg='(', trailneg=')')
1311 '($1,234,567.89)'
1312 >>> moneyfmt(Decimal(123456789), sep=' ')
1313 '123 456 789.00'
1314 >>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')
1315 '<.02>'
1316
1317 """
1318 q = Decimal((0, (1,), -places)) # 2 places --> '0.01'
1319 sign, digits, exp = value.quantize(q).as_tuple()
1320 assert exp == -places
1321 result = []
1322 digits = map(str, digits)
1323 build, next = result.append, digits.pop
1324 if sign:
1325 build(trailneg)
1326 for i in range(places):
1327 if digits:
1328 build(next())
1329 else:
1330 build('0')
1331 build(dp)
1332 i = 0
1333 while digits:
1334 build(next())
1335 i += 1
1336 if i == 3 and digits:
1337 i = 0
1338 build(sep)
1339 build(curr)
1340 if sign:
1341 build(neg)
1342 else:
1343 build(pos)
1344 result.reverse()
1345 return ''.join(result)
1346
1347 def pi():
1348 """Compute Pi to the current precision.
1349
Georg Brandl6911e3c2007-09-04 07:15:32 +00001350 >>> print(pi())
Georg Brandl116aa622007-08-15 14:28:22 +00001351 3.141592653589793238462643383
1352
1353 """
1354 getcontext().prec += 2 # extra digits for intermediate steps
1355 three = Decimal(3) # substitute "three=3.0" for regular floats
1356 lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
1357 while s != lasts:
1358 lasts = s
1359 n, na = n+na, na+8
1360 d, da = d+da, da+32
1361 t = (t * n) / d
1362 s += t
1363 getcontext().prec -= 2
1364 return +s # unary plus applies the new precision
1365
1366 def exp(x):
1367 """Return e raised to the power of x. Result type matches input type.
1368
Georg Brandl6911e3c2007-09-04 07:15:32 +00001369 >>> print(exp(Decimal(1)))
Georg Brandl116aa622007-08-15 14:28:22 +00001370 2.718281828459045235360287471
Georg Brandl6911e3c2007-09-04 07:15:32 +00001371 >>> print(exp(Decimal(2)))
Georg Brandl116aa622007-08-15 14:28:22 +00001372 7.389056098930650227230427461
Georg Brandl6911e3c2007-09-04 07:15:32 +00001373 >>> print(exp(2.0))
Georg Brandl116aa622007-08-15 14:28:22 +00001374 7.38905609893
Georg Brandl6911e3c2007-09-04 07:15:32 +00001375 >>> print(exp(2+0j))
Georg Brandl116aa622007-08-15 14:28:22 +00001376 (7.38905609893+0j)
1377
1378 """
1379 getcontext().prec += 2
1380 i, lasts, s, fact, num = 0, 0, 1, 1, 1
1381 while s != lasts:
1382 lasts = s
1383 i += 1
1384 fact *= i
1385 num *= x
1386 s += num / fact
1387 getcontext().prec -= 2
1388 return +s
1389
1390 def cos(x):
1391 """Return the cosine of x as measured in radians.
1392
Georg Brandl6911e3c2007-09-04 07:15:32 +00001393 >>> print(cos(Decimal('0.5')))
Georg Brandl116aa622007-08-15 14:28:22 +00001394 0.8775825618903727161162815826
Georg Brandl6911e3c2007-09-04 07:15:32 +00001395 >>> print(cos(0.5))
Georg Brandl116aa622007-08-15 14:28:22 +00001396 0.87758256189
Georg Brandl6911e3c2007-09-04 07:15:32 +00001397 >>> print(cos(0.5+0j))
Georg Brandl116aa622007-08-15 14:28:22 +00001398 (0.87758256189+0j)
1399
1400 """
1401 getcontext().prec += 2
1402 i, lasts, s, fact, num, sign = 0, 0, 1, 1, 1, 1
1403 while s != lasts:
1404 lasts = s
1405 i += 2
1406 fact *= i * (i-1)
1407 num *= x * x
1408 sign *= -1
1409 s += num / fact * sign
1410 getcontext().prec -= 2
1411 return +s
1412
1413 def sin(x):
1414 """Return the sine of x as measured in radians.
1415
Georg Brandl6911e3c2007-09-04 07:15:32 +00001416 >>> print(sin(Decimal('0.5')))
Georg Brandl116aa622007-08-15 14:28:22 +00001417 0.4794255386042030002732879352
Georg Brandl6911e3c2007-09-04 07:15:32 +00001418 >>> print(sin(0.5))
Georg Brandl116aa622007-08-15 14:28:22 +00001419 0.479425538604
Georg Brandl6911e3c2007-09-04 07:15:32 +00001420 >>> print(sin(0.5+0j))
Georg Brandl116aa622007-08-15 14:28:22 +00001421 (0.479425538604+0j)
1422
1423 """
1424 getcontext().prec += 2
1425 i, lasts, s, fact, num, sign = 1, 0, x, 1, x, 1
1426 while s != lasts:
1427 lasts = s
1428 i += 2
1429 fact *= i * (i-1)
1430 num *= x * x
1431 sign *= -1
1432 s += num / fact * sign
1433 getcontext().prec -= 2
1434 return +s
1435
1436
Christian Heimes5b5e81c2007-12-31 16:14:33 +00001437.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +00001438
1439
1440.. _decimal-faq:
1441
1442Decimal FAQ
1443-----------
1444
1445Q. It is cumbersome to type ``decimal.Decimal('1234.5')``. Is there a way to
1446minimize typing when using the interactive interpreter?
1447
1448\A. Some users abbreviate the constructor to just a single letter::
1449
1450 >>> D = decimal.Decimal
1451 >>> D('1.23') + D('3.45')
1452 Decimal("4.68")
1453
1454Q. In a fixed-point application with two decimal places, some inputs have many
1455places and need to be rounded. Others are not supposed to have excess digits
1456and need to be validated. What methods should be used?
1457
1458A. The :meth:`quantize` method rounds to a fixed number of decimal places. If
1459the :const:`Inexact` trap is set, it is also useful for validation::
1460
1461 >>> TWOPLACES = Decimal(10) ** -2 # same as Decimal('0.01')
1462
1463 >>> # Round to two places
1464 >>> Decimal("3.214").quantize(TWOPLACES)
1465 Decimal("3.21")
1466
1467 >>> # Validate that a number does not exceed two places
1468 >>> Decimal("3.21").quantize(TWOPLACES, context=Context(traps=[Inexact]))
1469 Decimal("3.21")
1470
1471 >>> Decimal("3.214").quantize(TWOPLACES, context=Context(traps=[Inexact]))
1472 Traceback (most recent call last):
1473 ...
1474 Inexact: Changed in rounding
1475
1476Q. Once I have valid two place inputs, how do I maintain that invariant
1477throughout an application?
1478
1479A. Some operations like addition and subtraction automatically preserve fixed
1480point. Others, like multiplication and division, change the number of decimal
1481places and need to be followed-up with a :meth:`quantize` step.
1482
1483Q. There are many ways to express the same value. The numbers :const:`200`,
1484:const:`200.000`, :const:`2E2`, and :const:`.02E+4` all have the same value at
1485various precisions. Is there a way to transform them to a single recognizable
1486canonical value?
1487
1488A. The :meth:`normalize` method maps all equivalent values to a single
1489representative::
1490
1491 >>> values = map(Decimal, '200 200.000 2E2 .02E+4'.split())
1492 >>> [v.normalize() for v in values]
1493 [Decimal("2E+2"), Decimal("2E+2"), Decimal("2E+2"), Decimal("2E+2")]
1494
1495Q. Some decimal values always print with exponential notation. Is there a way
1496to get a non-exponential representation?
1497
1498A. For some values, exponential notation is the only way to express the number
1499of significant places in the coefficient. For example, expressing
1500:const:`5.0E+3` as :const:`5000` keeps the value constant but cannot show the
1501original's two-place significance.
1502
1503Q. Is there a way to convert a regular float to a :class:`Decimal`?
1504
1505A. Yes, all binary floating point numbers can be exactly expressed as a
1506Decimal. An exact conversion may take more precision than intuition would
1507suggest, so trapping :const:`Inexact` will signal a need for more precision::
1508
1509 def floatToDecimal(f):
1510 "Convert a floating point number to a Decimal with no loss of information"
1511 # Transform (exactly) a float to a mantissa (0.5 <= abs(m) < 1.0) and an
1512 # exponent. Double the mantissa until it is an integer. Use the integer
1513 # mantissa and exponent to compute an equivalent Decimal. If this cannot
1514 # be done exactly, then retry with more precision.
1515
1516 mantissa, exponent = math.frexp(f)
1517 while mantissa != int(mantissa):
1518 mantissa *= 2.0
1519 exponent -= 1
1520 mantissa = int(mantissa)
1521
1522 oldcontext = getcontext()
1523 setcontext(Context(traps=[Inexact]))
1524 try:
1525 while True:
1526 try:
1527 return mantissa * Decimal(2) ** exponent
1528 except Inexact:
1529 getcontext().prec += 1
1530 finally:
1531 setcontext(oldcontext)
1532
1533Q. Why isn't the :func:`floatToDecimal` routine included in the module?
1534
1535A. There is some question about whether it is advisable to mix binary and
1536decimal floating point. Also, its use requires some care to avoid the
1537representation issues associated with binary floating point::
1538
1539 >>> floatToDecimal(1.1)
1540 Decimal("1.100000000000000088817841970012523233890533447265625")
1541
1542Q. Within a complex calculation, how can I make sure that I haven't gotten a
1543spurious result because of insufficient precision or rounding anomalies.
1544
1545A. The decimal module makes it easy to test results. A best practice is to
1546re-run calculations using greater precision and with various rounding modes.
1547Widely differing results indicate insufficient precision, rounding mode issues,
1548ill-conditioned inputs, or a numerically unstable algorithm.
1549
1550Q. I noticed that context precision is applied to the results of operations but
1551not to the inputs. Is there anything to watch out for when mixing values of
1552different precisions?
1553
1554A. Yes. The principle is that all values are considered to be exact and so is
1555the arithmetic on those values. Only the results are rounded. The advantage
1556for inputs is that "what you type is what you get". A disadvantage is that the
1557results can look odd if you forget that the inputs haven't been rounded::
1558
1559 >>> getcontext().prec = 3
1560 >>> Decimal('3.104') + D('2.104')
1561 Decimal("5.21")
1562 >>> Decimal('3.104') + D('0.000') + D('2.104')
1563 Decimal("5.20")
1564
1565The solution is either to increase precision or to force rounding of inputs
1566using the unary plus operation::
1567
1568 >>> getcontext().prec = 3
1569 >>> +Decimal('1.23456789') # unary plus triggers rounding
1570 Decimal("1.23")
1571
1572Alternatively, inputs can be rounded upon creation using the
1573:meth:`Context.create_decimal` method::
1574
1575 >>> Context(prec=5, rounding=ROUND_DOWN).create_decimal('1.2345678')
1576 Decimal("1.2345")
1577