blob: fbd6f4349cfd1bf3357e4dc0ee1770e3e2762deb [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
Christian Heimes25bb7832008-01-11 16:17:00 +0000331 Return a :term:`named tuple` representation of the number:
332 ``DecimalTuple(sign, digits, exponent)``.
333
334 .. versionchanged:: 2.6
335 Use a named tuple.
Georg Brandl116aa622007-08-15 14:28:22 +0000336
337
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000338.. method:: Decimal.canonical()
339
340 Return the canonical encoding of the argument. Currently, the
341 encoding of a :class:`Decimal` instance is always canonical, so
342 this operation returns its argument unchanged.
343
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000344
Georg Brandl116aa622007-08-15 14:28:22 +0000345.. method:: Decimal.compare(other[, context])
346
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000347 Compare the values of two Decimal instances. This operation
348 behaves in the same way as the usual comparison method
349 :meth:`__cmp__`, except that :meth:`compare` returns a Decimal
350 instance rather than an integer, and if either operand is a NaN
351 then the result is a NaN::
Georg Brandl116aa622007-08-15 14:28:22 +0000352
353 a or b is a NaN ==> Decimal("NaN")
354 a < b ==> Decimal("-1")
355 a == b ==> Decimal("0")
356 a > b ==> Decimal("1")
357
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000358.. method:: Decimal.compare_signal(other[, context])
359
360 This operation is identical to the :meth:`compare` method, except
361 that all NaNs signal. That is, if neither operand is a signaling
362 NaN then any quiet NaN operand is treated as though it were a
363 signaling NaN.
364
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000365
366.. method:: Decimal.compare_total(other)
367
368 Compare two operands using their abstract representation rather
369 than their numerical value. Similar to the :meth:`compare` method,
370 but the result gives a total ordering on :class:`Decimal`
371 instances. Two :class:`Decimal` instances with the same numeric
372 value but different representations compare unequal in this
373 ordering::
374
375 >>> Decimal("12.0").compare_total(Decimal("12"))
376 Decimal("-1")
377
378 Quiet and signaling NaNs are also included in the total ordering.
379 The result of this function is ``Decimal("0")`` if both operands
380 have the same representation, ``Decimal("-1")`` if the first
381 operand is lower in the total order than the second, and
382 ``Decimal("1")`` if the first operand is higher in the total order
383 than the second operand. See the specification for details of the
384 total order.
385
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000386
387.. method:: Decimal.compare_total_mag(other)
388
389 Compare two operands using their abstract representation rather
390 than their value as in :meth:`compare_total`, but ignoring the sign
391 of each operand. ``x.compare_total_mag(y)`` is equivalent to
392 ``x.copy_abs().compare_total(y.copy_abs())``.
393
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000394
395.. method:: Decimal.copy_abs()
396
397 Return the absolute value of the argument. This operation is
398 unaffected by the context and is quiet: no flags are changed and no
399 rounding is performed.
400
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000401
402.. method:: Decimal.copy_negate()
403
404 Return the negation of the argument. This operation is unaffected
405 by the context and is quiet: no flags are changed and no rounding
406 is performed.
407
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000408
409.. method:: Decimal.copy_sign(other)
410
411 Return a copy of the first operand with the sign set to be the
412 same as the sign of the second operand. For example::
413
414 >>> Decimal("2.3").copy_sign(Decimal("-1.5"))
415 Decimal("-2.3")
416
417 This operation is unaffected by the context and is quiet: no flags
418 are changed and no rounding is performed.
419
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000420
421.. method:: Decimal.exp([context])
422
423 Return the value of the (natural) exponential function ``e**x`` at the
424 given number. The result is correctly rounded using the
425 :const:`ROUND_HALF_EVEN` rounding mode.
426
427 >>> Decimal(1).exp()
428 Decimal("2.718281828459045235360287471")
429 >>> Decimal(321).exp()
430 Decimal("2.561702493119680037517373933E+139")
431
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000432
433.. method:: Decimal.fma(other, third[, context])
434
435 Fused multiply-add. Return self*other+third with no rounding of
436 the intermediate product self*other.
437
438 >>> Decimal(2).fma(3, 5)
439 Decimal("11")
440
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000441
442.. method:: Decimal.is_canonical()
443
444 Return :const:`True` if the argument is canonical and
445 :const:`False` otherwise. Currently, a :class:`Decimal` instance
446 is always canonical, so this operation always returns
447 :const:`True`.
448
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000449
450.. method:: is_finite()
451
452 Return :const:`True` if the argument is a finite number, and
453 :const:`False` if the argument is an infinity or a NaN.
454
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000455
456.. method:: is_infinite()
457
458 Return :const:`True` if the argument is either positive or
459 negative infinity and :const:`False` otherwise.
460
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000461
462.. method:: is_nan()
463
464 Return :const:`True` if the argument is a (quiet or signaling)
465 NaN and :const:`False` otherwise.
466
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000467
468.. method:: is_normal()
469
470 Return :const:`True` if the argument is a *normal* finite number.
471 Return :const:`False` if the argument is zero, subnormal, infinite
472 or a NaN.
473
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000474
475.. method:: is_qnan()
476
477 Return :const:`True` if the argument is a quiet NaN, and
478 :const:`False` otherwise.
479
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000480
481.. method:: is_signed()
482
483 Return :const:`True` if the argument has a negative sign and
484 :const:`False` otherwise. Note that zeros and NaNs can both carry
485 signs.
486
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000487
488.. method:: is_snan()
489
490 Return :const:`True` if the argument is a signaling NaN and
491 :const:`False` otherwise.
492
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000493
494.. method:: is_subnormal()
495
496 Return :const:`True` if the argument is subnormal, and
497 :const:`False` otherwise.
498
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000499
500.. method:: is_zero()
501
502 Return :const:`True` if the argument is a (positive or negative)
503 zero and :const:`False` otherwise.
504
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000505
506.. method:: Decimal.ln([context])
507
508 Return the natural (base e) logarithm of the operand. The result
509 is correctly rounded using the :const:`ROUND_HALF_EVEN` rounding
510 mode.
511
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000512
513.. method:: Decimal.log10([context])
514
515 Return the base ten logarithm of the operand. The result is
516 correctly rounded using the :const:`ROUND_HALF_EVEN` rounding mode.
517
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000518
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000519.. method:: Decimal.logb([context])
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000520
521 For a nonzero number, return the adjusted exponent of its operand
522 as a :class:`Decimal` instance. If the operand is a zero then
523 ``Decimal("-Infinity")`` is returned and the
524 :const:`DivisionByZero` flag is raised. If the operand is an
525 infinity then ``Decimal("Infinity")`` is returned.
526
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000527
528.. method:: Decimal.logical_and(other[, context])
529
530 :meth:`logical_and` is a logical operation which takes two
531 *logical operands* (see :ref:`logical_operands_label`). The result
532 is the digit-wise ``and`` of the two operands.
533
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000534
535.. method:: Decimal.logical_invert(other[, context])
536
537 :meth:`logical_invert` is a logical operation. The argument must
538 be a *logical operand* (see :ref:`logical_operands_label`). The
539 result is the digit-wise inversion of the operand.
540
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000541
542.. method:: Decimal.logical_or(other[, context])
543
544 :meth:`logical_or` is a logical operation which takes two *logical
545 operands* (see :ref:`logical_operands_label`). The result is the
546 digit-wise ``or`` of the two operands.
547
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000548
549.. method:: Decimal.logical_xor(other[, context])
550
551 :meth:`logical_xor` is a logical operation which takes two
552 *logical operands* (see :ref:`logical_operands_label`). The result
553 is the digit-wise exclusive or of the two operands.
554
Georg Brandl116aa622007-08-15 14:28:22 +0000555
556.. method:: Decimal.max(other[, context])
557
558 Like ``max(self, other)`` except that the context rounding rule is applied
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000559 before returning and that :const:`NaN` values are either signaled or ignored
Georg Brandl116aa622007-08-15 14:28:22 +0000560 (depending on the context and whether they are signaling or quiet).
561
Georg Brandl6554cb92007-12-02 23:15:43 +0000562
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000563.. method:: Decimal.max_mag(other[, context])
564
565 Similar to the :meth:`max` method, but the comparison is done using
566 the absolute values of the operands.
567
Georg Brandl116aa622007-08-15 14:28:22 +0000568
569.. method:: Decimal.min(other[, context])
570
571 Like ``min(self, other)`` except that the context rounding rule is applied
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000572 before returning and that :const:`NaN` values are either signaled or ignored
Georg Brandl116aa622007-08-15 14:28:22 +0000573 (depending on the context and whether they are signaling or quiet).
574
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000575.. method:: Decimal.min_mag(other[, context])
576
577 Similar to the :meth:`min` method, but the comparison is done using
578 the absolute values of the operands.
579
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000580
581.. method:: Decimal.next_minus([context])
582
583 Return the largest number representable in the given context (or
584 in the current thread's context if no context is given) that is smaller
585 than the given operand.
586
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000587
588.. method:: Decimal.next_plus([context])
589
590 Return the smallest number representable in the given context (or
591 in the current thread's context if no context is given) that is
592 larger than the given operand.
593
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000594
595.. method:: Decimal.next_toward(other[, context])
596
597 If the two operands are unequal, return the number closest to the
598 first operand in the direction of the second operand. If both
599 operands are numerically equal, return a copy of the first operand
600 with the sign set to be the same as the sign of the second operand.
601
Georg Brandl116aa622007-08-15 14:28:22 +0000602
603.. method:: Decimal.normalize([context])
604
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000605 Normalize the number by stripping the rightmost trailing zeros and converting
Georg Brandl116aa622007-08-15 14:28:22 +0000606 any result equal to :const:`Decimal("0")` to :const:`Decimal("0e0")`. Used for
607 producing canonical values for members of an equivalence class. For example,
608 ``Decimal("32.100")`` and ``Decimal("0.321000e+2")`` both normalize to the
609 equivalent value ``Decimal("32.1")``.
610
Georg Brandl6554cb92007-12-02 23:15:43 +0000611
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000612.. method:: Decimal.number_class([context])
Georg Brandl116aa622007-08-15 14:28:22 +0000613
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000614 Return a string describing the *class* of the operand. The
615 returned value is one of the following ten strings.
Georg Brandl116aa622007-08-15 14:28:22 +0000616
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000617 * ``"-Infinity"``, indicating that the operand is negative infinity.
618 * ``"-Normal"``, indicating that the operand is a negative normal number.
619 * ``"-Subnormal"``, indicating that the operand is negative and subnormal.
620 * ``"-Zero"``, indicating that the operand is a negative zero.
621 * ``"+Zero"``, indicating that the operand is a positive zero.
622 * ``"+Subnormal"``, indicating that the operand is positive and subnormal.
623 * ``"+Normal"``, indicating that the operand is a positive normal number.
624 * ``"+Infinity"``, indicating that the operand is positive infinity.
625 * ``"NaN"``, indicating that the operand is a quiet NaN (Not a Number).
626 * ``"sNaN"``, indicating that the operand is a signaling NaN.
Georg Brandl116aa622007-08-15 14:28:22 +0000627
Georg Brandl116aa622007-08-15 14:28:22 +0000628
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000629.. method:: Decimal.quantize(exp[, rounding[, context[, watchexp]]])
630
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000631 Return a value equal to the first operand after rounding and
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000632 having the exponent of the second operand.
633
634 >>> Decimal("1.41421356").quantize(Decimal("1.000"))
635 Decimal("1.414")
636
637 Unlike other operations, if the length of the coefficient after the
638 quantize operation would be greater than precision, then an
639 :const:`InvalidOperation` is signaled. This guarantees that, unless
640 there is an error condition, the quantized exponent is always equal
641 to that of the right-hand operand.
642
643 Also unlike other operations, quantize never signals Underflow,
644 even if the result is subnormal and inexact.
645
646 If the exponent of the second operand is larger than that of the
647 first then rounding may be necessary. In this case, the rounding
648 mode is determined by the ``rounding`` argument if given, else by
649 the given ``context`` argument; if neither argument is given the
650 rounding mode of the current thread's context is used.
651
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000652 If *watchexp* is set (default), then an error is returned whenever the
653 resulting exponent is greater than :attr:`Emax` or less than :attr:`Etiny`.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000654
655.. method:: Decimal.radix()
656
657 Return ``Decimal(10)``, the radix (base) in which the
658 :class:`Decimal` class does all its arithmetic. Included for
659 compatibility with the specification.
660
Georg Brandl116aa622007-08-15 14:28:22 +0000661
662.. method:: Decimal.remainder_near(other[, context])
663
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000664 Compute the modulo as either a positive or negative value depending on which is
Georg Brandl116aa622007-08-15 14:28:22 +0000665 closest to zero. For instance, ``Decimal(10).remainder_near(6)`` returns
666 ``Decimal("-2")`` which is closer to zero than ``Decimal("4")``.
667
668 If both are equally close, the one chosen will have the same sign as *self*.
669
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000670.. method:: Decimal.rotate(other[, context])
671
672 Return the result of rotating the digits of the first operand by
673 an amount specified by the second operand. The second operand
674 must be an integer in the range -precision through precision. The
675 absolute value of the second operand gives the number of places to
676 rotate. If the second operand is positive then rotation is to the
677 left; otherwise rotation is to the right. The coefficient of the
678 first operand is padded on the left with zeros to length precision
679 if necessary. The sign and exponent of the first operand are
680 unchanged.
681
Georg Brandl116aa622007-08-15 14:28:22 +0000682
683.. method:: Decimal.same_quantum(other[, context])
684
685 Test whether self and other have the same exponent or whether both are
686 :const:`NaN`.
687
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000688.. method:: Decimal.scaleb(other[, context])
689
690 Return the first operand with exponent adjusted by the second.
691 Equivalently, return the first operand multiplied by ``10**other``.
692 The second operand must be an integer.
693
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000694
695.. method:: Decimal.shift(other[, context])
696
697 Return the result of shifting the digits of the first operand by
698 an amount specified by the second operand. The second operand must
699 be an integer in the range -precision through precision. The
700 absolute value of the second operand gives the number of places to
701 shift. If the second operand is positive then the shift is to the
702 left; otherwise the shift is to the right. Digits shifted into the
703 coefficient are zeros. The sign and exponent of the first operand
704 are unchanged.
705
Georg Brandl116aa622007-08-15 14:28:22 +0000706
707.. method:: Decimal.sqrt([context])
708
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000709 Return the square root of the argument to full precision.
Georg Brandl116aa622007-08-15 14:28:22 +0000710
711
712.. method:: Decimal.to_eng_string([context])
713
714 Convert to an engineering-type string.
715
716 Engineering notation has an exponent which is a multiple of 3, so there are up
717 to 3 digits left of the decimal place. For example, converts
718 ``Decimal('123E+1')`` to ``Decimal("1.23E+3")``
719
Georg Brandl116aa622007-08-15 14:28:22 +0000720.. method:: Decimal.to_integral([rounding[, context]])
721
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000722 Identical to the :meth:`to_integral_value` method. The ``to_integral``
723 name has been kept for compatibility with older versions.
724
725.. method:: Decimal.to_integral_exact([rounding[, context]])
726
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000727 Round to the nearest integer, signaling
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000728 :const:`Inexact` or :const:`Rounded` as appropriate if rounding
729 occurs. The rounding mode is determined by the ``rounding``
730 parameter if given, else by the given ``context``. If neither
731 parameter is given then the rounding mode of the current context is
732 used.
733
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000734
735.. method:: Decimal.to_integral_value([rounding[, context]])
736
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000737 Round to the nearest integer without signaling :const:`Inexact` or
Georg Brandl116aa622007-08-15 14:28:22 +0000738 :const:`Rounded`. If given, applies *rounding*; otherwise, uses the rounding
739 method in either the supplied *context* or the current context.
740
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000741
742.. method:: Decimal.trim()
743
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000744 Return the decimal with *insignificant* trailing zeros removed.
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000745 Here, a trailing zero is considered insignificant either if it
746 follows the decimal point, or if the exponent of the argument (that
747 is, the last element of the :meth:`as_tuple` representation) is
748 positive.
749
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000750
751.. _logical_operands_label:
752
753Logical operands
754^^^^^^^^^^^^^^^^
755
756The :meth:`logical_and`, :meth:`logical_invert`, :meth:`logical_or`,
757and :meth:`logical_xor` methods expect their arguments to be *logical
758operands*. A *logical operand* is a :class:`Decimal` instance whose
759exponent and sign are both zero, and whose digits are all either
760:const:`0` or :const:`1`.
761
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000762.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +0000763
764
765.. _decimal-context:
766
767Context objects
768---------------
769
770Contexts are environments for arithmetic operations. They govern precision, set
771rules for rounding, determine which signals are treated as exceptions, and limit
772the range for exponents.
773
774Each thread has its own current context which is accessed or changed using the
775:func:`getcontext` and :func:`setcontext` functions:
776
777
778.. function:: getcontext()
779
780 Return the current context for the active thread.
781
782
783.. function:: setcontext(c)
784
785 Set the current context for the active thread to *c*.
786
787Beginning with Python 2.5, you can also use the :keyword:`with` statement and
788the :func:`localcontext` function to temporarily change the active context.
789
790
791.. function:: localcontext([c])
792
793 Return a context manager that will set the current context for the active thread
794 to a copy of *c* on entry to the with-statement and restore the previous context
795 when exiting the with-statement. If no context is specified, a copy of the
796 current context is used.
797
Georg Brandl116aa622007-08-15 14:28:22 +0000798 For example, the following code sets the current decimal precision to 42 places,
799 performs a calculation, and then automatically restores the previous context::
800
Georg Brandl116aa622007-08-15 14:28:22 +0000801 from decimal import localcontext
802
803 with localcontext() as ctx:
804 ctx.prec = 42 # Perform a high precision calculation
805 s = calculate_something()
806 s = +s # Round the final result back to the default precision
807
808New contexts can also be created using the :class:`Context` constructor
809described below. In addition, the module provides three pre-made contexts:
810
811
812.. class:: BasicContext
813
814 This is a standard context defined by the General Decimal Arithmetic
815 Specification. Precision is set to nine. Rounding is set to
816 :const:`ROUND_HALF_UP`. All flags are cleared. All traps are enabled (treated
817 as exceptions) except :const:`Inexact`, :const:`Rounded`, and
818 :const:`Subnormal`.
819
820 Because many of the traps are enabled, this context is useful for debugging.
821
822
823.. class:: ExtendedContext
824
825 This is a standard context defined by the General Decimal Arithmetic
826 Specification. Precision is set to nine. Rounding is set to
827 :const:`ROUND_HALF_EVEN`. All flags are cleared. No traps are enabled (so that
828 exceptions are not raised during computations).
829
830 Because the trapped are disabled, this context is useful for applications that
831 prefer to have result value of :const:`NaN` or :const:`Infinity` instead of
832 raising exceptions. This allows an application to complete a run in the
833 presence of conditions that would otherwise halt the program.
834
835
836.. class:: DefaultContext
837
838 This context is used by the :class:`Context` constructor as a prototype for new
839 contexts. Changing a field (such a precision) has the effect of changing the
840 default for new contexts creating by the :class:`Context` constructor.
841
842 This context is most useful in multi-threaded environments. Changing one of the
843 fields before threads are started has the effect of setting system-wide
844 defaults. Changing the fields after threads have started is not recommended as
845 it would require thread synchronization to prevent race conditions.
846
847 In single threaded environments, it is preferable to not use this context at
848 all. Instead, simply create contexts explicitly as described below.
849
850 The default values are precision=28, rounding=ROUND_HALF_EVEN, and enabled traps
851 for Overflow, InvalidOperation, and DivisionByZero.
852
853In addition to the three supplied contexts, new contexts can be created with the
854:class:`Context` constructor.
855
856
857.. class:: Context(prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=1)
858
859 Creates a new context. If a field is not specified or is :const:`None`, the
860 default values are copied from the :const:`DefaultContext`. If the *flags*
861 field is not specified or is :const:`None`, all flags are cleared.
862
863 The *prec* field is a positive integer that sets the precision for arithmetic
864 operations in the context.
865
866 The *rounding* option is one of:
867
868 * :const:`ROUND_CEILING` (towards :const:`Infinity`),
869 * :const:`ROUND_DOWN` (towards zero),
870 * :const:`ROUND_FLOOR` (towards :const:`-Infinity`),
871 * :const:`ROUND_HALF_DOWN` (to nearest with ties going towards zero),
872 * :const:`ROUND_HALF_EVEN` (to nearest with ties going to nearest even integer),
873 * :const:`ROUND_HALF_UP` (to nearest with ties going away from zero), or
874 * :const:`ROUND_UP` (away from zero).
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000875 * :const:`ROUND_05UP` (away from zero if last digit after rounding towards zero
876 would have been 0 or 5; otherwise towards zero)
Georg Brandl116aa622007-08-15 14:28:22 +0000877
878 The *traps* and *flags* fields list any signals to be set. Generally, new
879 contexts should only set traps and leave the flags clear.
880
881 The *Emin* and *Emax* fields are integers specifying the outer limits allowable
882 for exponents.
883
884 The *capitals* field is either :const:`0` or :const:`1` (the default). If set to
885 :const:`1`, exponents are printed with a capital :const:`E`; otherwise, a
886 lowercase :const:`e` is used: :const:`Decimal('6.02e+23')`.
887
Georg Brandl116aa622007-08-15 14:28:22 +0000888
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000889The :class:`Context` class defines several general purpose methods as
890well as a large number of methods for doing arithmetic directly in a
891given context. In addition, for each of the :class:`Decimal` methods
892described above (with the exception of the :meth:`adjusted` and
893:meth:`as_tuple` methods) there is a corresponding :class:`Context`
894method. For example, ``C.exp(x)`` is equivalent to
895``x.exp(context=C)``.
Georg Brandl116aa622007-08-15 14:28:22 +0000896
897.. method:: Context.clear_flags()
898
899 Resets all of the flags to :const:`0`.
900
901
902.. method:: Context.copy()
903
904 Return a duplicate of the context.
905
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000906.. method:: Context.copy_decimal(num)
907
908 Return a copy of the Decimal instance num.
Georg Brandl116aa622007-08-15 14:28:22 +0000909
910.. method:: Context.create_decimal(num)
911
912 Creates a new Decimal instance from *num* but using *self* as context. Unlike
913 the :class:`Decimal` constructor, the context precision, rounding method, flags,
914 and traps are applied to the conversion.
915
916 This is useful because constants are often given to a greater precision than is
917 needed by the application. Another benefit is that rounding immediately
918 eliminates unintended effects from digits beyond the current precision. In the
919 following example, using unrounded inputs means that adding zero to a sum can
920 change the result::
921
922 >>> getcontext().prec = 3
923 >>> Decimal("3.4445") + Decimal("1.0023")
924 Decimal("4.45")
925 >>> Decimal("3.4445") + Decimal(0) + Decimal("1.0023")
926 Decimal("4.44")
927
928
929.. method:: Context.Etiny()
930
931 Returns a value equal to ``Emin - prec + 1`` which is the minimum exponent value
932 for subnormal results. When underflow occurs, the exponent is set to
933 :const:`Etiny`.
934
935
936.. method:: Context.Etop()
937
938 Returns a value equal to ``Emax - prec + 1``.
939
940The usual approach to working with decimals is to create :class:`Decimal`
941instances and then apply arithmetic operations which take place within the
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000942current context for the active thread. An alternative approach is to use context
Georg Brandl116aa622007-08-15 14:28:22 +0000943methods for calculating within a specific context. The methods are similar to
944those for the :class:`Decimal` class and are only briefly recounted here.
945
946
947.. method:: Context.abs(x)
948
949 Returns the absolute value of *x*.
950
951
952.. method:: Context.add(x, y)
953
954 Return the sum of *x* and *y*.
955
956
Georg Brandl116aa622007-08-15 14:28:22 +0000957.. method:: Context.divide(x, y)
958
959 Return *x* divided by *y*.
960
961
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000962.. method:: Context.divide_int(x, y)
963
964 Return *x* divided by *y*, truncated to an integer.
965
966
Georg Brandl116aa622007-08-15 14:28:22 +0000967.. method:: Context.divmod(x, y)
968
969 Divides two numbers and returns the integer part of the result.
970
971
Georg Brandl116aa622007-08-15 14:28:22 +0000972.. method:: Context.minus(x)
973
974 Minus corresponds to the unary prefix minus operator in Python.
975
976
977.. method:: Context.multiply(x, y)
978
979 Return the product of *x* and *y*.
980
981
Georg Brandl116aa622007-08-15 14:28:22 +0000982.. method:: Context.plus(x)
983
984 Plus corresponds to the unary prefix plus operator in Python. This operation
985 applies the context precision and rounding, so it is *not* an identity
986 operation.
987
988
989.. method:: Context.power(x, y[, modulo])
990
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000991 Return ``x`` to the power of ``y``, reduced modulo ``modulo`` if
992 given.
Georg Brandl116aa622007-08-15 14:28:22 +0000993
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000994 With two arguments, compute ``x**y``. If ``x`` is negative then
995 ``y`` must be integral. The result will be inexact unless ``y`` is
996 integral and the result is finite and can be expressed exactly in
997 'precision' digits. The result should always be correctly rounded,
998 using the rounding mode of the current thread's context.
Georg Brandl116aa622007-08-15 14:28:22 +0000999
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001000 With three arguments, compute ``(x**y) % modulo``. For the three
1001 argument form, the following restrictions on the arguments hold:
Georg Brandl116aa622007-08-15 14:28:22 +00001002
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001003 - all three arguments must be integral
1004 - ``y`` must be nonnegative
1005 - at least one of ``x`` or ``y`` must be nonzero
1006 - ``modulo`` must be nonzero and have at most 'precision' digits
Georg Brandl116aa622007-08-15 14:28:22 +00001007
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001008 The result of ``Context.power(x, y, modulo)`` is identical to
1009 the result that would be obtained by computing ``(x**y) %
1010 modulo`` with unbounded precision, but is computed more
1011 efficiently. It is always exact.
Georg Brandl116aa622007-08-15 14:28:22 +00001012
Georg Brandl116aa622007-08-15 14:28:22 +00001013
1014.. method:: Context.remainder(x, y)
1015
1016 Returns the remainder from integer division.
1017
1018 The sign of the result, if non-zero, is the same as that of the original
1019 dividend.
1020
Georg Brandl116aa622007-08-15 14:28:22 +00001021.. method:: Context.subtract(x, y)
1022
1023 Return the difference between *x* and *y*.
1024
Georg Brandl116aa622007-08-15 14:28:22 +00001025.. method:: Context.to_sci_string(x)
1026
1027 Converts a number to a string using scientific notation.
1028
Christian Heimes5b5e81c2007-12-31 16:14:33 +00001029.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +00001030
1031
1032.. _decimal-signals:
1033
1034Signals
1035-------
1036
1037Signals represent conditions that arise during computation. Each corresponds to
1038one context flag and one context trap enabler.
1039
1040The context flag is incremented whenever the condition is encountered. After the
1041computation, flags may be checked for informational purposes (for instance, to
1042determine whether a computation was exact). After checking the flags, be sure to
1043clear all flags before starting the next computation.
1044
1045If the context's trap enabler is set for the signal, then the condition causes a
1046Python exception to be raised. For example, if the :class:`DivisionByZero` trap
1047is set, then a :exc:`DivisionByZero` exception is raised upon encountering the
1048condition.
1049
1050
1051.. class:: Clamped
1052
1053 Altered an exponent to fit representation constraints.
1054
1055 Typically, clamping occurs when an exponent falls outside the context's
1056 :attr:`Emin` and :attr:`Emax` limits. If possible, the exponent is reduced to
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001057 fit by adding zeros to the coefficient.
Georg Brandl116aa622007-08-15 14:28:22 +00001058
1059
1060.. class:: DecimalException
1061
1062 Base class for other signals and a subclass of :exc:`ArithmeticError`.
1063
1064
1065.. class:: DivisionByZero
1066
1067 Signals the division of a non-infinite number by zero.
1068
1069 Can occur with division, modulo division, or when raising a number to a negative
1070 power. If this signal is not trapped, returns :const:`Infinity` or
1071 :const:`-Infinity` with the sign determined by the inputs to the calculation.
1072
1073
1074.. class:: Inexact
1075
1076 Indicates that rounding occurred and the result is not exact.
1077
1078 Signals when non-zero digits were discarded during rounding. The rounded result
1079 is returned. The signal flag or trap is used to detect when results are
1080 inexact.
1081
1082
1083.. class:: InvalidOperation
1084
1085 An invalid operation was performed.
1086
1087 Indicates that an operation was requested that does not make sense. If not
1088 trapped, returns :const:`NaN`. Possible causes include::
1089
1090 Infinity - Infinity
1091 0 * Infinity
1092 Infinity / Infinity
1093 x % 0
1094 Infinity % x
1095 x._rescale( non-integer )
1096 sqrt(-x) and x > 0
1097 0 ** 0
1098 x ** (non-integer)
1099 x ** Infinity
1100
1101
1102.. class:: Overflow
1103
1104 Numerical overflow.
1105
1106 Indicates the exponent is larger than :attr:`Emax` after rounding has occurred.
1107 If not trapped, the result depends on the rounding mode, either pulling inward
1108 to the largest representable finite number or rounding outward to
1109 :const:`Infinity`. In either case, :class:`Inexact` and :class:`Rounded` are
1110 also signaled.
1111
1112
1113.. class:: Rounded
1114
1115 Rounding occurred though possibly no information was lost.
1116
1117 Signaled whenever rounding discards digits; even if those digits are zero (such
1118 as rounding :const:`5.00` to :const:`5.0`). If not trapped, returns the result
1119 unchanged. This signal is used to detect loss of significant digits.
1120
1121
1122.. class:: Subnormal
1123
1124 Exponent was lower than :attr:`Emin` prior to rounding.
1125
1126 Occurs when an operation result is subnormal (the exponent is too small). If not
1127 trapped, returns the result unchanged.
1128
1129
1130.. class:: Underflow
1131
1132 Numerical underflow with result rounded to zero.
1133
1134 Occurs when a subnormal result is pushed to zero by rounding. :class:`Inexact`
1135 and :class:`Subnormal` are also signaled.
1136
1137The following table summarizes the hierarchy of signals::
1138
1139 exceptions.ArithmeticError(exceptions.Exception)
1140 DecimalException
1141 Clamped
1142 DivisionByZero(DecimalException, exceptions.ZeroDivisionError)
1143 Inexact
1144 Overflow(Inexact, Rounded)
1145 Underflow(Inexact, Rounded, Subnormal)
1146 InvalidOperation
1147 Rounded
1148 Subnormal
1149
Christian Heimes5b5e81c2007-12-31 16:14:33 +00001150.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +00001151
1152
1153.. _decimal-notes:
1154
1155Floating Point Notes
1156--------------------
1157
1158
1159Mitigating round-off error with increased precision
1160^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1161
1162The use of decimal floating point eliminates decimal representation error
1163(making it possible to represent :const:`0.1` exactly); however, some operations
1164can still incur round-off error when non-zero digits exceed the fixed precision.
1165
1166The effects of round-off error can be amplified by the addition or subtraction
1167of nearly offsetting quantities resulting in loss of significance. Knuth
1168provides two instructive examples where rounded floating point arithmetic with
1169insufficient precision causes the breakdown of the associative and distributive
1170properties of addition::
1171
1172 # Examples from Seminumerical Algorithms, Section 4.2.2.
1173 >>> from decimal import Decimal, getcontext
1174 >>> getcontext().prec = 8
1175
1176 >>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')
1177 >>> (u + v) + w
1178 Decimal("9.5111111")
1179 >>> u + (v + w)
1180 Decimal("10")
1181
1182 >>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
1183 >>> (u*v) + (u*w)
1184 Decimal("0.01")
1185 >>> u * (v+w)
1186 Decimal("0.0060000")
1187
1188The :mod:`decimal` module makes it possible to restore the identities by
1189expanding the precision sufficiently to avoid loss of significance::
1190
1191 >>> getcontext().prec = 20
1192 >>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')
1193 >>> (u + v) + w
1194 Decimal("9.51111111")
1195 >>> u + (v + w)
1196 Decimal("9.51111111")
1197 >>>
1198 >>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
1199 >>> (u*v) + (u*w)
1200 Decimal("0.0060000")
1201 >>> u * (v+w)
1202 Decimal("0.0060000")
1203
1204
1205Special values
1206^^^^^^^^^^^^^^
1207
1208The number system for the :mod:`decimal` module provides special values
1209including :const:`NaN`, :const:`sNaN`, :const:`-Infinity`, :const:`Infinity`,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001210and two zeros, :const:`+0` and :const:`-0`.
Georg Brandl116aa622007-08-15 14:28:22 +00001211
1212Infinities can be constructed directly with: ``Decimal('Infinity')``. Also,
1213they can arise from dividing by zero when the :exc:`DivisionByZero` signal is
1214not trapped. Likewise, when the :exc:`Overflow` signal is not trapped, infinity
1215can result from rounding beyond the limits of the largest representable number.
1216
1217The infinities are signed (affine) and can be used in arithmetic operations
1218where they get treated as very large, indeterminate numbers. For instance,
1219adding a constant to infinity gives another infinite result.
1220
1221Some operations are indeterminate and return :const:`NaN`, or if the
1222:exc:`InvalidOperation` signal is trapped, raise an exception. For example,
1223``0/0`` returns :const:`NaN` which means "not a number". This variety of
1224:const:`NaN` is quiet and, once created, will flow through other computations
1225always resulting in another :const:`NaN`. This behavior can be useful for a
1226series of computations that occasionally have missing inputs --- it allows the
1227calculation to proceed while flagging specific results as invalid.
1228
1229A variant is :const:`sNaN` which signals rather than remaining quiet after every
1230operation. This is a useful return value when an invalid result needs to
1231interrupt a calculation for special handling.
1232
1233The signed zeros can result from calculations that underflow. They keep the sign
1234that would have resulted if the calculation had been carried out to greater
1235precision. Since their magnitude is zero, both positive and negative zeros are
1236treated as equal and their sign is informational.
1237
1238In addition to the two signed zeros which are distinct yet equal, there are
1239various representations of zero with differing precisions yet equivalent in
1240value. This takes a bit of getting used to. For an eye accustomed to
1241normalized floating point representations, it is not immediately obvious that
1242the following calculation returns a value equal to zero::
1243
1244 >>> 1 / Decimal('Infinity')
1245 Decimal("0E-1000000026")
1246
Christian Heimes5b5e81c2007-12-31 16:14:33 +00001247.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +00001248
1249
1250.. _decimal-threads:
1251
1252Working with threads
1253--------------------
1254
1255The :func:`getcontext` function accesses a different :class:`Context` object for
1256each thread. Having separate thread contexts means that threads may make
1257changes (such as ``getcontext.prec=10``) without interfering with other threads.
1258
1259Likewise, the :func:`setcontext` function automatically assigns its target to
1260the current thread.
1261
1262If :func:`setcontext` has not been called before :func:`getcontext`, then
1263:func:`getcontext` will automatically create a new context for use in the
1264current thread.
1265
1266The new context is copied from a prototype context called *DefaultContext*. To
1267control the defaults so that each thread will use the same values throughout the
1268application, directly modify the *DefaultContext* object. This should be done
1269*before* any threads are started so that there won't be a race condition between
1270threads calling :func:`getcontext`. For example::
1271
1272 # Set applicationwide defaults for all threads about to be launched
1273 DefaultContext.prec = 12
1274 DefaultContext.rounding = ROUND_DOWN
1275 DefaultContext.traps = ExtendedContext.traps.copy()
1276 DefaultContext.traps[InvalidOperation] = 1
1277 setcontext(DefaultContext)
1278
1279 # Afterwards, the threads can be started
1280 t1.start()
1281 t2.start()
1282 t3.start()
1283 . . .
1284
Christian Heimes5b5e81c2007-12-31 16:14:33 +00001285.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +00001286
1287
1288.. _decimal-recipes:
1289
1290Recipes
1291-------
1292
1293Here are a few recipes that serve as utility functions and that demonstrate ways
1294to work with the :class:`Decimal` class::
1295
1296 def moneyfmt(value, places=2, curr='', sep=',', dp='.',
1297 pos='', neg='-', trailneg=''):
1298 """Convert Decimal to a money formatted string.
1299
1300 places: required number of places after the decimal point
1301 curr: optional currency symbol before the sign (may be blank)
1302 sep: optional grouping separator (comma, period, space, or blank)
1303 dp: decimal point indicator (comma or period)
1304 only specify as blank when places is zero
1305 pos: optional sign for positive numbers: '+', space or blank
1306 neg: optional sign for negative numbers: '-', '(', space or blank
1307 trailneg:optional trailing minus indicator: '-', ')', space or blank
1308
1309 >>> d = Decimal('-1234567.8901')
1310 >>> moneyfmt(d, curr='$')
1311 '-$1,234,567.89'
1312 >>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-')
1313 '1.234.568-'
1314 >>> moneyfmt(d, curr='$', neg='(', trailneg=')')
1315 '($1,234,567.89)'
1316 >>> moneyfmt(Decimal(123456789), sep=' ')
1317 '123 456 789.00'
1318 >>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')
1319 '<.02>'
1320
1321 """
1322 q = Decimal((0, (1,), -places)) # 2 places --> '0.01'
1323 sign, digits, exp = value.quantize(q).as_tuple()
1324 assert exp == -places
1325 result = []
1326 digits = map(str, digits)
1327 build, next = result.append, digits.pop
1328 if sign:
1329 build(trailneg)
1330 for i in range(places):
1331 if digits:
1332 build(next())
1333 else:
1334 build('0')
1335 build(dp)
1336 i = 0
1337 while digits:
1338 build(next())
1339 i += 1
1340 if i == 3 and digits:
1341 i = 0
1342 build(sep)
1343 build(curr)
1344 if sign:
1345 build(neg)
1346 else:
1347 build(pos)
1348 result.reverse()
1349 return ''.join(result)
1350
1351 def pi():
1352 """Compute Pi to the current precision.
1353
Georg Brandl6911e3c2007-09-04 07:15:32 +00001354 >>> print(pi())
Georg Brandl116aa622007-08-15 14:28:22 +00001355 3.141592653589793238462643383
1356
1357 """
1358 getcontext().prec += 2 # extra digits for intermediate steps
1359 three = Decimal(3) # substitute "three=3.0" for regular floats
1360 lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
1361 while s != lasts:
1362 lasts = s
1363 n, na = n+na, na+8
1364 d, da = d+da, da+32
1365 t = (t * n) / d
1366 s += t
1367 getcontext().prec -= 2
1368 return +s # unary plus applies the new precision
1369
1370 def exp(x):
1371 """Return e raised to the power of x. Result type matches input type.
1372
Georg Brandl6911e3c2007-09-04 07:15:32 +00001373 >>> print(exp(Decimal(1)))
Georg Brandl116aa622007-08-15 14:28:22 +00001374 2.718281828459045235360287471
Georg Brandl6911e3c2007-09-04 07:15:32 +00001375 >>> print(exp(Decimal(2)))
Georg Brandl116aa622007-08-15 14:28:22 +00001376 7.389056098930650227230427461
Georg Brandl6911e3c2007-09-04 07:15:32 +00001377 >>> print(exp(2.0))
Georg Brandl116aa622007-08-15 14:28:22 +00001378 7.38905609893
Georg Brandl6911e3c2007-09-04 07:15:32 +00001379 >>> print(exp(2+0j))
Georg Brandl116aa622007-08-15 14:28:22 +00001380 (7.38905609893+0j)
1381
1382 """
1383 getcontext().prec += 2
1384 i, lasts, s, fact, num = 0, 0, 1, 1, 1
1385 while s != lasts:
1386 lasts = s
1387 i += 1
1388 fact *= i
1389 num *= x
1390 s += num / fact
1391 getcontext().prec -= 2
1392 return +s
1393
1394 def cos(x):
1395 """Return the cosine of x as measured in radians.
1396
Georg Brandl6911e3c2007-09-04 07:15:32 +00001397 >>> print(cos(Decimal('0.5')))
Georg Brandl116aa622007-08-15 14:28:22 +00001398 0.8775825618903727161162815826
Georg Brandl6911e3c2007-09-04 07:15:32 +00001399 >>> print(cos(0.5))
Georg Brandl116aa622007-08-15 14:28:22 +00001400 0.87758256189
Georg Brandl6911e3c2007-09-04 07:15:32 +00001401 >>> print(cos(0.5+0j))
Georg Brandl116aa622007-08-15 14:28:22 +00001402 (0.87758256189+0j)
1403
1404 """
1405 getcontext().prec += 2
1406 i, lasts, s, fact, num, sign = 0, 0, 1, 1, 1, 1
1407 while s != lasts:
1408 lasts = s
1409 i += 2
1410 fact *= i * (i-1)
1411 num *= x * x
1412 sign *= -1
1413 s += num / fact * sign
1414 getcontext().prec -= 2
1415 return +s
1416
1417 def sin(x):
1418 """Return the sine of x as measured in radians.
1419
Georg Brandl6911e3c2007-09-04 07:15:32 +00001420 >>> print(sin(Decimal('0.5')))
Georg Brandl116aa622007-08-15 14:28:22 +00001421 0.4794255386042030002732879352
Georg Brandl6911e3c2007-09-04 07:15:32 +00001422 >>> print(sin(0.5))
Georg Brandl116aa622007-08-15 14:28:22 +00001423 0.479425538604
Georg Brandl6911e3c2007-09-04 07:15:32 +00001424 >>> print(sin(0.5+0j))
Georg Brandl116aa622007-08-15 14:28:22 +00001425 (0.479425538604+0j)
1426
1427 """
1428 getcontext().prec += 2
1429 i, lasts, s, fact, num, sign = 1, 0, x, 1, x, 1
1430 while s != lasts:
1431 lasts = s
1432 i += 2
1433 fact *= i * (i-1)
1434 num *= x * x
1435 sign *= -1
1436 s += num / fact * sign
1437 getcontext().prec -= 2
1438 return +s
1439
1440
Christian Heimes5b5e81c2007-12-31 16:14:33 +00001441.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Georg Brandl116aa622007-08-15 14:28:22 +00001442
1443
1444.. _decimal-faq:
1445
1446Decimal FAQ
1447-----------
1448
1449Q. It is cumbersome to type ``decimal.Decimal('1234.5')``. Is there a way to
1450minimize typing when using the interactive interpreter?
1451
1452\A. Some users abbreviate the constructor to just a single letter::
1453
1454 >>> D = decimal.Decimal
1455 >>> D('1.23') + D('3.45')
1456 Decimal("4.68")
1457
1458Q. In a fixed-point application with two decimal places, some inputs have many
1459places and need to be rounded. Others are not supposed to have excess digits
1460and need to be validated. What methods should be used?
1461
1462A. The :meth:`quantize` method rounds to a fixed number of decimal places. If
1463the :const:`Inexact` trap is set, it is also useful for validation::
1464
1465 >>> TWOPLACES = Decimal(10) ** -2 # same as Decimal('0.01')
1466
1467 >>> # Round to two places
1468 >>> Decimal("3.214").quantize(TWOPLACES)
1469 Decimal("3.21")
1470
1471 >>> # Validate that a number does not exceed two places
1472 >>> Decimal("3.21").quantize(TWOPLACES, context=Context(traps=[Inexact]))
1473 Decimal("3.21")
1474
1475 >>> Decimal("3.214").quantize(TWOPLACES, context=Context(traps=[Inexact]))
1476 Traceback (most recent call last):
1477 ...
1478 Inexact: Changed in rounding
1479
1480Q. Once I have valid two place inputs, how do I maintain that invariant
1481throughout an application?
1482
1483A. Some operations like addition and subtraction automatically preserve fixed
1484point. Others, like multiplication and division, change the number of decimal
1485places and need to be followed-up with a :meth:`quantize` step.
1486
1487Q. There are many ways to express the same value. The numbers :const:`200`,
1488:const:`200.000`, :const:`2E2`, and :const:`.02E+4` all have the same value at
1489various precisions. Is there a way to transform them to a single recognizable
1490canonical value?
1491
1492A. The :meth:`normalize` method maps all equivalent values to a single
1493representative::
1494
1495 >>> values = map(Decimal, '200 200.000 2E2 .02E+4'.split())
1496 >>> [v.normalize() for v in values]
1497 [Decimal("2E+2"), Decimal("2E+2"), Decimal("2E+2"), Decimal("2E+2")]
1498
1499Q. Some decimal values always print with exponential notation. Is there a way
1500to get a non-exponential representation?
1501
1502A. For some values, exponential notation is the only way to express the number
1503of significant places in the coefficient. For example, expressing
1504:const:`5.0E+3` as :const:`5000` keeps the value constant but cannot show the
1505original's two-place significance.
1506
1507Q. Is there a way to convert a regular float to a :class:`Decimal`?
1508
1509A. Yes, all binary floating point numbers can be exactly expressed as a
1510Decimal. An exact conversion may take more precision than intuition would
1511suggest, so trapping :const:`Inexact` will signal a need for more precision::
1512
1513 def floatToDecimal(f):
1514 "Convert a floating point number to a Decimal with no loss of information"
1515 # Transform (exactly) a float to a mantissa (0.5 <= abs(m) < 1.0) and an
1516 # exponent. Double the mantissa until it is an integer. Use the integer
1517 # mantissa and exponent to compute an equivalent Decimal. If this cannot
1518 # be done exactly, then retry with more precision.
1519
1520 mantissa, exponent = math.frexp(f)
1521 while mantissa != int(mantissa):
1522 mantissa *= 2.0
1523 exponent -= 1
1524 mantissa = int(mantissa)
1525
1526 oldcontext = getcontext()
1527 setcontext(Context(traps=[Inexact]))
1528 try:
1529 while True:
1530 try:
1531 return mantissa * Decimal(2) ** exponent
1532 except Inexact:
1533 getcontext().prec += 1
1534 finally:
1535 setcontext(oldcontext)
1536
1537Q. Why isn't the :func:`floatToDecimal` routine included in the module?
1538
1539A. There is some question about whether it is advisable to mix binary and
1540decimal floating point. Also, its use requires some care to avoid the
1541representation issues associated with binary floating point::
1542
1543 >>> floatToDecimal(1.1)
1544 Decimal("1.100000000000000088817841970012523233890533447265625")
1545
1546Q. Within a complex calculation, how can I make sure that I haven't gotten a
1547spurious result because of insufficient precision or rounding anomalies.
1548
1549A. The decimal module makes it easy to test results. A best practice is to
1550re-run calculations using greater precision and with various rounding modes.
1551Widely differing results indicate insufficient precision, rounding mode issues,
1552ill-conditioned inputs, or a numerically unstable algorithm.
1553
1554Q. I noticed that context precision is applied to the results of operations but
1555not to the inputs. Is there anything to watch out for when mixing values of
1556different precisions?
1557
1558A. Yes. The principle is that all values are considered to be exact and so is
1559the arithmetic on those values. Only the results are rounded. The advantage
1560for inputs is that "what you type is what you get". A disadvantage is that the
1561results can look odd if you forget that the inputs haven't been rounded::
1562
1563 >>> getcontext().prec = 3
1564 >>> Decimal('3.104') + D('2.104')
1565 Decimal("5.21")
1566 >>> Decimal('3.104') + D('0.000') + D('2.104')
1567 Decimal("5.20")
1568
1569The solution is either to increase precision or to force rounding of inputs
1570using the unary plus operation::
1571
1572 >>> getcontext().prec = 3
1573 >>> +Decimal('1.23456789') # unary plus triggers rounding
1574 Decimal("1.23")
1575
1576Alternatively, inputs can be rounded upon creation using the
1577:meth:`Context.create_decimal` method::
1578
1579 >>> Context(prec=5, rounding=ROUND_DOWN).create_decimal('1.2345678')
1580 Decimal("1.2345")
1581