17db96d56Sopenharmony_ci:mod:`decimal` --- Decimal fixed point and floating point arithmetic
27db96d56Sopenharmony_ci====================================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: decimal
57db96d56Sopenharmony_ci   :synopsis: Implementation of the General Decimal Arithmetic  Specification.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. moduleauthor:: Eric Price <eprice at tjhsst.edu>
87db96d56Sopenharmony_ci.. moduleauthor:: Facundo Batista <facundo at taniquetil.com.ar>
97db96d56Sopenharmony_ci.. moduleauthor:: Raymond Hettinger <python at rcn.com>
107db96d56Sopenharmony_ci.. moduleauthor:: Aahz <aahz at pobox.com>
117db96d56Sopenharmony_ci.. moduleauthor:: Tim Peters <tim.one at comcast.net>
127db96d56Sopenharmony_ci.. moduleauthor:: Stefan Krah <skrah at bytereef.org>
137db96d56Sopenharmony_ci.. sectionauthor:: Raymond D. Hettinger <python at rcn.com>
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci**Source code:** :source:`Lib/decimal.py`
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci.. import modules for testing inline doctests with the Sphinx doctest builder
187db96d56Sopenharmony_ci.. testsetup:: *
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci   import decimal
217db96d56Sopenharmony_ci   import math
227db96d56Sopenharmony_ci   from decimal import *
237db96d56Sopenharmony_ci   # make sure each group gets a fresh context
247db96d56Sopenharmony_ci   setcontext(Context())
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci.. testcleanup:: *
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci   # make sure other tests (outside this file) get a fresh context
297db96d56Sopenharmony_ci   setcontext(Context())
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci--------------
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ciThe :mod:`decimal` module provides support for fast correctly rounded
347db96d56Sopenharmony_cidecimal floating point arithmetic. It offers several advantages over the
357db96d56Sopenharmony_ci:class:`float` datatype:
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci* Decimal "is based on a floating-point model which was designed with people
387db96d56Sopenharmony_ci  in mind, and necessarily has a paramount guiding principle -- computers must
397db96d56Sopenharmony_ci  provide an arithmetic that works in the same way as the arithmetic that
407db96d56Sopenharmony_ci  people learn at school." -- excerpt from the decimal arithmetic specification.
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci* Decimal numbers can be represented exactly.  In contrast, numbers like
437db96d56Sopenharmony_ci  ``1.1`` and ``2.2`` do not have exact representations in binary
447db96d56Sopenharmony_ci  floating point. End users typically would not expect ``1.1 + 2.2`` to display
457db96d56Sopenharmony_ci  as ``3.3000000000000003`` as it does with binary floating point.
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci* The exactness carries over into arithmetic.  In decimal floating point, ``0.1
487db96d56Sopenharmony_ci  + 0.1 + 0.1 - 0.3`` is exactly equal to zero.  In binary floating point, the result
497db96d56Sopenharmony_ci  is ``5.5511151231257827e-017``.  While near to zero, the differences
507db96d56Sopenharmony_ci  prevent reliable equality testing and differences can accumulate. For this
517db96d56Sopenharmony_ci  reason, decimal is preferred in accounting applications which have strict
527db96d56Sopenharmony_ci  equality invariants.
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci* The decimal module incorporates a notion of significant places so that ``1.30
557db96d56Sopenharmony_ci  + 1.20`` is ``2.50``.  The trailing zero is kept to indicate significance.
567db96d56Sopenharmony_ci  This is the customary presentation for monetary applications. For
577db96d56Sopenharmony_ci  multiplication, the "schoolbook" approach uses all the figures in the
587db96d56Sopenharmony_ci  multiplicands.  For instance, ``1.3 * 1.2`` gives ``1.56`` while ``1.30 *
597db96d56Sopenharmony_ci  1.20`` gives ``1.5600``.
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci* Unlike hardware based binary floating point, the decimal module has a user
627db96d56Sopenharmony_ci  alterable precision (defaulting to 28 places) which can be as large as needed for
637db96d56Sopenharmony_ci  a given problem:
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci     >>> from decimal import *
667db96d56Sopenharmony_ci     >>> getcontext().prec = 6
677db96d56Sopenharmony_ci     >>> Decimal(1) / Decimal(7)
687db96d56Sopenharmony_ci     Decimal('0.142857')
697db96d56Sopenharmony_ci     >>> getcontext().prec = 28
707db96d56Sopenharmony_ci     >>> Decimal(1) / Decimal(7)
717db96d56Sopenharmony_ci     Decimal('0.1428571428571428571428571429')
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci* Both binary and decimal floating point are implemented in terms of published
747db96d56Sopenharmony_ci  standards.  While the built-in float type exposes only a modest portion of its
757db96d56Sopenharmony_ci  capabilities, the decimal module exposes all required parts of the standard.
767db96d56Sopenharmony_ci  When needed, the programmer has full control over rounding and signal handling.
777db96d56Sopenharmony_ci  This includes an option to enforce exact arithmetic by using exceptions
787db96d56Sopenharmony_ci  to block any inexact operations.
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci* The decimal module was designed to support "without prejudice, both exact
817db96d56Sopenharmony_ci  unrounded decimal arithmetic (sometimes called fixed-point arithmetic)
827db96d56Sopenharmony_ci  and rounded floating-point arithmetic."  -- excerpt from the decimal
837db96d56Sopenharmony_ci  arithmetic specification.
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ciThe module design is centered around three concepts:  the decimal number, the
867db96d56Sopenharmony_cicontext for arithmetic, and signals.
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ciA decimal number is immutable.  It has a sign, coefficient digits, and an
897db96d56Sopenharmony_ciexponent.  To preserve significance, the coefficient digits do not truncate
907db96d56Sopenharmony_citrailing zeros.  Decimals also include special values such as
917db96d56Sopenharmony_ci``Infinity``, ``-Infinity``, and ``NaN``.  The standard also
927db96d56Sopenharmony_cidifferentiates ``-0`` from ``+0``.
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ciThe context for arithmetic is an environment specifying precision, rounding
957db96d56Sopenharmony_cirules, limits on exponents, flags indicating the results of operations, and trap
967db96d56Sopenharmony_cienablers which determine whether signals are treated as exceptions.  Rounding
977db96d56Sopenharmony_cioptions include :const:`ROUND_CEILING`, :const:`ROUND_DOWN`,
987db96d56Sopenharmony_ci:const:`ROUND_FLOOR`, :const:`ROUND_HALF_DOWN`, :const:`ROUND_HALF_EVEN`,
997db96d56Sopenharmony_ci:const:`ROUND_HALF_UP`, :const:`ROUND_UP`, and :const:`ROUND_05UP`.
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ciSignals are groups of exceptional conditions arising during the course of
1027db96d56Sopenharmony_cicomputation.  Depending on the needs of the application, signals may be ignored,
1037db96d56Sopenharmony_ciconsidered as informational, or treated as exceptions. The signals in the
1047db96d56Sopenharmony_cidecimal module are: :const:`Clamped`, :const:`InvalidOperation`,
1057db96d56Sopenharmony_ci:const:`DivisionByZero`, :const:`Inexact`, :const:`Rounded`, :const:`Subnormal`,
1067db96d56Sopenharmony_ci:const:`Overflow`, :const:`Underflow` and :const:`FloatOperation`.
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ciFor each signal there is a flag and a trap enabler.  When a signal is
1097db96d56Sopenharmony_ciencountered, its flag is set to one, then, if the trap enabler is
1107db96d56Sopenharmony_ciset to one, an exception is raised.  Flags are sticky, so the user needs to
1117db96d56Sopenharmony_cireset them before monitoring a calculation.
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci.. seealso::
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci   * IBM's General Decimal Arithmetic Specification, `The General Decimal Arithmetic
1177db96d56Sopenharmony_ci     Specification <https://speleotrove.com/decimal/decarith.html>`_.
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci.. _decimal-tutorial:
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ciQuick-start Tutorial
1257db96d56Sopenharmony_ci--------------------
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ciThe usual start to using decimals is importing the module, viewing the current
1287db96d56Sopenharmony_cicontext with :func:`getcontext` and, if necessary, setting new values for
1297db96d56Sopenharmony_ciprecision, rounding, or enabled traps::
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci   >>> from decimal import *
1327db96d56Sopenharmony_ci   >>> getcontext()
1337db96d56Sopenharmony_ci   Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
1347db96d56Sopenharmony_ci           capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
1357db96d56Sopenharmony_ci           InvalidOperation])
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci   >>> getcontext().prec = 7       # Set a new precision
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ciDecimal instances can be constructed from integers, strings, floats, or tuples.
1407db96d56Sopenharmony_ciConstruction from an integer or a float performs an exact conversion of the
1417db96d56Sopenharmony_civalue of that integer or float.  Decimal numbers include special values such as
1427db96d56Sopenharmony_ci``NaN`` which stands for "Not a number", positive and negative
1437db96d56Sopenharmony_ci``Infinity``, and ``-0``::
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci   >>> getcontext().prec = 28
1467db96d56Sopenharmony_ci   >>> Decimal(10)
1477db96d56Sopenharmony_ci   Decimal('10')
1487db96d56Sopenharmony_ci   >>> Decimal('3.14')
1497db96d56Sopenharmony_ci   Decimal('3.14')
1507db96d56Sopenharmony_ci   >>> Decimal(3.14)
1517db96d56Sopenharmony_ci   Decimal('3.140000000000000124344978758017532527446746826171875')
1527db96d56Sopenharmony_ci   >>> Decimal((0, (3, 1, 4), -2))
1537db96d56Sopenharmony_ci   Decimal('3.14')
1547db96d56Sopenharmony_ci   >>> Decimal(str(2.0 ** 0.5))
1557db96d56Sopenharmony_ci   Decimal('1.4142135623730951')
1567db96d56Sopenharmony_ci   >>> Decimal(2) ** Decimal('0.5')
1577db96d56Sopenharmony_ci   Decimal('1.414213562373095048801688724')
1587db96d56Sopenharmony_ci   >>> Decimal('NaN')
1597db96d56Sopenharmony_ci   Decimal('NaN')
1607db96d56Sopenharmony_ci   >>> Decimal('-Infinity')
1617db96d56Sopenharmony_ci   Decimal('-Infinity')
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ciIf the :exc:`FloatOperation` signal is trapped, accidental mixing of
1647db96d56Sopenharmony_cidecimals and floats in constructors or ordering comparisons raises
1657db96d56Sopenharmony_cian exception::
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci   >>> c = getcontext()
1687db96d56Sopenharmony_ci   >>> c.traps[FloatOperation] = True
1697db96d56Sopenharmony_ci   >>> Decimal(3.14)
1707db96d56Sopenharmony_ci   Traceback (most recent call last):
1717db96d56Sopenharmony_ci     File "<stdin>", line 1, in <module>
1727db96d56Sopenharmony_ci   decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
1737db96d56Sopenharmony_ci   >>> Decimal('3.5') < 3.7
1747db96d56Sopenharmony_ci   Traceback (most recent call last):
1757db96d56Sopenharmony_ci     File "<stdin>", line 1, in <module>
1767db96d56Sopenharmony_ci   decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
1777db96d56Sopenharmony_ci   >>> Decimal('3.5') == 3.5
1787db96d56Sopenharmony_ci   True
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci.. versionadded:: 3.3
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ciThe significance of a new Decimal is determined solely by the number of digits
1837db96d56Sopenharmony_ciinput.  Context precision and rounding only come into play during arithmetic
1847db96d56Sopenharmony_cioperations.
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci.. doctest:: newcontext
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci   >>> getcontext().prec = 6
1897db96d56Sopenharmony_ci   >>> Decimal('3.0')
1907db96d56Sopenharmony_ci   Decimal('3.0')
1917db96d56Sopenharmony_ci   >>> Decimal('3.1415926535')
1927db96d56Sopenharmony_ci   Decimal('3.1415926535')
1937db96d56Sopenharmony_ci   >>> Decimal('3.1415926535') + Decimal('2.7182818285')
1947db96d56Sopenharmony_ci   Decimal('5.85987')
1957db96d56Sopenharmony_ci   >>> getcontext().rounding = ROUND_UP
1967db96d56Sopenharmony_ci   >>> Decimal('3.1415926535') + Decimal('2.7182818285')
1977db96d56Sopenharmony_ci   Decimal('5.85988')
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ciIf the internal limits of the C version are exceeded, constructing
2007db96d56Sopenharmony_cia decimal raises :class:`InvalidOperation`::
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci   >>> Decimal("1e9999999999999999999")
2037db96d56Sopenharmony_ci   Traceback (most recent call last):
2047db96d56Sopenharmony_ci     File "<stdin>", line 1, in <module>
2057db96d56Sopenharmony_ci   decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci.. versionchanged:: 3.3
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ciDecimals interact well with much of the rest of Python.  Here is a small decimal
2107db96d56Sopenharmony_cifloating point flying circus:
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci.. doctest::
2137db96d56Sopenharmony_ci   :options: +NORMALIZE_WHITESPACE
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci   >>> data = list(map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split()))
2167db96d56Sopenharmony_ci   >>> max(data)
2177db96d56Sopenharmony_ci   Decimal('9.25')
2187db96d56Sopenharmony_ci   >>> min(data)
2197db96d56Sopenharmony_ci   Decimal('0.03')
2207db96d56Sopenharmony_ci   >>> sorted(data)
2217db96d56Sopenharmony_ci   [Decimal('0.03'), Decimal('1.00'), Decimal('1.34'), Decimal('1.87'),
2227db96d56Sopenharmony_ci    Decimal('2.35'), Decimal('3.45'), Decimal('9.25')]
2237db96d56Sopenharmony_ci   >>> sum(data)
2247db96d56Sopenharmony_ci   Decimal('19.29')
2257db96d56Sopenharmony_ci   >>> a,b,c = data[:3]
2267db96d56Sopenharmony_ci   >>> str(a)
2277db96d56Sopenharmony_ci   '1.34'
2287db96d56Sopenharmony_ci   >>> float(a)
2297db96d56Sopenharmony_ci   1.34
2307db96d56Sopenharmony_ci   >>> round(a, 1)
2317db96d56Sopenharmony_ci   Decimal('1.3')
2327db96d56Sopenharmony_ci   >>> int(a)
2337db96d56Sopenharmony_ci   1
2347db96d56Sopenharmony_ci   >>> a * 5
2357db96d56Sopenharmony_ci   Decimal('6.70')
2367db96d56Sopenharmony_ci   >>> a * b
2377db96d56Sopenharmony_ci   Decimal('2.5058')
2387db96d56Sopenharmony_ci   >>> c % a
2397db96d56Sopenharmony_ci   Decimal('0.77')
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ciAnd some mathematical functions are also available to Decimal:
2427db96d56Sopenharmony_ci
2437db96d56Sopenharmony_ci   >>> getcontext().prec = 28
2447db96d56Sopenharmony_ci   >>> Decimal(2).sqrt()
2457db96d56Sopenharmony_ci   Decimal('1.414213562373095048801688724')
2467db96d56Sopenharmony_ci   >>> Decimal(1).exp()
2477db96d56Sopenharmony_ci   Decimal('2.718281828459045235360287471')
2487db96d56Sopenharmony_ci   >>> Decimal('10').ln()
2497db96d56Sopenharmony_ci   Decimal('2.302585092994045684017991455')
2507db96d56Sopenharmony_ci   >>> Decimal('10').log10()
2517db96d56Sopenharmony_ci   Decimal('1')
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ciThe :meth:`~Decimal.quantize` method rounds a number to a fixed exponent.  This method is
2547db96d56Sopenharmony_ciuseful for monetary applications that often round results to a fixed number of
2557db96d56Sopenharmony_ciplaces:
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci   >>> Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
2587db96d56Sopenharmony_ci   Decimal('7.32')
2597db96d56Sopenharmony_ci   >>> Decimal('7.325').quantize(Decimal('1.'), rounding=ROUND_UP)
2607db96d56Sopenharmony_ci   Decimal('8')
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ciAs shown above, the :func:`getcontext` function accesses the current context and
2637db96d56Sopenharmony_ciallows the settings to be changed.  This approach meets the needs of most
2647db96d56Sopenharmony_ciapplications.
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ciFor more advanced work, it may be useful to create alternate contexts using the
2677db96d56Sopenharmony_ciContext() constructor.  To make an alternate active, use the :func:`setcontext`
2687db96d56Sopenharmony_cifunction.
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ciIn accordance with the standard, the :mod:`decimal` module provides two ready to
2717db96d56Sopenharmony_ciuse standard contexts, :const:`BasicContext` and :const:`ExtendedContext`. The
2727db96d56Sopenharmony_ciformer is especially useful for debugging because many of the traps are
2737db96d56Sopenharmony_cienabled:
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci.. doctest:: newcontext
2767db96d56Sopenharmony_ci   :options: +NORMALIZE_WHITESPACE
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci   >>> myothercontext = Context(prec=60, rounding=ROUND_HALF_DOWN)
2797db96d56Sopenharmony_ci   >>> setcontext(myothercontext)
2807db96d56Sopenharmony_ci   >>> Decimal(1) / Decimal(7)
2817db96d56Sopenharmony_ci   Decimal('0.142857142857142857142857142857142857142857142857142857142857')
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci   >>> ExtendedContext
2847db96d56Sopenharmony_ci   Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
2857db96d56Sopenharmony_ci           capitals=1, clamp=0, flags=[], traps=[])
2867db96d56Sopenharmony_ci   >>> setcontext(ExtendedContext)
2877db96d56Sopenharmony_ci   >>> Decimal(1) / Decimal(7)
2887db96d56Sopenharmony_ci   Decimal('0.142857143')
2897db96d56Sopenharmony_ci   >>> Decimal(42) / Decimal(0)
2907db96d56Sopenharmony_ci   Decimal('Infinity')
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci   >>> setcontext(BasicContext)
2937db96d56Sopenharmony_ci   >>> Decimal(42) / Decimal(0)
2947db96d56Sopenharmony_ci   Traceback (most recent call last):
2957db96d56Sopenharmony_ci     File "<pyshell#143>", line 1, in -toplevel-
2967db96d56Sopenharmony_ci       Decimal(42) / Decimal(0)
2977db96d56Sopenharmony_ci   DivisionByZero: x / 0
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ciContexts also have signal flags for monitoring exceptional conditions
3007db96d56Sopenharmony_ciencountered during computations.  The flags remain set until explicitly cleared,
3017db96d56Sopenharmony_ciso it is best to clear the flags before each set of monitored computations by
3027db96d56Sopenharmony_ciusing the :meth:`~Context.clear_flags` method. ::
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci   >>> setcontext(ExtendedContext)
3057db96d56Sopenharmony_ci   >>> getcontext().clear_flags()
3067db96d56Sopenharmony_ci   >>> Decimal(355) / Decimal(113)
3077db96d56Sopenharmony_ci   Decimal('3.14159292')
3087db96d56Sopenharmony_ci   >>> getcontext()
3097db96d56Sopenharmony_ci   Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
3107db96d56Sopenharmony_ci           capitals=1, clamp=0, flags=[Inexact, Rounded], traps=[])
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ciThe *flags* entry shows that the rational approximation to pi was
3137db96d56Sopenharmony_cirounded (digits beyond the context precision were thrown away) and that the
3147db96d56Sopenharmony_ciresult is inexact (some of the discarded digits were non-zero).
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ciIndividual traps are set using the dictionary in the :attr:`~Context.traps`
3177db96d56Sopenharmony_ciattribute of a context:
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci.. doctest:: newcontext
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci   >>> setcontext(ExtendedContext)
3227db96d56Sopenharmony_ci   >>> Decimal(1) / Decimal(0)
3237db96d56Sopenharmony_ci   Decimal('Infinity')
3247db96d56Sopenharmony_ci   >>> getcontext().traps[DivisionByZero] = 1
3257db96d56Sopenharmony_ci   >>> Decimal(1) / Decimal(0)
3267db96d56Sopenharmony_ci   Traceback (most recent call last):
3277db96d56Sopenharmony_ci     File "<pyshell#112>", line 1, in -toplevel-
3287db96d56Sopenharmony_ci       Decimal(1) / Decimal(0)
3297db96d56Sopenharmony_ci   DivisionByZero: x / 0
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ciMost programs adjust the current context only once, at the beginning of the
3327db96d56Sopenharmony_ciprogram.  And, in many applications, data is converted to :class:`Decimal` with
3337db96d56Sopenharmony_cia single cast inside a loop.  With context set and decimals created, the bulk of
3347db96d56Sopenharmony_cithe program manipulates the data no differently than with other Python numeric
3357db96d56Sopenharmony_citypes.
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci.. _decimal-decimal:
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ciDecimal objects
3437db96d56Sopenharmony_ci---------------
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci.. class:: Decimal(value="0", context=None)
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ci   Construct a new :class:`Decimal` object based from *value*.
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci   *value* can be an integer, string, tuple, :class:`float`, or another :class:`Decimal`
3517db96d56Sopenharmony_ci   object. If no *value* is given, returns ``Decimal('0')``.  If *value* is a
3527db96d56Sopenharmony_ci   string, it should conform to the decimal numeric string syntax after leading
3537db96d56Sopenharmony_ci   and trailing whitespace characters, as well as underscores throughout, are removed::
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci      sign           ::=  '+' | '-'
3567db96d56Sopenharmony_ci      digit          ::=  '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
3577db96d56Sopenharmony_ci      indicator      ::=  'e' | 'E'
3587db96d56Sopenharmony_ci      digits         ::=  digit [digit]...
3597db96d56Sopenharmony_ci      decimal-part   ::=  digits '.' [digits] | ['.'] digits
3607db96d56Sopenharmony_ci      exponent-part  ::=  indicator [sign] digits
3617db96d56Sopenharmony_ci      infinity       ::=  'Infinity' | 'Inf'
3627db96d56Sopenharmony_ci      nan            ::=  'NaN' [digits] | 'sNaN' [digits]
3637db96d56Sopenharmony_ci      numeric-value  ::=  decimal-part [exponent-part] | infinity
3647db96d56Sopenharmony_ci      numeric-string ::=  [sign] numeric-value | [sign] nan
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci   Other Unicode decimal digits are also permitted where ``digit``
3677db96d56Sopenharmony_ci   appears above.  These include decimal digits from various other
3687db96d56Sopenharmony_ci   alphabets (for example, Arabic-Indic and Devanāgarī digits) along
3697db96d56Sopenharmony_ci   with the fullwidth digits ``'\uff10'`` through ``'\uff19'``.
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_ci   If *value* is a :class:`tuple`, it should have three components, a sign
3727db96d56Sopenharmony_ci   (``0`` for positive or ``1`` for negative), a :class:`tuple` of
3737db96d56Sopenharmony_ci   digits, and an integer exponent. For example, ``Decimal((0, (1, 4, 1, 4), -3))``
3747db96d56Sopenharmony_ci   returns ``Decimal('1.414')``.
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci   If *value* is a :class:`float`, the binary floating point value is losslessly
3777db96d56Sopenharmony_ci   converted to its exact decimal equivalent.  This conversion can often require
3787db96d56Sopenharmony_ci   53 or more digits of precision.  For example, ``Decimal(float('1.1'))``
3797db96d56Sopenharmony_ci   converts to
3807db96d56Sopenharmony_ci   ``Decimal('1.100000000000000088817841970012523233890533447265625')``.
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ci   The *context* precision does not affect how many digits are stored. That is
3837db96d56Sopenharmony_ci   determined exclusively by the number of digits in *value*. For example,
3847db96d56Sopenharmony_ci   ``Decimal('3.00000')`` records all five zeros even if the context precision is
3857db96d56Sopenharmony_ci   only three.
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci   The purpose of the *context* argument is determining what to do if *value* is a
3887db96d56Sopenharmony_ci   malformed string.  If the context traps :const:`InvalidOperation`, an exception
3897db96d56Sopenharmony_ci   is raised; otherwise, the constructor returns a new Decimal with the value of
3907db96d56Sopenharmony_ci   ``NaN``.
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci   Once constructed, :class:`Decimal` objects are immutable.
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci   .. versionchanged:: 3.2
3957db96d56Sopenharmony_ci      The argument to the constructor is now permitted to be a :class:`float`
3967db96d56Sopenharmony_ci      instance.
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ci   .. versionchanged:: 3.3
3997db96d56Sopenharmony_ci      :class:`float` arguments raise an exception if the :exc:`FloatOperation`
4007db96d56Sopenharmony_ci      trap is set. By default the trap is off.
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci   .. versionchanged:: 3.6
4037db96d56Sopenharmony_ci      Underscores are allowed for grouping, as with integral and floating-point
4047db96d56Sopenharmony_ci      literals in code.
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ci   Decimal floating point objects share many properties with the other built-in
4077db96d56Sopenharmony_ci   numeric types such as :class:`float` and :class:`int`.  All of the usual math
4087db96d56Sopenharmony_ci   operations and special methods apply.  Likewise, decimal objects can be
4097db96d56Sopenharmony_ci   copied, pickled, printed, used as dictionary keys, used as set elements,
4107db96d56Sopenharmony_ci   compared, sorted, and coerced to another type (such as :class:`float` or
4117db96d56Sopenharmony_ci   :class:`int`).
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci   There are some small differences between arithmetic on Decimal objects and
4147db96d56Sopenharmony_ci   arithmetic on integers and floats.  When the remainder operator ``%`` is
4157db96d56Sopenharmony_ci   applied to Decimal objects, the sign of the result is the sign of the
4167db96d56Sopenharmony_ci   *dividend* rather than the sign of the divisor::
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci      >>> (-7) % 4
4197db96d56Sopenharmony_ci      1
4207db96d56Sopenharmony_ci      >>> Decimal(-7) % Decimal(4)
4217db96d56Sopenharmony_ci      Decimal('-3')
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci   The integer division operator ``//`` behaves analogously, returning the
4247db96d56Sopenharmony_ci   integer part of the true quotient (truncating towards zero) rather than its
4257db96d56Sopenharmony_ci   floor, so as to preserve the usual identity ``x == (x // y) * y + x % y``::
4267db96d56Sopenharmony_ci
4277db96d56Sopenharmony_ci      >>> -7 // 4
4287db96d56Sopenharmony_ci      -2
4297db96d56Sopenharmony_ci      >>> Decimal(-7) // Decimal(4)
4307db96d56Sopenharmony_ci      Decimal('-1')
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci   The ``%`` and ``//`` operators implement the ``remainder`` and
4337db96d56Sopenharmony_ci   ``divide-integer`` operations (respectively) as described in the
4347db96d56Sopenharmony_ci   specification.
4357db96d56Sopenharmony_ci
4367db96d56Sopenharmony_ci   Decimal objects cannot generally be combined with floats or
4377db96d56Sopenharmony_ci   instances of :class:`fractions.Fraction` in arithmetic operations:
4387db96d56Sopenharmony_ci   an attempt to add a :class:`Decimal` to a :class:`float`, for
4397db96d56Sopenharmony_ci   example, will raise a :exc:`TypeError`.  However, it is possible to
4407db96d56Sopenharmony_ci   use Python's comparison operators to compare a :class:`Decimal`
4417db96d56Sopenharmony_ci   instance ``x`` with another number ``y``.  This avoids confusing results
4427db96d56Sopenharmony_ci   when doing equality comparisons between numbers of different types.
4437db96d56Sopenharmony_ci
4447db96d56Sopenharmony_ci   .. versionchanged:: 3.2
4457db96d56Sopenharmony_ci      Mixed-type comparisons between :class:`Decimal` instances and other
4467db96d56Sopenharmony_ci      numeric types are now fully supported.
4477db96d56Sopenharmony_ci
4487db96d56Sopenharmony_ci   In addition to the standard numeric properties, decimal floating point
4497db96d56Sopenharmony_ci   objects also have a number of specialized methods:
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ci   .. method:: adjusted()
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci      Return the adjusted exponent after shifting out the coefficient's
4557db96d56Sopenharmony_ci      rightmost digits until only the lead digit remains:
4567db96d56Sopenharmony_ci      ``Decimal('321e+5').adjusted()`` returns seven.  Used for determining the
4577db96d56Sopenharmony_ci      position of the most significant digit with respect to the decimal point.
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci   .. method:: as_integer_ratio()
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ci      Return a pair ``(n, d)`` of integers that represent the given
4627db96d56Sopenharmony_ci      :class:`Decimal` instance as a fraction, in lowest terms and
4637db96d56Sopenharmony_ci      with a positive denominator::
4647db96d56Sopenharmony_ci
4657db96d56Sopenharmony_ci          >>> Decimal('-3.14').as_integer_ratio()
4667db96d56Sopenharmony_ci          (-157, 50)
4677db96d56Sopenharmony_ci
4687db96d56Sopenharmony_ci      The conversion is exact.  Raise OverflowError on infinities and ValueError
4697db96d56Sopenharmony_ci      on NaNs.
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci   .. versionadded:: 3.6
4727db96d56Sopenharmony_ci
4737db96d56Sopenharmony_ci   .. method:: as_tuple()
4747db96d56Sopenharmony_ci
4757db96d56Sopenharmony_ci      Return a :term:`named tuple` representation of the number:
4767db96d56Sopenharmony_ci      ``DecimalTuple(sign, digits, exponent)``.
4777db96d56Sopenharmony_ci
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ci   .. method:: canonical()
4807db96d56Sopenharmony_ci
4817db96d56Sopenharmony_ci      Return the canonical encoding of the argument.  Currently, the encoding of
4827db96d56Sopenharmony_ci      a :class:`Decimal` instance is always canonical, so this operation returns
4837db96d56Sopenharmony_ci      its argument unchanged.
4847db96d56Sopenharmony_ci
4857db96d56Sopenharmony_ci   .. method:: compare(other, context=None)
4867db96d56Sopenharmony_ci
4877db96d56Sopenharmony_ci      Compare the values of two Decimal instances.  :meth:`compare` returns a
4887db96d56Sopenharmony_ci      Decimal instance, and if either operand is a NaN then the result is a
4897db96d56Sopenharmony_ci      NaN::
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci         a or b is a NaN  ==> Decimal('NaN')
4927db96d56Sopenharmony_ci         a < b            ==> Decimal('-1')
4937db96d56Sopenharmony_ci         a == b           ==> Decimal('0')
4947db96d56Sopenharmony_ci         a > b            ==> Decimal('1')
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci   .. method:: compare_signal(other, context=None)
4977db96d56Sopenharmony_ci
4987db96d56Sopenharmony_ci      This operation is identical to the :meth:`compare` method, except that all
4997db96d56Sopenharmony_ci      NaNs signal.  That is, if neither operand is a signaling NaN then any
5007db96d56Sopenharmony_ci      quiet NaN operand is treated as though it were a signaling NaN.
5017db96d56Sopenharmony_ci
5027db96d56Sopenharmony_ci   .. method:: compare_total(other, context=None)
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_ci      Compare two operands using their abstract representation rather than their
5057db96d56Sopenharmony_ci      numerical value.  Similar to the :meth:`compare` method, but the result
5067db96d56Sopenharmony_ci      gives a total ordering on :class:`Decimal` instances.  Two
5077db96d56Sopenharmony_ci      :class:`Decimal` instances with the same numeric value but different
5087db96d56Sopenharmony_ci      representations compare unequal in this ordering:
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci         >>> Decimal('12.0').compare_total(Decimal('12'))
5117db96d56Sopenharmony_ci         Decimal('-1')
5127db96d56Sopenharmony_ci
5137db96d56Sopenharmony_ci      Quiet and signaling NaNs are also included in the total ordering.  The
5147db96d56Sopenharmony_ci      result of this function is ``Decimal('0')`` if both operands have the same
5157db96d56Sopenharmony_ci      representation, ``Decimal('-1')`` if the first operand is lower in the
5167db96d56Sopenharmony_ci      total order than the second, and ``Decimal('1')`` if the first operand is
5177db96d56Sopenharmony_ci      higher in the total order than the second operand.  See the specification
5187db96d56Sopenharmony_ci      for details of the total order.
5197db96d56Sopenharmony_ci
5207db96d56Sopenharmony_ci      This operation is unaffected by context and is quiet: no flags are changed
5217db96d56Sopenharmony_ci      and no rounding is performed.  As an exception, the C version may raise
5227db96d56Sopenharmony_ci      InvalidOperation if the second operand cannot be converted exactly.
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_ci   .. method:: compare_total_mag(other, context=None)
5257db96d56Sopenharmony_ci
5267db96d56Sopenharmony_ci      Compare two operands using their abstract representation rather than their
5277db96d56Sopenharmony_ci      value as in :meth:`compare_total`, but ignoring the sign of each operand.
5287db96d56Sopenharmony_ci      ``x.compare_total_mag(y)`` is equivalent to
5297db96d56Sopenharmony_ci      ``x.copy_abs().compare_total(y.copy_abs())``.
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ci      This operation is unaffected by context and is quiet: no flags are changed
5327db96d56Sopenharmony_ci      and no rounding is performed.  As an exception, the C version may raise
5337db96d56Sopenharmony_ci      InvalidOperation if the second operand cannot be converted exactly.
5347db96d56Sopenharmony_ci
5357db96d56Sopenharmony_ci   .. method:: conjugate()
5367db96d56Sopenharmony_ci
5377db96d56Sopenharmony_ci      Just returns self, this method is only to comply with the Decimal
5387db96d56Sopenharmony_ci      Specification.
5397db96d56Sopenharmony_ci
5407db96d56Sopenharmony_ci   .. method:: copy_abs()
5417db96d56Sopenharmony_ci
5427db96d56Sopenharmony_ci      Return the absolute value of the argument.  This operation is unaffected
5437db96d56Sopenharmony_ci      by the context and is quiet: no flags are changed and no rounding is
5447db96d56Sopenharmony_ci      performed.
5457db96d56Sopenharmony_ci
5467db96d56Sopenharmony_ci   .. method:: copy_negate()
5477db96d56Sopenharmony_ci
5487db96d56Sopenharmony_ci      Return the negation of the argument.  This operation is unaffected by the
5497db96d56Sopenharmony_ci      context and is quiet: no flags are changed and no rounding is performed.
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ci   .. method:: copy_sign(other, context=None)
5527db96d56Sopenharmony_ci
5537db96d56Sopenharmony_ci      Return a copy of the first operand with the sign set to be the same as the
5547db96d56Sopenharmony_ci      sign of the second operand.  For example:
5557db96d56Sopenharmony_ci
5567db96d56Sopenharmony_ci         >>> Decimal('2.3').copy_sign(Decimal('-1.5'))
5577db96d56Sopenharmony_ci         Decimal('-2.3')
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci      This operation is unaffected by context and is quiet: no flags are changed
5607db96d56Sopenharmony_ci      and no rounding is performed.  As an exception, the C version may raise
5617db96d56Sopenharmony_ci      InvalidOperation if the second operand cannot be converted exactly.
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_ci   .. method:: exp(context=None)
5647db96d56Sopenharmony_ci
5657db96d56Sopenharmony_ci      Return the value of the (natural) exponential function ``e**x`` at the
5667db96d56Sopenharmony_ci      given number.  The result is correctly rounded using the
5677db96d56Sopenharmony_ci      :const:`ROUND_HALF_EVEN` rounding mode.
5687db96d56Sopenharmony_ci
5697db96d56Sopenharmony_ci      >>> Decimal(1).exp()
5707db96d56Sopenharmony_ci      Decimal('2.718281828459045235360287471')
5717db96d56Sopenharmony_ci      >>> Decimal(321).exp()
5727db96d56Sopenharmony_ci      Decimal('2.561702493119680037517373933E+139')
5737db96d56Sopenharmony_ci
5747db96d56Sopenharmony_ci   .. classmethod:: from_float(f)
5757db96d56Sopenharmony_ci
5767db96d56Sopenharmony_ci      Alternative constructor that only accepts instances of :class:`float` or
5777db96d56Sopenharmony_ci      :class:`int`.
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci      Note ``Decimal.from_float(0.1)`` is not the same as ``Decimal('0.1')``.
5807db96d56Sopenharmony_ci      Since 0.1 is not exactly representable in binary floating point, the
5817db96d56Sopenharmony_ci      value is stored as the nearest representable value which is
5827db96d56Sopenharmony_ci      ``0x1.999999999999ap-4``.  That equivalent value in decimal is
5837db96d56Sopenharmony_ci      ``0.1000000000000000055511151231257827021181583404541015625``.
5847db96d56Sopenharmony_ci
5857db96d56Sopenharmony_ci      .. note:: From Python 3.2 onwards, a :class:`Decimal` instance
5867db96d56Sopenharmony_ci         can also be constructed directly from a :class:`float`.
5877db96d56Sopenharmony_ci
5887db96d56Sopenharmony_ci      .. doctest::
5897db96d56Sopenharmony_ci
5907db96d56Sopenharmony_ci          >>> Decimal.from_float(0.1)
5917db96d56Sopenharmony_ci          Decimal('0.1000000000000000055511151231257827021181583404541015625')
5927db96d56Sopenharmony_ci          >>> Decimal.from_float(float('nan'))
5937db96d56Sopenharmony_ci          Decimal('NaN')
5947db96d56Sopenharmony_ci          >>> Decimal.from_float(float('inf'))
5957db96d56Sopenharmony_ci          Decimal('Infinity')
5967db96d56Sopenharmony_ci          >>> Decimal.from_float(float('-inf'))
5977db96d56Sopenharmony_ci          Decimal('-Infinity')
5987db96d56Sopenharmony_ci
5997db96d56Sopenharmony_ci      .. versionadded:: 3.1
6007db96d56Sopenharmony_ci
6017db96d56Sopenharmony_ci   .. method:: fma(other, third, context=None)
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci      Fused multiply-add.  Return self*other+third with no rounding of the
6047db96d56Sopenharmony_ci      intermediate product self*other.
6057db96d56Sopenharmony_ci
6067db96d56Sopenharmony_ci      >>> Decimal(2).fma(3, 5)
6077db96d56Sopenharmony_ci      Decimal('11')
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci   .. method:: is_canonical()
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_ci      Return :const:`True` if the argument is canonical and :const:`False`
6127db96d56Sopenharmony_ci      otherwise.  Currently, a :class:`Decimal` instance is always canonical, so
6137db96d56Sopenharmony_ci      this operation always returns :const:`True`.
6147db96d56Sopenharmony_ci
6157db96d56Sopenharmony_ci   .. method:: is_finite()
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ci      Return :const:`True` if the argument is a finite number, and
6187db96d56Sopenharmony_ci      :const:`False` if the argument is an infinity or a NaN.
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_ci   .. method:: is_infinite()
6217db96d56Sopenharmony_ci
6227db96d56Sopenharmony_ci      Return :const:`True` if the argument is either positive or negative
6237db96d56Sopenharmony_ci      infinity and :const:`False` otherwise.
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci   .. method:: is_nan()
6267db96d56Sopenharmony_ci
6277db96d56Sopenharmony_ci      Return :const:`True` if the argument is a (quiet or signaling) NaN and
6287db96d56Sopenharmony_ci      :const:`False` otherwise.
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ci   .. method:: is_normal(context=None)
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ci      Return :const:`True` if the argument is a *normal* finite number.  Return
6337db96d56Sopenharmony_ci      :const:`False` if the argument is zero, subnormal, infinite or a NaN.
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci   .. method:: is_qnan()
6367db96d56Sopenharmony_ci
6377db96d56Sopenharmony_ci      Return :const:`True` if the argument is a quiet NaN, and
6387db96d56Sopenharmony_ci      :const:`False` otherwise.
6397db96d56Sopenharmony_ci
6407db96d56Sopenharmony_ci   .. method:: is_signed()
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci      Return :const:`True` if the argument has a negative sign and
6437db96d56Sopenharmony_ci      :const:`False` otherwise.  Note that zeros and NaNs can both carry signs.
6447db96d56Sopenharmony_ci
6457db96d56Sopenharmony_ci   .. method:: is_snan()
6467db96d56Sopenharmony_ci
6477db96d56Sopenharmony_ci      Return :const:`True` if the argument is a signaling NaN and :const:`False`
6487db96d56Sopenharmony_ci      otherwise.
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ci   .. method:: is_subnormal(context=None)
6517db96d56Sopenharmony_ci
6527db96d56Sopenharmony_ci      Return :const:`True` if the argument is subnormal, and :const:`False`
6537db96d56Sopenharmony_ci      otherwise.
6547db96d56Sopenharmony_ci
6557db96d56Sopenharmony_ci   .. method:: is_zero()
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ci      Return :const:`True` if the argument is a (positive or negative) zero and
6587db96d56Sopenharmony_ci      :const:`False` otherwise.
6597db96d56Sopenharmony_ci
6607db96d56Sopenharmony_ci   .. method:: ln(context=None)
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ci      Return the natural (base e) logarithm of the operand.  The result is
6637db96d56Sopenharmony_ci      correctly rounded using the :const:`ROUND_HALF_EVEN` rounding mode.
6647db96d56Sopenharmony_ci
6657db96d56Sopenharmony_ci   .. method:: log10(context=None)
6667db96d56Sopenharmony_ci
6677db96d56Sopenharmony_ci      Return the base ten logarithm of the operand.  The result is correctly
6687db96d56Sopenharmony_ci      rounded using the :const:`ROUND_HALF_EVEN` rounding mode.
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci   .. method:: logb(context=None)
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ci      For a nonzero number, return the adjusted exponent of its operand as a
6737db96d56Sopenharmony_ci      :class:`Decimal` instance.  If the operand is a zero then
6747db96d56Sopenharmony_ci      ``Decimal('-Infinity')`` is returned and the :const:`DivisionByZero` flag
6757db96d56Sopenharmony_ci      is raised.  If the operand is an infinity then ``Decimal('Infinity')`` is
6767db96d56Sopenharmony_ci      returned.
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ci   .. method:: logical_and(other, context=None)
6797db96d56Sopenharmony_ci
6807db96d56Sopenharmony_ci      :meth:`logical_and` is a logical operation which takes two *logical
6817db96d56Sopenharmony_ci      operands* (see :ref:`logical_operands_label`).  The result is the
6827db96d56Sopenharmony_ci      digit-wise ``and`` of the two operands.
6837db96d56Sopenharmony_ci
6847db96d56Sopenharmony_ci   .. method:: logical_invert(context=None)
6857db96d56Sopenharmony_ci
6867db96d56Sopenharmony_ci      :meth:`logical_invert` is a logical operation.  The
6877db96d56Sopenharmony_ci      result is the digit-wise inversion of the operand.
6887db96d56Sopenharmony_ci
6897db96d56Sopenharmony_ci   .. method:: logical_or(other, context=None)
6907db96d56Sopenharmony_ci
6917db96d56Sopenharmony_ci      :meth:`logical_or` is a logical operation which takes two *logical
6927db96d56Sopenharmony_ci      operands* (see :ref:`logical_operands_label`).  The result is the
6937db96d56Sopenharmony_ci      digit-wise ``or`` of the two operands.
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_ci   .. method:: logical_xor(other, context=None)
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_ci      :meth:`logical_xor` is a logical operation which takes two *logical
6987db96d56Sopenharmony_ci      operands* (see :ref:`logical_operands_label`).  The result is the
6997db96d56Sopenharmony_ci      digit-wise exclusive or of the two operands.
7007db96d56Sopenharmony_ci
7017db96d56Sopenharmony_ci   .. method:: max(other, context=None)
7027db96d56Sopenharmony_ci
7037db96d56Sopenharmony_ci      Like ``max(self, other)`` except that the context rounding rule is applied
7047db96d56Sopenharmony_ci      before returning and that ``NaN`` values are either signaled or
7057db96d56Sopenharmony_ci      ignored (depending on the context and whether they are signaling or
7067db96d56Sopenharmony_ci      quiet).
7077db96d56Sopenharmony_ci
7087db96d56Sopenharmony_ci   .. method:: max_mag(other, context=None)
7097db96d56Sopenharmony_ci
7107db96d56Sopenharmony_ci      Similar to the :meth:`.max` method, but the comparison is done using the
7117db96d56Sopenharmony_ci      absolute values of the operands.
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_ci   .. method:: min(other, context=None)
7147db96d56Sopenharmony_ci
7157db96d56Sopenharmony_ci      Like ``min(self, other)`` except that the context rounding rule is applied
7167db96d56Sopenharmony_ci      before returning and that ``NaN`` values are either signaled or
7177db96d56Sopenharmony_ci      ignored (depending on the context and whether they are signaling or
7187db96d56Sopenharmony_ci      quiet).
7197db96d56Sopenharmony_ci
7207db96d56Sopenharmony_ci   .. method:: min_mag(other, context=None)
7217db96d56Sopenharmony_ci
7227db96d56Sopenharmony_ci      Similar to the :meth:`.min` method, but the comparison is done using the
7237db96d56Sopenharmony_ci      absolute values of the operands.
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ci   .. method:: next_minus(context=None)
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci      Return the largest number representable in the given context (or in the
7287db96d56Sopenharmony_ci      current thread's context if no context is given) that is smaller than the
7297db96d56Sopenharmony_ci      given operand.
7307db96d56Sopenharmony_ci
7317db96d56Sopenharmony_ci   .. method:: next_plus(context=None)
7327db96d56Sopenharmony_ci
7337db96d56Sopenharmony_ci      Return the smallest number representable in the given context (or in the
7347db96d56Sopenharmony_ci      current thread's context if no context is given) that is larger than the
7357db96d56Sopenharmony_ci      given operand.
7367db96d56Sopenharmony_ci
7377db96d56Sopenharmony_ci   .. method:: next_toward(other, context=None)
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_ci      If the two operands are unequal, return the number closest to the first
7407db96d56Sopenharmony_ci      operand in the direction of the second operand.  If both operands are
7417db96d56Sopenharmony_ci      numerically equal, return a copy of the first operand with the sign set to
7427db96d56Sopenharmony_ci      be the same as the sign of the second operand.
7437db96d56Sopenharmony_ci
7447db96d56Sopenharmony_ci   .. method:: normalize(context=None)
7457db96d56Sopenharmony_ci
7467db96d56Sopenharmony_ci      Normalize the number by stripping the rightmost trailing zeros and
7477db96d56Sopenharmony_ci      converting any result equal to ``Decimal('0')`` to
7487db96d56Sopenharmony_ci      ``Decimal('0e0')``. Used for producing canonical values for attributes
7497db96d56Sopenharmony_ci      of an equivalence class. For example, ``Decimal('32.100')`` and
7507db96d56Sopenharmony_ci      ``Decimal('0.321000e+2')`` both normalize to the equivalent value
7517db96d56Sopenharmony_ci      ``Decimal('32.1')``.
7527db96d56Sopenharmony_ci
7537db96d56Sopenharmony_ci   .. method:: number_class(context=None)
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ci      Return a string describing the *class* of the operand.  The returned value
7567db96d56Sopenharmony_ci      is one of the following ten strings.
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci      * ``"-Infinity"``, indicating that the operand is negative infinity.
7597db96d56Sopenharmony_ci      * ``"-Normal"``, indicating that the operand is a negative normal number.
7607db96d56Sopenharmony_ci      * ``"-Subnormal"``, indicating that the operand is negative and subnormal.
7617db96d56Sopenharmony_ci      * ``"-Zero"``, indicating that the operand is a negative zero.
7627db96d56Sopenharmony_ci      * ``"+Zero"``, indicating that the operand is a positive zero.
7637db96d56Sopenharmony_ci      * ``"+Subnormal"``, indicating that the operand is positive and subnormal.
7647db96d56Sopenharmony_ci      * ``"+Normal"``, indicating that the operand is a positive normal number.
7657db96d56Sopenharmony_ci      * ``"+Infinity"``, indicating that the operand is positive infinity.
7667db96d56Sopenharmony_ci      * ``"NaN"``, indicating that the operand is a quiet NaN (Not a Number).
7677db96d56Sopenharmony_ci      * ``"sNaN"``, indicating that the operand is a signaling NaN.
7687db96d56Sopenharmony_ci
7697db96d56Sopenharmony_ci   .. method:: quantize(exp, rounding=None, context=None)
7707db96d56Sopenharmony_ci
7717db96d56Sopenharmony_ci      Return a value equal to the first operand after rounding and having the
7727db96d56Sopenharmony_ci      exponent of the second operand.
7737db96d56Sopenharmony_ci
7747db96d56Sopenharmony_ci      >>> Decimal('1.41421356').quantize(Decimal('1.000'))
7757db96d56Sopenharmony_ci      Decimal('1.414')
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci      Unlike other operations, if the length of the coefficient after the
7787db96d56Sopenharmony_ci      quantize operation would be greater than precision, then an
7797db96d56Sopenharmony_ci      :const:`InvalidOperation` is signaled. This guarantees that, unless there
7807db96d56Sopenharmony_ci      is an error condition, the quantized exponent is always equal to that of
7817db96d56Sopenharmony_ci      the right-hand operand.
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_ci      Also unlike other operations, quantize never signals Underflow, even if
7847db96d56Sopenharmony_ci      the result is subnormal and inexact.
7857db96d56Sopenharmony_ci
7867db96d56Sopenharmony_ci      If the exponent of the second operand is larger than that of the first
7877db96d56Sopenharmony_ci      then rounding may be necessary.  In this case, the rounding mode is
7887db96d56Sopenharmony_ci      determined by the ``rounding`` argument if given, else by the given
7897db96d56Sopenharmony_ci      ``context`` argument; if neither argument is given the rounding mode of
7907db96d56Sopenharmony_ci      the current thread's context is used.
7917db96d56Sopenharmony_ci
7927db96d56Sopenharmony_ci      An error is returned whenever the resulting exponent is greater than
7937db96d56Sopenharmony_ci      :attr:`~Context.Emax` or less than :meth:`~Context.Etiny`.
7947db96d56Sopenharmony_ci
7957db96d56Sopenharmony_ci   .. method:: radix()
7967db96d56Sopenharmony_ci
7977db96d56Sopenharmony_ci      Return ``Decimal(10)``, the radix (base) in which the :class:`Decimal`
7987db96d56Sopenharmony_ci      class does all its arithmetic.  Included for compatibility with the
7997db96d56Sopenharmony_ci      specification.
8007db96d56Sopenharmony_ci
8017db96d56Sopenharmony_ci   .. method:: remainder_near(other, context=None)
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ci      Return the remainder from dividing *self* by *other*.  This differs from
8047db96d56Sopenharmony_ci      ``self % other`` in that the sign of the remainder is chosen so as to
8057db96d56Sopenharmony_ci      minimize its absolute value.  More precisely, the return value is
8067db96d56Sopenharmony_ci      ``self - n * other`` where ``n`` is the integer nearest to the exact
8077db96d56Sopenharmony_ci      value of ``self / other``, and if two integers are equally near then the
8087db96d56Sopenharmony_ci      even one is chosen.
8097db96d56Sopenharmony_ci
8107db96d56Sopenharmony_ci      If the result is zero then its sign will be the sign of *self*.
8117db96d56Sopenharmony_ci
8127db96d56Sopenharmony_ci      >>> Decimal(18).remainder_near(Decimal(10))
8137db96d56Sopenharmony_ci      Decimal('-2')
8147db96d56Sopenharmony_ci      >>> Decimal(25).remainder_near(Decimal(10))
8157db96d56Sopenharmony_ci      Decimal('5')
8167db96d56Sopenharmony_ci      >>> Decimal(35).remainder_near(Decimal(10))
8177db96d56Sopenharmony_ci      Decimal('-5')
8187db96d56Sopenharmony_ci
8197db96d56Sopenharmony_ci   .. method:: rotate(other, context=None)
8207db96d56Sopenharmony_ci
8217db96d56Sopenharmony_ci      Return the result of rotating the digits of the first operand by an amount
8227db96d56Sopenharmony_ci      specified by the second operand.  The second operand must be an integer in
8237db96d56Sopenharmony_ci      the range -precision through precision.  The absolute value of the second
8247db96d56Sopenharmony_ci      operand gives the number of places to rotate.  If the second operand is
8257db96d56Sopenharmony_ci      positive then rotation is to the left; otherwise rotation is to the right.
8267db96d56Sopenharmony_ci      The coefficient of the first operand is padded on the left with zeros to
8277db96d56Sopenharmony_ci      length precision if necessary.  The sign and exponent of the first operand
8287db96d56Sopenharmony_ci      are unchanged.
8297db96d56Sopenharmony_ci
8307db96d56Sopenharmony_ci   .. method:: same_quantum(other, context=None)
8317db96d56Sopenharmony_ci
8327db96d56Sopenharmony_ci      Test whether self and other have the same exponent or whether both are
8337db96d56Sopenharmony_ci      ``NaN``.
8347db96d56Sopenharmony_ci
8357db96d56Sopenharmony_ci      This operation is unaffected by context and is quiet: no flags are changed
8367db96d56Sopenharmony_ci      and no rounding is performed.  As an exception, the C version may raise
8377db96d56Sopenharmony_ci      InvalidOperation if the second operand cannot be converted exactly.
8387db96d56Sopenharmony_ci
8397db96d56Sopenharmony_ci   .. method:: scaleb(other, context=None)
8407db96d56Sopenharmony_ci
8417db96d56Sopenharmony_ci      Return the first operand with exponent adjusted by the second.
8427db96d56Sopenharmony_ci      Equivalently, return the first operand multiplied by ``10**other``.  The
8437db96d56Sopenharmony_ci      second operand must be an integer.
8447db96d56Sopenharmony_ci
8457db96d56Sopenharmony_ci   .. method:: shift(other, context=None)
8467db96d56Sopenharmony_ci
8477db96d56Sopenharmony_ci      Return the result of shifting the digits of the first operand by an amount
8487db96d56Sopenharmony_ci      specified by the second operand.  The second operand must be an integer in
8497db96d56Sopenharmony_ci      the range -precision through precision.  The absolute value of the second
8507db96d56Sopenharmony_ci      operand gives the number of places to shift.  If the second operand is
8517db96d56Sopenharmony_ci      positive then the shift is to the left; otherwise the shift is to the
8527db96d56Sopenharmony_ci      right.  Digits shifted into the coefficient are zeros.  The sign and
8537db96d56Sopenharmony_ci      exponent of the first operand are unchanged.
8547db96d56Sopenharmony_ci
8557db96d56Sopenharmony_ci   .. method:: sqrt(context=None)
8567db96d56Sopenharmony_ci
8577db96d56Sopenharmony_ci      Return the square root of the argument to full precision.
8587db96d56Sopenharmony_ci
8597db96d56Sopenharmony_ci
8607db96d56Sopenharmony_ci   .. method:: to_eng_string(context=None)
8617db96d56Sopenharmony_ci
8627db96d56Sopenharmony_ci      Convert to a string, using engineering notation if an exponent is needed.
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ci      Engineering notation has an exponent which is a multiple of 3.  This
8657db96d56Sopenharmony_ci      can leave up to 3 digits to the left of the decimal place and may
8667db96d56Sopenharmony_ci      require the addition of either one or two trailing zeros.
8677db96d56Sopenharmony_ci
8687db96d56Sopenharmony_ci      For example, this converts ``Decimal('123E+1')`` to ``Decimal('1.23E+3')``.
8697db96d56Sopenharmony_ci
8707db96d56Sopenharmony_ci   .. method:: to_integral(rounding=None, context=None)
8717db96d56Sopenharmony_ci
8727db96d56Sopenharmony_ci      Identical to the :meth:`to_integral_value` method.  The ``to_integral``
8737db96d56Sopenharmony_ci      name has been kept for compatibility with older versions.
8747db96d56Sopenharmony_ci
8757db96d56Sopenharmony_ci   .. method:: to_integral_exact(rounding=None, context=None)
8767db96d56Sopenharmony_ci
8777db96d56Sopenharmony_ci      Round to the nearest integer, signaling :const:`Inexact` or
8787db96d56Sopenharmony_ci      :const:`Rounded` as appropriate if rounding occurs.  The rounding mode is
8797db96d56Sopenharmony_ci      determined by the ``rounding`` parameter if given, else by the given
8807db96d56Sopenharmony_ci      ``context``.  If neither parameter is given then the rounding mode of the
8817db96d56Sopenharmony_ci      current context is used.
8827db96d56Sopenharmony_ci
8837db96d56Sopenharmony_ci   .. method:: to_integral_value(rounding=None, context=None)
8847db96d56Sopenharmony_ci
8857db96d56Sopenharmony_ci      Round to the nearest integer without signaling :const:`Inexact` or
8867db96d56Sopenharmony_ci      :const:`Rounded`.  If given, applies *rounding*; otherwise, uses the
8877db96d56Sopenharmony_ci      rounding method in either the supplied *context* or the current context.
8887db96d56Sopenharmony_ci
8897db96d56Sopenharmony_ci
8907db96d56Sopenharmony_ci.. _logical_operands_label:
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ciLogical operands
8937db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
8947db96d56Sopenharmony_ci
8957db96d56Sopenharmony_ciThe :meth:`~Decimal.logical_and`, :meth:`~Decimal.logical_invert`, :meth:`~Decimal.logical_or`,
8967db96d56Sopenharmony_ciand :meth:`~Decimal.logical_xor` methods expect their arguments to be *logical
8977db96d56Sopenharmony_cioperands*.  A *logical operand* is a :class:`Decimal` instance whose
8987db96d56Sopenharmony_ciexponent and sign are both zero, and whose digits are all either
8997db96d56Sopenharmony_ci``0`` or ``1``.
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9027db96d56Sopenharmony_ci
9037db96d56Sopenharmony_ci
9047db96d56Sopenharmony_ci.. _decimal-context:
9057db96d56Sopenharmony_ci
9067db96d56Sopenharmony_ciContext objects
9077db96d56Sopenharmony_ci---------------
9087db96d56Sopenharmony_ci
9097db96d56Sopenharmony_ciContexts are environments for arithmetic operations.  They govern precision, set
9107db96d56Sopenharmony_cirules for rounding, determine which signals are treated as exceptions, and limit
9117db96d56Sopenharmony_cithe range for exponents.
9127db96d56Sopenharmony_ci
9137db96d56Sopenharmony_ciEach thread has its own current context which is accessed or changed using the
9147db96d56Sopenharmony_ci:func:`getcontext` and :func:`setcontext` functions:
9157db96d56Sopenharmony_ci
9167db96d56Sopenharmony_ci
9177db96d56Sopenharmony_ci.. function:: getcontext()
9187db96d56Sopenharmony_ci
9197db96d56Sopenharmony_ci   Return the current context for the active thread.
9207db96d56Sopenharmony_ci
9217db96d56Sopenharmony_ci
9227db96d56Sopenharmony_ci.. function:: setcontext(c)
9237db96d56Sopenharmony_ci
9247db96d56Sopenharmony_ci   Set the current context for the active thread to *c*.
9257db96d56Sopenharmony_ci
9267db96d56Sopenharmony_ciYou can also use the :keyword:`with` statement and the :func:`localcontext`
9277db96d56Sopenharmony_cifunction to temporarily change the active context.
9287db96d56Sopenharmony_ci
9297db96d56Sopenharmony_ci.. function:: localcontext(ctx=None, \*\*kwargs)
9307db96d56Sopenharmony_ci
9317db96d56Sopenharmony_ci   Return a context manager that will set the current context for the active thread
9327db96d56Sopenharmony_ci   to a copy of *ctx* on entry to the with-statement and restore the previous context
9337db96d56Sopenharmony_ci   when exiting the with-statement. If no context is specified, a copy of the
9347db96d56Sopenharmony_ci   current context is used.  The *kwargs* argument is used to set the attributes
9357db96d56Sopenharmony_ci   of the new context.
9367db96d56Sopenharmony_ci
9377db96d56Sopenharmony_ci   For example, the following code sets the current decimal precision to 42 places,
9387db96d56Sopenharmony_ci   performs a calculation, and then automatically restores the previous context::
9397db96d56Sopenharmony_ci
9407db96d56Sopenharmony_ci      from decimal import localcontext
9417db96d56Sopenharmony_ci
9427db96d56Sopenharmony_ci      with localcontext() as ctx:
9437db96d56Sopenharmony_ci          ctx.prec = 42   # Perform a high precision calculation
9447db96d56Sopenharmony_ci          s = calculate_something()
9457db96d56Sopenharmony_ci      s = +s  # Round the final result back to the default precision
9467db96d56Sopenharmony_ci
9477db96d56Sopenharmony_ci   Using keyword arguments, the code would be the following::
9487db96d56Sopenharmony_ci
9497db96d56Sopenharmony_ci      from decimal import localcontext
9507db96d56Sopenharmony_ci
9517db96d56Sopenharmony_ci      with localcontext(prec=42) as ctx:
9527db96d56Sopenharmony_ci          s = calculate_something()
9537db96d56Sopenharmony_ci      s = +s
9547db96d56Sopenharmony_ci
9557db96d56Sopenharmony_ci   Raises :exc:`TypeError` if *kwargs* supplies an attribute that :class:`Context` doesn't
9567db96d56Sopenharmony_ci   support.  Raises either :exc:`TypeError` or :exc:`ValueError` if *kwargs* supplies an
9577db96d56Sopenharmony_ci   invalid value for an attribute.
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_ci   .. versionchanged:: 3.11
9607db96d56Sopenharmony_ci      :meth:`localcontext` now supports setting context attributes through the use of keyword arguments.
9617db96d56Sopenharmony_ci
9627db96d56Sopenharmony_ciNew contexts can also be created using the :class:`Context` constructor
9637db96d56Sopenharmony_cidescribed below. In addition, the module provides three pre-made contexts:
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_ci
9667db96d56Sopenharmony_ci.. class:: BasicContext
9677db96d56Sopenharmony_ci
9687db96d56Sopenharmony_ci   This is a standard context defined by the General Decimal Arithmetic
9697db96d56Sopenharmony_ci   Specification.  Precision is set to nine.  Rounding is set to
9707db96d56Sopenharmony_ci   :const:`ROUND_HALF_UP`.  All flags are cleared.  All traps are enabled (treated
9717db96d56Sopenharmony_ci   as exceptions) except :const:`Inexact`, :const:`Rounded`, and
9727db96d56Sopenharmony_ci   :const:`Subnormal`.
9737db96d56Sopenharmony_ci
9747db96d56Sopenharmony_ci   Because many of the traps are enabled, this context is useful for debugging.
9757db96d56Sopenharmony_ci
9767db96d56Sopenharmony_ci
9777db96d56Sopenharmony_ci.. class:: ExtendedContext
9787db96d56Sopenharmony_ci
9797db96d56Sopenharmony_ci   This is a standard context defined by the General Decimal Arithmetic
9807db96d56Sopenharmony_ci   Specification.  Precision is set to nine.  Rounding is set to
9817db96d56Sopenharmony_ci   :const:`ROUND_HALF_EVEN`.  All flags are cleared.  No traps are enabled (so that
9827db96d56Sopenharmony_ci   exceptions are not raised during computations).
9837db96d56Sopenharmony_ci
9847db96d56Sopenharmony_ci   Because the traps are disabled, this context is useful for applications that
9857db96d56Sopenharmony_ci   prefer to have result value of ``NaN`` or ``Infinity`` instead of
9867db96d56Sopenharmony_ci   raising exceptions.  This allows an application to complete a run in the
9877db96d56Sopenharmony_ci   presence of conditions that would otherwise halt the program.
9887db96d56Sopenharmony_ci
9897db96d56Sopenharmony_ci
9907db96d56Sopenharmony_ci.. class:: DefaultContext
9917db96d56Sopenharmony_ci
9927db96d56Sopenharmony_ci   This context is used by the :class:`Context` constructor as a prototype for new
9937db96d56Sopenharmony_ci   contexts.  Changing a field (such a precision) has the effect of changing the
9947db96d56Sopenharmony_ci   default for new contexts created by the :class:`Context` constructor.
9957db96d56Sopenharmony_ci
9967db96d56Sopenharmony_ci   This context is most useful in multi-threaded environments.  Changing one of the
9977db96d56Sopenharmony_ci   fields before threads are started has the effect of setting system-wide
9987db96d56Sopenharmony_ci   defaults.  Changing the fields after threads have started is not recommended as
9997db96d56Sopenharmony_ci   it would require thread synchronization to prevent race conditions.
10007db96d56Sopenharmony_ci
10017db96d56Sopenharmony_ci   In single threaded environments, it is preferable to not use this context at
10027db96d56Sopenharmony_ci   all.  Instead, simply create contexts explicitly as described below.
10037db96d56Sopenharmony_ci
10047db96d56Sopenharmony_ci   The default values are :attr:`Context.prec`\ =\ ``28``,
10057db96d56Sopenharmony_ci   :attr:`Context.rounding`\ =\ :const:`ROUND_HALF_EVEN`,
10067db96d56Sopenharmony_ci   and enabled traps for :class:`Overflow`, :class:`InvalidOperation`, and
10077db96d56Sopenharmony_ci   :class:`DivisionByZero`.
10087db96d56Sopenharmony_ci
10097db96d56Sopenharmony_ciIn addition to the three supplied contexts, new contexts can be created with the
10107db96d56Sopenharmony_ci:class:`Context` constructor.
10117db96d56Sopenharmony_ci
10127db96d56Sopenharmony_ci
10137db96d56Sopenharmony_ci.. class:: Context(prec=None, rounding=None, Emin=None, Emax=None, capitals=None, clamp=None, flags=None, traps=None)
10147db96d56Sopenharmony_ci
10157db96d56Sopenharmony_ci   Creates a new context.  If a field is not specified or is :const:`None`, the
10167db96d56Sopenharmony_ci   default values are copied from the :const:`DefaultContext`.  If the *flags*
10177db96d56Sopenharmony_ci   field is not specified or is :const:`None`, all flags are cleared.
10187db96d56Sopenharmony_ci
10197db96d56Sopenharmony_ci   *prec* is an integer in the range [``1``, :const:`MAX_PREC`] that sets
10207db96d56Sopenharmony_ci   the precision for arithmetic operations in the context.
10217db96d56Sopenharmony_ci
10227db96d56Sopenharmony_ci   The *rounding* option is one of the constants listed in the section
10237db96d56Sopenharmony_ci   `Rounding Modes`_.
10247db96d56Sopenharmony_ci
10257db96d56Sopenharmony_ci   The *traps* and *flags* fields list any signals to be set. Generally, new
10267db96d56Sopenharmony_ci   contexts should only set traps and leave the flags clear.
10277db96d56Sopenharmony_ci
10287db96d56Sopenharmony_ci   The *Emin* and *Emax* fields are integers specifying the outer limits allowable
10297db96d56Sopenharmony_ci   for exponents. *Emin* must be in the range [:const:`MIN_EMIN`, ``0``],
10307db96d56Sopenharmony_ci   *Emax* in the range [``0``, :const:`MAX_EMAX`].
10317db96d56Sopenharmony_ci
10327db96d56Sopenharmony_ci   The *capitals* field is either ``0`` or ``1`` (the default). If set to
10337db96d56Sopenharmony_ci   ``1``, exponents are printed with a capital ``E``; otherwise, a
10347db96d56Sopenharmony_ci   lowercase ``e`` is used: ``Decimal('6.02e+23')``.
10357db96d56Sopenharmony_ci
10367db96d56Sopenharmony_ci   The *clamp* field is either ``0`` (the default) or ``1``.
10377db96d56Sopenharmony_ci   If set to ``1``, the exponent ``e`` of a :class:`Decimal`
10387db96d56Sopenharmony_ci   instance representable in this context is strictly limited to the
10397db96d56Sopenharmony_ci   range ``Emin - prec + 1 <= e <= Emax - prec + 1``.  If *clamp* is
10407db96d56Sopenharmony_ci   ``0`` then a weaker condition holds: the adjusted exponent of
10417db96d56Sopenharmony_ci   the :class:`Decimal` instance is at most :attr:`~Context.Emax`.  When *clamp* is
10427db96d56Sopenharmony_ci   ``1``, a large normal number will, where possible, have its
10437db96d56Sopenharmony_ci   exponent reduced and a corresponding number of zeros added to its
10447db96d56Sopenharmony_ci   coefficient, in order to fit the exponent constraints; this
10457db96d56Sopenharmony_ci   preserves the value of the number but loses information about
10467db96d56Sopenharmony_ci   significant trailing zeros.  For example::
10477db96d56Sopenharmony_ci
10487db96d56Sopenharmony_ci      >>> Context(prec=6, Emax=999, clamp=1).create_decimal('1.23e999')
10497db96d56Sopenharmony_ci      Decimal('1.23000E+999')
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci   A *clamp* value of ``1`` allows compatibility with the
10527db96d56Sopenharmony_ci   fixed-width decimal interchange formats specified in IEEE 754.
10537db96d56Sopenharmony_ci
10547db96d56Sopenharmony_ci   The :class:`Context` class defines several general purpose methods as well as
10557db96d56Sopenharmony_ci   a large number of methods for doing arithmetic directly in a given context.
10567db96d56Sopenharmony_ci   In addition, for each of the :class:`Decimal` methods described above (with
10577db96d56Sopenharmony_ci   the exception of the :meth:`~Decimal.adjusted` and :meth:`~Decimal.as_tuple` methods) there is
10587db96d56Sopenharmony_ci   a corresponding :class:`Context` method.  For example, for a :class:`Context`
10597db96d56Sopenharmony_ci   instance ``C`` and :class:`Decimal` instance ``x``, ``C.exp(x)`` is
10607db96d56Sopenharmony_ci   equivalent to ``x.exp(context=C)``.  Each :class:`Context` method accepts a
10617db96d56Sopenharmony_ci   Python integer (an instance of :class:`int`) anywhere that a
10627db96d56Sopenharmony_ci   Decimal instance is accepted.
10637db96d56Sopenharmony_ci
10647db96d56Sopenharmony_ci
10657db96d56Sopenharmony_ci   .. method:: clear_flags()
10667db96d56Sopenharmony_ci
10677db96d56Sopenharmony_ci      Resets all of the flags to ``0``.
10687db96d56Sopenharmony_ci
10697db96d56Sopenharmony_ci   .. method:: clear_traps()
10707db96d56Sopenharmony_ci
10717db96d56Sopenharmony_ci      Resets all of the traps to ``0``.
10727db96d56Sopenharmony_ci
10737db96d56Sopenharmony_ci      .. versionadded:: 3.3
10747db96d56Sopenharmony_ci
10757db96d56Sopenharmony_ci   .. method:: copy()
10767db96d56Sopenharmony_ci
10777db96d56Sopenharmony_ci      Return a duplicate of the context.
10787db96d56Sopenharmony_ci
10797db96d56Sopenharmony_ci   .. method:: copy_decimal(num)
10807db96d56Sopenharmony_ci
10817db96d56Sopenharmony_ci      Return a copy of the Decimal instance num.
10827db96d56Sopenharmony_ci
10837db96d56Sopenharmony_ci   .. method:: create_decimal(num)
10847db96d56Sopenharmony_ci
10857db96d56Sopenharmony_ci      Creates a new Decimal instance from *num* but using *self* as
10867db96d56Sopenharmony_ci      context. Unlike the :class:`Decimal` constructor, the context precision,
10877db96d56Sopenharmony_ci      rounding method, flags, and traps are applied to the conversion.
10887db96d56Sopenharmony_ci
10897db96d56Sopenharmony_ci      This is useful because constants are often given to a greater precision
10907db96d56Sopenharmony_ci      than is needed by the application.  Another benefit is that rounding
10917db96d56Sopenharmony_ci      immediately eliminates unintended effects from digits beyond the current
10927db96d56Sopenharmony_ci      precision. In the following example, using unrounded inputs means that
10937db96d56Sopenharmony_ci      adding zero to a sum can change the result:
10947db96d56Sopenharmony_ci
10957db96d56Sopenharmony_ci      .. doctest:: newcontext
10967db96d56Sopenharmony_ci
10977db96d56Sopenharmony_ci         >>> getcontext().prec = 3
10987db96d56Sopenharmony_ci         >>> Decimal('3.4445') + Decimal('1.0023')
10997db96d56Sopenharmony_ci         Decimal('4.45')
11007db96d56Sopenharmony_ci         >>> Decimal('3.4445') + Decimal(0) + Decimal('1.0023')
11017db96d56Sopenharmony_ci         Decimal('4.44')
11027db96d56Sopenharmony_ci
11037db96d56Sopenharmony_ci      This method implements the to-number operation of the IBM specification.
11047db96d56Sopenharmony_ci      If the argument is a string, no leading or trailing whitespace or
11057db96d56Sopenharmony_ci      underscores are permitted.
11067db96d56Sopenharmony_ci
11077db96d56Sopenharmony_ci   .. method:: create_decimal_from_float(f)
11087db96d56Sopenharmony_ci
11097db96d56Sopenharmony_ci      Creates a new Decimal instance from a float *f* but rounding using *self*
11107db96d56Sopenharmony_ci      as the context.  Unlike the :meth:`Decimal.from_float` class method,
11117db96d56Sopenharmony_ci      the context precision, rounding method, flags, and traps are applied to
11127db96d56Sopenharmony_ci      the conversion.
11137db96d56Sopenharmony_ci
11147db96d56Sopenharmony_ci      .. doctest::
11157db96d56Sopenharmony_ci
11167db96d56Sopenharmony_ci         >>> context = Context(prec=5, rounding=ROUND_DOWN)
11177db96d56Sopenharmony_ci         >>> context.create_decimal_from_float(math.pi)
11187db96d56Sopenharmony_ci         Decimal('3.1415')
11197db96d56Sopenharmony_ci         >>> context = Context(prec=5, traps=[Inexact])
11207db96d56Sopenharmony_ci         >>> context.create_decimal_from_float(math.pi)
11217db96d56Sopenharmony_ci         Traceback (most recent call last):
11227db96d56Sopenharmony_ci             ...
11237db96d56Sopenharmony_ci         decimal.Inexact: None
11247db96d56Sopenharmony_ci
11257db96d56Sopenharmony_ci      .. versionadded:: 3.1
11267db96d56Sopenharmony_ci
11277db96d56Sopenharmony_ci   .. method:: Etiny()
11287db96d56Sopenharmony_ci
11297db96d56Sopenharmony_ci      Returns a value equal to ``Emin - prec + 1`` which is the minimum exponent
11307db96d56Sopenharmony_ci      value for subnormal results.  When underflow occurs, the exponent is set
11317db96d56Sopenharmony_ci      to :const:`Etiny`.
11327db96d56Sopenharmony_ci
11337db96d56Sopenharmony_ci   .. method:: Etop()
11347db96d56Sopenharmony_ci
11357db96d56Sopenharmony_ci      Returns a value equal to ``Emax - prec + 1``.
11367db96d56Sopenharmony_ci
11377db96d56Sopenharmony_ci   The usual approach to working with decimals is to create :class:`Decimal`
11387db96d56Sopenharmony_ci   instances and then apply arithmetic operations which take place within the
11397db96d56Sopenharmony_ci   current context for the active thread.  An alternative approach is to use
11407db96d56Sopenharmony_ci   context methods for calculating within a specific context.  The methods are
11417db96d56Sopenharmony_ci   similar to those for the :class:`Decimal` class and are only briefly
11427db96d56Sopenharmony_ci   recounted here.
11437db96d56Sopenharmony_ci
11447db96d56Sopenharmony_ci
11457db96d56Sopenharmony_ci   .. method:: abs(x)
11467db96d56Sopenharmony_ci
11477db96d56Sopenharmony_ci      Returns the absolute value of *x*.
11487db96d56Sopenharmony_ci
11497db96d56Sopenharmony_ci
11507db96d56Sopenharmony_ci   .. method:: add(x, y)
11517db96d56Sopenharmony_ci
11527db96d56Sopenharmony_ci      Return the sum of *x* and *y*.
11537db96d56Sopenharmony_ci
11547db96d56Sopenharmony_ci
11557db96d56Sopenharmony_ci   .. method:: canonical(x)
11567db96d56Sopenharmony_ci
11577db96d56Sopenharmony_ci      Returns the same Decimal object *x*.
11587db96d56Sopenharmony_ci
11597db96d56Sopenharmony_ci
11607db96d56Sopenharmony_ci   .. method:: compare(x, y)
11617db96d56Sopenharmony_ci
11627db96d56Sopenharmony_ci      Compares *x* and *y* numerically.
11637db96d56Sopenharmony_ci
11647db96d56Sopenharmony_ci
11657db96d56Sopenharmony_ci   .. method:: compare_signal(x, y)
11667db96d56Sopenharmony_ci
11677db96d56Sopenharmony_ci      Compares the values of the two operands numerically.
11687db96d56Sopenharmony_ci
11697db96d56Sopenharmony_ci
11707db96d56Sopenharmony_ci   .. method:: compare_total(x, y)
11717db96d56Sopenharmony_ci
11727db96d56Sopenharmony_ci      Compares two operands using their abstract representation.
11737db96d56Sopenharmony_ci
11747db96d56Sopenharmony_ci
11757db96d56Sopenharmony_ci   .. method:: compare_total_mag(x, y)
11767db96d56Sopenharmony_ci
11777db96d56Sopenharmony_ci      Compares two operands using their abstract representation, ignoring sign.
11787db96d56Sopenharmony_ci
11797db96d56Sopenharmony_ci
11807db96d56Sopenharmony_ci   .. method:: copy_abs(x)
11817db96d56Sopenharmony_ci
11827db96d56Sopenharmony_ci      Returns a copy of *x* with the sign set to 0.
11837db96d56Sopenharmony_ci
11847db96d56Sopenharmony_ci
11857db96d56Sopenharmony_ci   .. method:: copy_negate(x)
11867db96d56Sopenharmony_ci
11877db96d56Sopenharmony_ci      Returns a copy of *x* with the sign inverted.
11887db96d56Sopenharmony_ci
11897db96d56Sopenharmony_ci
11907db96d56Sopenharmony_ci   .. method:: copy_sign(x, y)
11917db96d56Sopenharmony_ci
11927db96d56Sopenharmony_ci      Copies the sign from *y* to *x*.
11937db96d56Sopenharmony_ci
11947db96d56Sopenharmony_ci
11957db96d56Sopenharmony_ci   .. method:: divide(x, y)
11967db96d56Sopenharmony_ci
11977db96d56Sopenharmony_ci      Return *x* divided by *y*.
11987db96d56Sopenharmony_ci
11997db96d56Sopenharmony_ci
12007db96d56Sopenharmony_ci   .. method:: divide_int(x, y)
12017db96d56Sopenharmony_ci
12027db96d56Sopenharmony_ci      Return *x* divided by *y*, truncated to an integer.
12037db96d56Sopenharmony_ci
12047db96d56Sopenharmony_ci
12057db96d56Sopenharmony_ci   .. method:: divmod(x, y)
12067db96d56Sopenharmony_ci
12077db96d56Sopenharmony_ci      Divides two numbers and returns the integer part of the result.
12087db96d56Sopenharmony_ci
12097db96d56Sopenharmony_ci
12107db96d56Sopenharmony_ci   .. method:: exp(x)
12117db96d56Sopenharmony_ci
12127db96d56Sopenharmony_ci      Returns ``e ** x``.
12137db96d56Sopenharmony_ci
12147db96d56Sopenharmony_ci
12157db96d56Sopenharmony_ci   .. method:: fma(x, y, z)
12167db96d56Sopenharmony_ci
12177db96d56Sopenharmony_ci      Returns *x* multiplied by *y*, plus *z*.
12187db96d56Sopenharmony_ci
12197db96d56Sopenharmony_ci
12207db96d56Sopenharmony_ci   .. method:: is_canonical(x)
12217db96d56Sopenharmony_ci
12227db96d56Sopenharmony_ci      Returns ``True`` if *x* is canonical; otherwise returns ``False``.
12237db96d56Sopenharmony_ci
12247db96d56Sopenharmony_ci
12257db96d56Sopenharmony_ci   .. method:: is_finite(x)
12267db96d56Sopenharmony_ci
12277db96d56Sopenharmony_ci      Returns ``True`` if *x* is finite; otherwise returns ``False``.
12287db96d56Sopenharmony_ci
12297db96d56Sopenharmony_ci
12307db96d56Sopenharmony_ci   .. method:: is_infinite(x)
12317db96d56Sopenharmony_ci
12327db96d56Sopenharmony_ci      Returns ``True`` if *x* is infinite; otherwise returns ``False``.
12337db96d56Sopenharmony_ci
12347db96d56Sopenharmony_ci
12357db96d56Sopenharmony_ci   .. method:: is_nan(x)
12367db96d56Sopenharmony_ci
12377db96d56Sopenharmony_ci      Returns ``True`` if *x* is a qNaN or sNaN; otherwise returns ``False``.
12387db96d56Sopenharmony_ci
12397db96d56Sopenharmony_ci
12407db96d56Sopenharmony_ci   .. method:: is_normal(x)
12417db96d56Sopenharmony_ci
12427db96d56Sopenharmony_ci      Returns ``True`` if *x* is a normal number; otherwise returns ``False``.
12437db96d56Sopenharmony_ci
12447db96d56Sopenharmony_ci
12457db96d56Sopenharmony_ci   .. method:: is_qnan(x)
12467db96d56Sopenharmony_ci
12477db96d56Sopenharmony_ci      Returns ``True`` if *x* is a quiet NaN; otherwise returns ``False``.
12487db96d56Sopenharmony_ci
12497db96d56Sopenharmony_ci
12507db96d56Sopenharmony_ci   .. method:: is_signed(x)
12517db96d56Sopenharmony_ci
12527db96d56Sopenharmony_ci      Returns ``True`` if *x* is negative; otherwise returns ``False``.
12537db96d56Sopenharmony_ci
12547db96d56Sopenharmony_ci
12557db96d56Sopenharmony_ci   .. method:: is_snan(x)
12567db96d56Sopenharmony_ci
12577db96d56Sopenharmony_ci      Returns ``True`` if *x* is a signaling NaN; otherwise returns ``False``.
12587db96d56Sopenharmony_ci
12597db96d56Sopenharmony_ci
12607db96d56Sopenharmony_ci   .. method:: is_subnormal(x)
12617db96d56Sopenharmony_ci
12627db96d56Sopenharmony_ci      Returns ``True`` if *x* is subnormal; otherwise returns ``False``.
12637db96d56Sopenharmony_ci
12647db96d56Sopenharmony_ci
12657db96d56Sopenharmony_ci   .. method:: is_zero(x)
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_ci      Returns ``True`` if *x* is a zero; otherwise returns ``False``.
12687db96d56Sopenharmony_ci
12697db96d56Sopenharmony_ci
12707db96d56Sopenharmony_ci   .. method:: ln(x)
12717db96d56Sopenharmony_ci
12727db96d56Sopenharmony_ci      Returns the natural (base e) logarithm of *x*.
12737db96d56Sopenharmony_ci
12747db96d56Sopenharmony_ci
12757db96d56Sopenharmony_ci   .. method:: log10(x)
12767db96d56Sopenharmony_ci
12777db96d56Sopenharmony_ci      Returns the base 10 logarithm of *x*.
12787db96d56Sopenharmony_ci
12797db96d56Sopenharmony_ci
12807db96d56Sopenharmony_ci   .. method:: logb(x)
12817db96d56Sopenharmony_ci
12827db96d56Sopenharmony_ci       Returns the exponent of the magnitude of the operand's MSD.
12837db96d56Sopenharmony_ci
12847db96d56Sopenharmony_ci
12857db96d56Sopenharmony_ci   .. method:: logical_and(x, y)
12867db96d56Sopenharmony_ci
12877db96d56Sopenharmony_ci      Applies the logical operation *and* between each operand's digits.
12887db96d56Sopenharmony_ci
12897db96d56Sopenharmony_ci
12907db96d56Sopenharmony_ci   .. method:: logical_invert(x)
12917db96d56Sopenharmony_ci
12927db96d56Sopenharmony_ci      Invert all the digits in *x*.
12937db96d56Sopenharmony_ci
12947db96d56Sopenharmony_ci
12957db96d56Sopenharmony_ci   .. method:: logical_or(x, y)
12967db96d56Sopenharmony_ci
12977db96d56Sopenharmony_ci      Applies the logical operation *or* between each operand's digits.
12987db96d56Sopenharmony_ci
12997db96d56Sopenharmony_ci
13007db96d56Sopenharmony_ci   .. method:: logical_xor(x, y)
13017db96d56Sopenharmony_ci
13027db96d56Sopenharmony_ci      Applies the logical operation *xor* between each operand's digits.
13037db96d56Sopenharmony_ci
13047db96d56Sopenharmony_ci
13057db96d56Sopenharmony_ci   .. method:: max(x, y)
13067db96d56Sopenharmony_ci
13077db96d56Sopenharmony_ci      Compares two values numerically and returns the maximum.
13087db96d56Sopenharmony_ci
13097db96d56Sopenharmony_ci
13107db96d56Sopenharmony_ci   .. method:: max_mag(x, y)
13117db96d56Sopenharmony_ci
13127db96d56Sopenharmony_ci      Compares the values numerically with their sign ignored.
13137db96d56Sopenharmony_ci
13147db96d56Sopenharmony_ci
13157db96d56Sopenharmony_ci   .. method:: min(x, y)
13167db96d56Sopenharmony_ci
13177db96d56Sopenharmony_ci      Compares two values numerically and returns the minimum.
13187db96d56Sopenharmony_ci
13197db96d56Sopenharmony_ci
13207db96d56Sopenharmony_ci   .. method:: min_mag(x, y)
13217db96d56Sopenharmony_ci
13227db96d56Sopenharmony_ci      Compares the values numerically with their sign ignored.
13237db96d56Sopenharmony_ci
13247db96d56Sopenharmony_ci
13257db96d56Sopenharmony_ci   .. method:: minus(x)
13267db96d56Sopenharmony_ci
13277db96d56Sopenharmony_ci      Minus corresponds to the unary prefix minus operator in Python.
13287db96d56Sopenharmony_ci
13297db96d56Sopenharmony_ci
13307db96d56Sopenharmony_ci   .. method:: multiply(x, y)
13317db96d56Sopenharmony_ci
13327db96d56Sopenharmony_ci      Return the product of *x* and *y*.
13337db96d56Sopenharmony_ci
13347db96d56Sopenharmony_ci
13357db96d56Sopenharmony_ci   .. method:: next_minus(x)
13367db96d56Sopenharmony_ci
13377db96d56Sopenharmony_ci      Returns the largest representable number smaller than *x*.
13387db96d56Sopenharmony_ci
13397db96d56Sopenharmony_ci
13407db96d56Sopenharmony_ci   .. method:: next_plus(x)
13417db96d56Sopenharmony_ci
13427db96d56Sopenharmony_ci      Returns the smallest representable number larger than *x*.
13437db96d56Sopenharmony_ci
13447db96d56Sopenharmony_ci
13457db96d56Sopenharmony_ci   .. method:: next_toward(x, y)
13467db96d56Sopenharmony_ci
13477db96d56Sopenharmony_ci      Returns the number closest to *x*, in direction towards *y*.
13487db96d56Sopenharmony_ci
13497db96d56Sopenharmony_ci
13507db96d56Sopenharmony_ci   .. method:: normalize(x)
13517db96d56Sopenharmony_ci
13527db96d56Sopenharmony_ci      Reduces *x* to its simplest form.
13537db96d56Sopenharmony_ci
13547db96d56Sopenharmony_ci
13557db96d56Sopenharmony_ci   .. method:: number_class(x)
13567db96d56Sopenharmony_ci
13577db96d56Sopenharmony_ci      Returns an indication of the class of *x*.
13587db96d56Sopenharmony_ci
13597db96d56Sopenharmony_ci
13607db96d56Sopenharmony_ci   .. method:: plus(x)
13617db96d56Sopenharmony_ci
13627db96d56Sopenharmony_ci      Plus corresponds to the unary prefix plus operator in Python.  This
13637db96d56Sopenharmony_ci      operation applies the context precision and rounding, so it is *not* an
13647db96d56Sopenharmony_ci      identity operation.
13657db96d56Sopenharmony_ci
13667db96d56Sopenharmony_ci
13677db96d56Sopenharmony_ci   .. method:: power(x, y, modulo=None)
13687db96d56Sopenharmony_ci
13697db96d56Sopenharmony_ci      Return ``x`` to the power of ``y``, reduced modulo ``modulo`` if given.
13707db96d56Sopenharmony_ci
13717db96d56Sopenharmony_ci      With two arguments, compute ``x**y``.  If ``x`` is negative then ``y``
13727db96d56Sopenharmony_ci      must be integral.  The result will be inexact unless ``y`` is integral and
13737db96d56Sopenharmony_ci      the result is finite and can be expressed exactly in 'precision' digits.
13747db96d56Sopenharmony_ci      The rounding mode of the context is used. Results are always correctly rounded
13757db96d56Sopenharmony_ci      in the Python version.
13767db96d56Sopenharmony_ci
13777db96d56Sopenharmony_ci      ``Decimal(0) ** Decimal(0)`` results in ``InvalidOperation``, and if ``InvalidOperation``
13787db96d56Sopenharmony_ci      is not trapped, then results in ``Decimal('NaN')``.
13797db96d56Sopenharmony_ci
13807db96d56Sopenharmony_ci      .. versionchanged:: 3.3
13817db96d56Sopenharmony_ci         The C module computes :meth:`power` in terms of the correctly rounded
13827db96d56Sopenharmony_ci         :meth:`exp` and :meth:`ln` functions. The result is well-defined but
13837db96d56Sopenharmony_ci         only "almost always correctly rounded".
13847db96d56Sopenharmony_ci
13857db96d56Sopenharmony_ci      With three arguments, compute ``(x**y) % modulo``.  For the three argument
13867db96d56Sopenharmony_ci      form, the following restrictions on the arguments hold:
13877db96d56Sopenharmony_ci
13887db96d56Sopenharmony_ci         - all three arguments must be integral
13897db96d56Sopenharmony_ci         - ``y`` must be nonnegative
13907db96d56Sopenharmony_ci         - at least one of ``x`` or ``y`` must be nonzero
13917db96d56Sopenharmony_ci         - ``modulo`` must be nonzero and have at most 'precision' digits
13927db96d56Sopenharmony_ci
13937db96d56Sopenharmony_ci      The value resulting from ``Context.power(x, y, modulo)`` is
13947db96d56Sopenharmony_ci      equal to the value that would be obtained by computing ``(x**y)
13957db96d56Sopenharmony_ci      % modulo`` with unbounded precision, but is computed more
13967db96d56Sopenharmony_ci      efficiently.  The exponent of the result is zero, regardless of
13977db96d56Sopenharmony_ci      the exponents of ``x``, ``y`` and ``modulo``.  The result is
13987db96d56Sopenharmony_ci      always exact.
13997db96d56Sopenharmony_ci
14007db96d56Sopenharmony_ci
14017db96d56Sopenharmony_ci   .. method:: quantize(x, y)
14027db96d56Sopenharmony_ci
14037db96d56Sopenharmony_ci      Returns a value equal to *x* (rounded), having the exponent of *y*.
14047db96d56Sopenharmony_ci
14057db96d56Sopenharmony_ci
14067db96d56Sopenharmony_ci   .. method:: radix()
14077db96d56Sopenharmony_ci
14087db96d56Sopenharmony_ci      Just returns 10, as this is Decimal, :)
14097db96d56Sopenharmony_ci
14107db96d56Sopenharmony_ci
14117db96d56Sopenharmony_ci   .. method:: remainder(x, y)
14127db96d56Sopenharmony_ci
14137db96d56Sopenharmony_ci      Returns the remainder from integer division.
14147db96d56Sopenharmony_ci
14157db96d56Sopenharmony_ci      The sign of the result, if non-zero, is the same as that of the original
14167db96d56Sopenharmony_ci      dividend.
14177db96d56Sopenharmony_ci
14187db96d56Sopenharmony_ci
14197db96d56Sopenharmony_ci   .. method:: remainder_near(x, y)
14207db96d56Sopenharmony_ci
14217db96d56Sopenharmony_ci      Returns ``x - y * n``, where *n* is the integer nearest the exact value
14227db96d56Sopenharmony_ci      of ``x / y`` (if the result is 0 then its sign will be the sign of *x*).
14237db96d56Sopenharmony_ci
14247db96d56Sopenharmony_ci
14257db96d56Sopenharmony_ci   .. method:: rotate(x, y)
14267db96d56Sopenharmony_ci
14277db96d56Sopenharmony_ci      Returns a rotated copy of *x*, *y* times.
14287db96d56Sopenharmony_ci
14297db96d56Sopenharmony_ci
14307db96d56Sopenharmony_ci   .. method:: same_quantum(x, y)
14317db96d56Sopenharmony_ci
14327db96d56Sopenharmony_ci      Returns ``True`` if the two operands have the same exponent.
14337db96d56Sopenharmony_ci
14347db96d56Sopenharmony_ci
14357db96d56Sopenharmony_ci   .. method:: scaleb (x, y)
14367db96d56Sopenharmony_ci
14377db96d56Sopenharmony_ci      Returns the first operand after adding the second value its exp.
14387db96d56Sopenharmony_ci
14397db96d56Sopenharmony_ci
14407db96d56Sopenharmony_ci   .. method:: shift(x, y)
14417db96d56Sopenharmony_ci
14427db96d56Sopenharmony_ci      Returns a shifted copy of *x*, *y* times.
14437db96d56Sopenharmony_ci
14447db96d56Sopenharmony_ci
14457db96d56Sopenharmony_ci   .. method:: sqrt(x)
14467db96d56Sopenharmony_ci
14477db96d56Sopenharmony_ci      Square root of a non-negative number to context precision.
14487db96d56Sopenharmony_ci
14497db96d56Sopenharmony_ci
14507db96d56Sopenharmony_ci   .. method:: subtract(x, y)
14517db96d56Sopenharmony_ci
14527db96d56Sopenharmony_ci      Return the difference between *x* and *y*.
14537db96d56Sopenharmony_ci
14547db96d56Sopenharmony_ci
14557db96d56Sopenharmony_ci   .. method:: to_eng_string(x)
14567db96d56Sopenharmony_ci
14577db96d56Sopenharmony_ci      Convert to a string, using engineering notation if an exponent is needed.
14587db96d56Sopenharmony_ci
14597db96d56Sopenharmony_ci      Engineering notation has an exponent which is a multiple of 3.  This
14607db96d56Sopenharmony_ci      can leave up to 3 digits to the left of the decimal place and may
14617db96d56Sopenharmony_ci      require the addition of either one or two trailing zeros.
14627db96d56Sopenharmony_ci
14637db96d56Sopenharmony_ci
14647db96d56Sopenharmony_ci   .. method:: to_integral_exact(x)
14657db96d56Sopenharmony_ci
14667db96d56Sopenharmony_ci      Rounds to an integer.
14677db96d56Sopenharmony_ci
14687db96d56Sopenharmony_ci
14697db96d56Sopenharmony_ci   .. method:: to_sci_string(x)
14707db96d56Sopenharmony_ci
14717db96d56Sopenharmony_ci      Converts a number to a string using scientific notation.
14727db96d56Sopenharmony_ci
14737db96d56Sopenharmony_ci.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14747db96d56Sopenharmony_ci
14757db96d56Sopenharmony_ci.. _decimal-rounding-modes:
14767db96d56Sopenharmony_ci
14777db96d56Sopenharmony_ciConstants
14787db96d56Sopenharmony_ci---------
14797db96d56Sopenharmony_ci
14807db96d56Sopenharmony_ciThe constants in this section are only relevant for the C module. They
14817db96d56Sopenharmony_ciare also included in the pure Python version for compatibility.
14827db96d56Sopenharmony_ci
14837db96d56Sopenharmony_ci+---------------------+---------------------+-------------------------------+
14847db96d56Sopenharmony_ci|                     |       32-bit        |            64-bit             |
14857db96d56Sopenharmony_ci+=====================+=====================+===============================+
14867db96d56Sopenharmony_ci| .. data:: MAX_PREC  |    ``425000000``    |    ``999999999999999999``     |
14877db96d56Sopenharmony_ci+---------------------+---------------------+-------------------------------+
14887db96d56Sopenharmony_ci| .. data:: MAX_EMAX  |    ``425000000``    |    ``999999999999999999``     |
14897db96d56Sopenharmony_ci+---------------------+---------------------+-------------------------------+
14907db96d56Sopenharmony_ci| .. data:: MIN_EMIN  |    ``-425000000``   |    ``-999999999999999999``    |
14917db96d56Sopenharmony_ci+---------------------+---------------------+-------------------------------+
14927db96d56Sopenharmony_ci| .. data:: MIN_ETINY |    ``-849999999``   |    ``-1999999999999999997``   |
14937db96d56Sopenharmony_ci+---------------------+---------------------+-------------------------------+
14947db96d56Sopenharmony_ci
14957db96d56Sopenharmony_ci
14967db96d56Sopenharmony_ci.. data:: HAVE_THREADS
14977db96d56Sopenharmony_ci
14987db96d56Sopenharmony_ci   The value is ``True``.  Deprecated, because Python now always has threads.
14997db96d56Sopenharmony_ci
15007db96d56Sopenharmony_ci.. deprecated:: 3.9
15017db96d56Sopenharmony_ci
15027db96d56Sopenharmony_ci.. data:: HAVE_CONTEXTVAR
15037db96d56Sopenharmony_ci
15047db96d56Sopenharmony_ci   The default value is ``True``. If Python is :option:`configured using
15057db96d56Sopenharmony_ci   the --without-decimal-contextvar option <--without-decimal-contextvar>`,
15067db96d56Sopenharmony_ci   the C version uses a thread-local rather than a coroutine-local context and the value
15077db96d56Sopenharmony_ci   is ``False``.  This is slightly faster in some nested context scenarios.
15087db96d56Sopenharmony_ci
15097db96d56Sopenharmony_ci.. versionadded:: 3.9 backported to 3.7 and 3.8.
15107db96d56Sopenharmony_ci
15117db96d56Sopenharmony_ci
15127db96d56Sopenharmony_ciRounding modes
15137db96d56Sopenharmony_ci--------------
15147db96d56Sopenharmony_ci
15157db96d56Sopenharmony_ci.. data:: ROUND_CEILING
15167db96d56Sopenharmony_ci
15177db96d56Sopenharmony_ci   Round towards ``Infinity``.
15187db96d56Sopenharmony_ci
15197db96d56Sopenharmony_ci.. data:: ROUND_DOWN
15207db96d56Sopenharmony_ci
15217db96d56Sopenharmony_ci   Round towards zero.
15227db96d56Sopenharmony_ci
15237db96d56Sopenharmony_ci.. data:: ROUND_FLOOR
15247db96d56Sopenharmony_ci
15257db96d56Sopenharmony_ci   Round towards ``-Infinity``.
15267db96d56Sopenharmony_ci
15277db96d56Sopenharmony_ci.. data:: ROUND_HALF_DOWN
15287db96d56Sopenharmony_ci
15297db96d56Sopenharmony_ci   Round to nearest with ties going towards zero.
15307db96d56Sopenharmony_ci
15317db96d56Sopenharmony_ci.. data:: ROUND_HALF_EVEN
15327db96d56Sopenharmony_ci
15337db96d56Sopenharmony_ci   Round to nearest with ties going to nearest even integer.
15347db96d56Sopenharmony_ci
15357db96d56Sopenharmony_ci.. data:: ROUND_HALF_UP
15367db96d56Sopenharmony_ci
15377db96d56Sopenharmony_ci   Round to nearest with ties going away from zero.
15387db96d56Sopenharmony_ci
15397db96d56Sopenharmony_ci.. data:: ROUND_UP
15407db96d56Sopenharmony_ci
15417db96d56Sopenharmony_ci   Round away from zero.
15427db96d56Sopenharmony_ci
15437db96d56Sopenharmony_ci.. data:: ROUND_05UP
15447db96d56Sopenharmony_ci
15457db96d56Sopenharmony_ci   Round away from zero if last digit after rounding towards zero would have
15467db96d56Sopenharmony_ci   been 0 or 5; otherwise round towards zero.
15477db96d56Sopenharmony_ci
15487db96d56Sopenharmony_ci
15497db96d56Sopenharmony_ci.. _decimal-signals:
15507db96d56Sopenharmony_ci
15517db96d56Sopenharmony_ciSignals
15527db96d56Sopenharmony_ci-------
15537db96d56Sopenharmony_ci
15547db96d56Sopenharmony_ciSignals represent conditions that arise during computation. Each corresponds to
15557db96d56Sopenharmony_cione context flag and one context trap enabler.
15567db96d56Sopenharmony_ci
15577db96d56Sopenharmony_ciThe context flag is set whenever the condition is encountered. After the
15587db96d56Sopenharmony_cicomputation, flags may be checked for informational purposes (for instance, to
15597db96d56Sopenharmony_cidetermine whether a computation was exact). After checking the flags, be sure to
15607db96d56Sopenharmony_ciclear all flags before starting the next computation.
15617db96d56Sopenharmony_ci
15627db96d56Sopenharmony_ciIf the context's trap enabler is set for the signal, then the condition causes a
15637db96d56Sopenharmony_ciPython exception to be raised.  For example, if the :class:`DivisionByZero` trap
15647db96d56Sopenharmony_ciis set, then a :exc:`DivisionByZero` exception is raised upon encountering the
15657db96d56Sopenharmony_cicondition.
15667db96d56Sopenharmony_ci
15677db96d56Sopenharmony_ci
15687db96d56Sopenharmony_ci.. class:: Clamped
15697db96d56Sopenharmony_ci
15707db96d56Sopenharmony_ci   Altered an exponent to fit representation constraints.
15717db96d56Sopenharmony_ci
15727db96d56Sopenharmony_ci   Typically, clamping occurs when an exponent falls outside the context's
15737db96d56Sopenharmony_ci   :attr:`~Context.Emin` and :attr:`~Context.Emax` limits.  If possible, the exponent is reduced to
15747db96d56Sopenharmony_ci   fit by adding zeros to the coefficient.
15757db96d56Sopenharmony_ci
15767db96d56Sopenharmony_ci
15777db96d56Sopenharmony_ci.. class:: DecimalException
15787db96d56Sopenharmony_ci
15797db96d56Sopenharmony_ci   Base class for other signals and a subclass of :exc:`ArithmeticError`.
15807db96d56Sopenharmony_ci
15817db96d56Sopenharmony_ci
15827db96d56Sopenharmony_ci.. class:: DivisionByZero
15837db96d56Sopenharmony_ci
15847db96d56Sopenharmony_ci   Signals the division of a non-infinite number by zero.
15857db96d56Sopenharmony_ci
15867db96d56Sopenharmony_ci   Can occur with division, modulo division, or when raising a number to a negative
15877db96d56Sopenharmony_ci   power.  If this signal is not trapped, returns ``Infinity`` or
15887db96d56Sopenharmony_ci   ``-Infinity`` with the sign determined by the inputs to the calculation.
15897db96d56Sopenharmony_ci
15907db96d56Sopenharmony_ci
15917db96d56Sopenharmony_ci.. class:: Inexact
15927db96d56Sopenharmony_ci
15937db96d56Sopenharmony_ci   Indicates that rounding occurred and the result is not exact.
15947db96d56Sopenharmony_ci
15957db96d56Sopenharmony_ci   Signals when non-zero digits were discarded during rounding. The rounded result
15967db96d56Sopenharmony_ci   is returned.  The signal flag or trap is used to detect when results are
15977db96d56Sopenharmony_ci   inexact.
15987db96d56Sopenharmony_ci
15997db96d56Sopenharmony_ci
16007db96d56Sopenharmony_ci.. class:: InvalidOperation
16017db96d56Sopenharmony_ci
16027db96d56Sopenharmony_ci   An invalid operation was performed.
16037db96d56Sopenharmony_ci
16047db96d56Sopenharmony_ci   Indicates that an operation was requested that does not make sense. If not
16057db96d56Sopenharmony_ci   trapped, returns ``NaN``.  Possible causes include::
16067db96d56Sopenharmony_ci
16077db96d56Sopenharmony_ci      Infinity - Infinity
16087db96d56Sopenharmony_ci      0 * Infinity
16097db96d56Sopenharmony_ci      Infinity / Infinity
16107db96d56Sopenharmony_ci      x % 0
16117db96d56Sopenharmony_ci      Infinity % x
16127db96d56Sopenharmony_ci      sqrt(-x) and x > 0
16137db96d56Sopenharmony_ci      0 ** 0
16147db96d56Sopenharmony_ci      x ** (non-integer)
16157db96d56Sopenharmony_ci      x ** Infinity
16167db96d56Sopenharmony_ci
16177db96d56Sopenharmony_ci
16187db96d56Sopenharmony_ci.. class:: Overflow
16197db96d56Sopenharmony_ci
16207db96d56Sopenharmony_ci   Numerical overflow.
16217db96d56Sopenharmony_ci
16227db96d56Sopenharmony_ci   Indicates the exponent is larger than :attr:`Context.Emax` after rounding has
16237db96d56Sopenharmony_ci   occurred.  If not trapped, the result depends on the rounding mode, either
16247db96d56Sopenharmony_ci   pulling inward to the largest representable finite number or rounding outward
16257db96d56Sopenharmony_ci   to ``Infinity``.  In either case, :class:`Inexact` and :class:`Rounded`
16267db96d56Sopenharmony_ci   are also signaled.
16277db96d56Sopenharmony_ci
16287db96d56Sopenharmony_ci
16297db96d56Sopenharmony_ci.. class:: Rounded
16307db96d56Sopenharmony_ci
16317db96d56Sopenharmony_ci   Rounding occurred though possibly no information was lost.
16327db96d56Sopenharmony_ci
16337db96d56Sopenharmony_ci   Signaled whenever rounding discards digits; even if those digits are zero
16347db96d56Sopenharmony_ci   (such as rounding ``5.00`` to ``5.0``).  If not trapped, returns
16357db96d56Sopenharmony_ci   the result unchanged.  This signal is used to detect loss of significant
16367db96d56Sopenharmony_ci   digits.
16377db96d56Sopenharmony_ci
16387db96d56Sopenharmony_ci
16397db96d56Sopenharmony_ci.. class:: Subnormal
16407db96d56Sopenharmony_ci
16417db96d56Sopenharmony_ci   Exponent was lower than :attr:`~Context.Emin` prior to rounding.
16427db96d56Sopenharmony_ci
16437db96d56Sopenharmony_ci   Occurs when an operation result is subnormal (the exponent is too small). If
16447db96d56Sopenharmony_ci   not trapped, returns the result unchanged.
16457db96d56Sopenharmony_ci
16467db96d56Sopenharmony_ci
16477db96d56Sopenharmony_ci.. class:: Underflow
16487db96d56Sopenharmony_ci
16497db96d56Sopenharmony_ci   Numerical underflow with result rounded to zero.
16507db96d56Sopenharmony_ci
16517db96d56Sopenharmony_ci   Occurs when a subnormal result is pushed to zero by rounding. :class:`Inexact`
16527db96d56Sopenharmony_ci   and :class:`Subnormal` are also signaled.
16537db96d56Sopenharmony_ci
16547db96d56Sopenharmony_ci
16557db96d56Sopenharmony_ci.. class:: FloatOperation
16567db96d56Sopenharmony_ci
16577db96d56Sopenharmony_ci    Enable stricter semantics for mixing floats and Decimals.
16587db96d56Sopenharmony_ci
16597db96d56Sopenharmony_ci    If the signal is not trapped (default), mixing floats and Decimals is
16607db96d56Sopenharmony_ci    permitted in the :class:`~decimal.Decimal` constructor,
16617db96d56Sopenharmony_ci    :meth:`~decimal.Context.create_decimal` and all comparison operators.
16627db96d56Sopenharmony_ci    Both conversion and comparisons are exact. Any occurrence of a mixed
16637db96d56Sopenharmony_ci    operation is silently recorded by setting :exc:`FloatOperation` in the
16647db96d56Sopenharmony_ci    context flags. Explicit conversions with :meth:`~decimal.Decimal.from_float`
16657db96d56Sopenharmony_ci    or :meth:`~decimal.Context.create_decimal_from_float` do not set the flag.
16667db96d56Sopenharmony_ci
16677db96d56Sopenharmony_ci    Otherwise (the signal is trapped), only equality comparisons and explicit
16687db96d56Sopenharmony_ci    conversions are silent. All other mixed operations raise :exc:`FloatOperation`.
16697db96d56Sopenharmony_ci
16707db96d56Sopenharmony_ci
16717db96d56Sopenharmony_ciThe following table summarizes the hierarchy of signals::
16727db96d56Sopenharmony_ci
16737db96d56Sopenharmony_ci   exceptions.ArithmeticError(exceptions.Exception)
16747db96d56Sopenharmony_ci       DecimalException
16757db96d56Sopenharmony_ci           Clamped
16767db96d56Sopenharmony_ci           DivisionByZero(DecimalException, exceptions.ZeroDivisionError)
16777db96d56Sopenharmony_ci           Inexact
16787db96d56Sopenharmony_ci               Overflow(Inexact, Rounded)
16797db96d56Sopenharmony_ci               Underflow(Inexact, Rounded, Subnormal)
16807db96d56Sopenharmony_ci           InvalidOperation
16817db96d56Sopenharmony_ci           Rounded
16827db96d56Sopenharmony_ci           Subnormal
16837db96d56Sopenharmony_ci           FloatOperation(DecimalException, exceptions.TypeError)
16847db96d56Sopenharmony_ci
16857db96d56Sopenharmony_ci.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16867db96d56Sopenharmony_ci
16877db96d56Sopenharmony_ci
16887db96d56Sopenharmony_ci
16897db96d56Sopenharmony_ci.. _decimal-notes:
16907db96d56Sopenharmony_ci
16917db96d56Sopenharmony_ciFloating Point Notes
16927db96d56Sopenharmony_ci--------------------
16937db96d56Sopenharmony_ci
16947db96d56Sopenharmony_ci
16957db96d56Sopenharmony_ciMitigating round-off error with increased precision
16967db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
16977db96d56Sopenharmony_ci
16987db96d56Sopenharmony_ciThe use of decimal floating point eliminates decimal representation error
16997db96d56Sopenharmony_ci(making it possible to represent ``0.1`` exactly); however, some operations
17007db96d56Sopenharmony_cican still incur round-off error when non-zero digits exceed the fixed precision.
17017db96d56Sopenharmony_ci
17027db96d56Sopenharmony_ciThe effects of round-off error can be amplified by the addition or subtraction
17037db96d56Sopenharmony_ciof nearly offsetting quantities resulting in loss of significance.  Knuth
17047db96d56Sopenharmony_ciprovides two instructive examples where rounded floating point arithmetic with
17057db96d56Sopenharmony_ciinsufficient precision causes the breakdown of the associative and distributive
17067db96d56Sopenharmony_ciproperties of addition:
17077db96d56Sopenharmony_ci
17087db96d56Sopenharmony_ci.. doctest:: newcontext
17097db96d56Sopenharmony_ci
17107db96d56Sopenharmony_ci   # Examples from Seminumerical Algorithms, Section 4.2.2.
17117db96d56Sopenharmony_ci   >>> from decimal import Decimal, getcontext
17127db96d56Sopenharmony_ci   >>> getcontext().prec = 8
17137db96d56Sopenharmony_ci
17147db96d56Sopenharmony_ci   >>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')
17157db96d56Sopenharmony_ci   >>> (u + v) + w
17167db96d56Sopenharmony_ci   Decimal('9.5111111')
17177db96d56Sopenharmony_ci   >>> u + (v + w)
17187db96d56Sopenharmony_ci   Decimal('10')
17197db96d56Sopenharmony_ci
17207db96d56Sopenharmony_ci   >>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
17217db96d56Sopenharmony_ci   >>> (u*v) + (u*w)
17227db96d56Sopenharmony_ci   Decimal('0.01')
17237db96d56Sopenharmony_ci   >>> u * (v+w)
17247db96d56Sopenharmony_ci   Decimal('0.0060000')
17257db96d56Sopenharmony_ci
17267db96d56Sopenharmony_ciThe :mod:`decimal` module makes it possible to restore the identities by
17277db96d56Sopenharmony_ciexpanding the precision sufficiently to avoid loss of significance:
17287db96d56Sopenharmony_ci
17297db96d56Sopenharmony_ci.. doctest:: newcontext
17307db96d56Sopenharmony_ci
17317db96d56Sopenharmony_ci   >>> getcontext().prec = 20
17327db96d56Sopenharmony_ci   >>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')
17337db96d56Sopenharmony_ci   >>> (u + v) + w
17347db96d56Sopenharmony_ci   Decimal('9.51111111')
17357db96d56Sopenharmony_ci   >>> u + (v + w)
17367db96d56Sopenharmony_ci   Decimal('9.51111111')
17377db96d56Sopenharmony_ci   >>>
17387db96d56Sopenharmony_ci   >>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
17397db96d56Sopenharmony_ci   >>> (u*v) + (u*w)
17407db96d56Sopenharmony_ci   Decimal('0.0060000')
17417db96d56Sopenharmony_ci   >>> u * (v+w)
17427db96d56Sopenharmony_ci   Decimal('0.0060000')
17437db96d56Sopenharmony_ci
17447db96d56Sopenharmony_ci
17457db96d56Sopenharmony_ciSpecial values
17467db96d56Sopenharmony_ci^^^^^^^^^^^^^^
17477db96d56Sopenharmony_ci
17487db96d56Sopenharmony_ciThe number system for the :mod:`decimal` module provides special values
17497db96d56Sopenharmony_ciincluding ``NaN``, ``sNaN``, ``-Infinity``, ``Infinity``,
17507db96d56Sopenharmony_ciand two zeros, ``+0`` and ``-0``.
17517db96d56Sopenharmony_ci
17527db96d56Sopenharmony_ciInfinities can be constructed directly with:  ``Decimal('Infinity')``. Also,
17537db96d56Sopenharmony_cithey can arise from dividing by zero when the :exc:`DivisionByZero` signal is
17547db96d56Sopenharmony_cinot trapped.  Likewise, when the :exc:`Overflow` signal is not trapped, infinity
17557db96d56Sopenharmony_cican result from rounding beyond the limits of the largest representable number.
17567db96d56Sopenharmony_ci
17577db96d56Sopenharmony_ciThe infinities are signed (affine) and can be used in arithmetic operations
17587db96d56Sopenharmony_ciwhere they get treated as very large, indeterminate numbers.  For instance,
17597db96d56Sopenharmony_ciadding a constant to infinity gives another infinite result.
17607db96d56Sopenharmony_ci
17617db96d56Sopenharmony_ciSome operations are indeterminate and return ``NaN``, or if the
17627db96d56Sopenharmony_ci:exc:`InvalidOperation` signal is trapped, raise an exception.  For example,
17637db96d56Sopenharmony_ci``0/0`` returns ``NaN`` which means "not a number".  This variety of
17647db96d56Sopenharmony_ci``NaN`` is quiet and, once created, will flow through other computations
17657db96d56Sopenharmony_cialways resulting in another ``NaN``.  This behavior can be useful for a
17667db96d56Sopenharmony_ciseries of computations that occasionally have missing inputs --- it allows the
17677db96d56Sopenharmony_cicalculation to proceed while flagging specific results as invalid.
17687db96d56Sopenharmony_ci
17697db96d56Sopenharmony_ciA variant is ``sNaN`` which signals rather than remaining quiet after every
17707db96d56Sopenharmony_cioperation.  This is a useful return value when an invalid result needs to
17717db96d56Sopenharmony_ciinterrupt a calculation for special handling.
17727db96d56Sopenharmony_ci
17737db96d56Sopenharmony_ciThe behavior of Python's comparison operators can be a little surprising where a
17747db96d56Sopenharmony_ci``NaN`` is involved.  A test for equality where one of the operands is a
17757db96d56Sopenharmony_ciquiet or signaling ``NaN`` always returns :const:`False` (even when doing
17767db96d56Sopenharmony_ci``Decimal('NaN')==Decimal('NaN')``), while a test for inequality always returns
17777db96d56Sopenharmony_ci:const:`True`.  An attempt to compare two Decimals using any of the ``<``,
17787db96d56Sopenharmony_ci``<=``, ``>`` or ``>=`` operators will raise the :exc:`InvalidOperation` signal
17797db96d56Sopenharmony_ciif either operand is a ``NaN``, and return :const:`False` if this signal is
17807db96d56Sopenharmony_cinot trapped.  Note that the General Decimal Arithmetic specification does not
17817db96d56Sopenharmony_cispecify the behavior of direct comparisons; these rules for comparisons
17827db96d56Sopenharmony_ciinvolving a ``NaN`` were taken from the IEEE 854 standard (see Table 3 in
17837db96d56Sopenharmony_cisection 5.7).  To ensure strict standards-compliance, use the :meth:`~Decimal.compare`
17847db96d56Sopenharmony_ciand :meth:`~Decimal.compare_signal` methods instead.
17857db96d56Sopenharmony_ci
17867db96d56Sopenharmony_ciThe signed zeros can result from calculations that underflow. They keep the sign
17877db96d56Sopenharmony_cithat would have resulted if the calculation had been carried out to greater
17887db96d56Sopenharmony_ciprecision.  Since their magnitude is zero, both positive and negative zeros are
17897db96d56Sopenharmony_citreated as equal and their sign is informational.
17907db96d56Sopenharmony_ci
17917db96d56Sopenharmony_ciIn addition to the two signed zeros which are distinct yet equal, there are
17927db96d56Sopenharmony_civarious representations of zero with differing precisions yet equivalent in
17937db96d56Sopenharmony_civalue.  This takes a bit of getting used to.  For an eye accustomed to
17947db96d56Sopenharmony_cinormalized floating point representations, it is not immediately obvious that
17957db96d56Sopenharmony_cithe following calculation returns a value equal to zero:
17967db96d56Sopenharmony_ci
17977db96d56Sopenharmony_ci   >>> 1 / Decimal('Infinity')
17987db96d56Sopenharmony_ci   Decimal('0E-1000026')
17997db96d56Sopenharmony_ci
18007db96d56Sopenharmony_ci.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18017db96d56Sopenharmony_ci
18027db96d56Sopenharmony_ci
18037db96d56Sopenharmony_ci.. _decimal-threads:
18047db96d56Sopenharmony_ci
18057db96d56Sopenharmony_ciWorking with threads
18067db96d56Sopenharmony_ci--------------------
18077db96d56Sopenharmony_ci
18087db96d56Sopenharmony_ciThe :func:`getcontext` function accesses a different :class:`Context` object for
18097db96d56Sopenharmony_cieach thread.  Having separate thread contexts means that threads may make
18107db96d56Sopenharmony_cichanges (such as ``getcontext().prec=10``) without interfering with other threads.
18117db96d56Sopenharmony_ci
18127db96d56Sopenharmony_ciLikewise, the :func:`setcontext` function automatically assigns its target to
18137db96d56Sopenharmony_cithe current thread.
18147db96d56Sopenharmony_ci
18157db96d56Sopenharmony_ciIf :func:`setcontext` has not been called before :func:`getcontext`, then
18167db96d56Sopenharmony_ci:func:`getcontext` will automatically create a new context for use in the
18177db96d56Sopenharmony_cicurrent thread.
18187db96d56Sopenharmony_ci
18197db96d56Sopenharmony_ciThe new context is copied from a prototype context called *DefaultContext*. To
18207db96d56Sopenharmony_cicontrol the defaults so that each thread will use the same values throughout the
18217db96d56Sopenharmony_ciapplication, directly modify the *DefaultContext* object. This should be done
18227db96d56Sopenharmony_ci*before* any threads are started so that there won't be a race condition between
18237db96d56Sopenharmony_cithreads calling :func:`getcontext`. For example::
18247db96d56Sopenharmony_ci
18257db96d56Sopenharmony_ci   # Set applicationwide defaults for all threads about to be launched
18267db96d56Sopenharmony_ci   DefaultContext.prec = 12
18277db96d56Sopenharmony_ci   DefaultContext.rounding = ROUND_DOWN
18287db96d56Sopenharmony_ci   DefaultContext.traps = ExtendedContext.traps.copy()
18297db96d56Sopenharmony_ci   DefaultContext.traps[InvalidOperation] = 1
18307db96d56Sopenharmony_ci   setcontext(DefaultContext)
18317db96d56Sopenharmony_ci
18327db96d56Sopenharmony_ci   # Afterwards, the threads can be started
18337db96d56Sopenharmony_ci   t1.start()
18347db96d56Sopenharmony_ci   t2.start()
18357db96d56Sopenharmony_ci   t3.start()
18367db96d56Sopenharmony_ci    . . .
18377db96d56Sopenharmony_ci
18387db96d56Sopenharmony_ci.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18397db96d56Sopenharmony_ci
18407db96d56Sopenharmony_ci
18417db96d56Sopenharmony_ci.. _decimal-recipes:
18427db96d56Sopenharmony_ci
18437db96d56Sopenharmony_ciRecipes
18447db96d56Sopenharmony_ci-------
18457db96d56Sopenharmony_ci
18467db96d56Sopenharmony_ciHere are a few recipes that serve as utility functions and that demonstrate ways
18477db96d56Sopenharmony_cito work with the :class:`Decimal` class::
18487db96d56Sopenharmony_ci
18497db96d56Sopenharmony_ci   def moneyfmt(value, places=2, curr='', sep=',', dp='.',
18507db96d56Sopenharmony_ci                pos='', neg='-', trailneg=''):
18517db96d56Sopenharmony_ci       """Convert Decimal to a money formatted string.
18527db96d56Sopenharmony_ci
18537db96d56Sopenharmony_ci       places:  required number of places after the decimal point
18547db96d56Sopenharmony_ci       curr:    optional currency symbol before the sign (may be blank)
18557db96d56Sopenharmony_ci       sep:     optional grouping separator (comma, period, space, or blank)
18567db96d56Sopenharmony_ci       dp:      decimal point indicator (comma or period)
18577db96d56Sopenharmony_ci                only specify as blank when places is zero
18587db96d56Sopenharmony_ci       pos:     optional sign for positive numbers: '+', space or blank
18597db96d56Sopenharmony_ci       neg:     optional sign for negative numbers: '-', '(', space or blank
18607db96d56Sopenharmony_ci       trailneg:optional trailing minus indicator:  '-', ')', space or blank
18617db96d56Sopenharmony_ci
18627db96d56Sopenharmony_ci       >>> d = Decimal('-1234567.8901')
18637db96d56Sopenharmony_ci       >>> moneyfmt(d, curr='$')
18647db96d56Sopenharmony_ci       '-$1,234,567.89'
18657db96d56Sopenharmony_ci       >>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-')
18667db96d56Sopenharmony_ci       '1.234.568-'
18677db96d56Sopenharmony_ci       >>> moneyfmt(d, curr='$', neg='(', trailneg=')')
18687db96d56Sopenharmony_ci       '($1,234,567.89)'
18697db96d56Sopenharmony_ci       >>> moneyfmt(Decimal(123456789), sep=' ')
18707db96d56Sopenharmony_ci       '123 456 789.00'
18717db96d56Sopenharmony_ci       >>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')
18727db96d56Sopenharmony_ci       '<0.02>'
18737db96d56Sopenharmony_ci
18747db96d56Sopenharmony_ci       """
18757db96d56Sopenharmony_ci       q = Decimal(10) ** -places      # 2 places --> '0.01'
18767db96d56Sopenharmony_ci       sign, digits, exp = value.quantize(q).as_tuple()
18777db96d56Sopenharmony_ci       result = []
18787db96d56Sopenharmony_ci       digits = list(map(str, digits))
18797db96d56Sopenharmony_ci       build, next = result.append, digits.pop
18807db96d56Sopenharmony_ci       if sign:
18817db96d56Sopenharmony_ci           build(trailneg)
18827db96d56Sopenharmony_ci       for i in range(places):
18837db96d56Sopenharmony_ci           build(next() if digits else '0')
18847db96d56Sopenharmony_ci       if places:
18857db96d56Sopenharmony_ci           build(dp)
18867db96d56Sopenharmony_ci       if not digits:
18877db96d56Sopenharmony_ci           build('0')
18887db96d56Sopenharmony_ci       i = 0
18897db96d56Sopenharmony_ci       while digits:
18907db96d56Sopenharmony_ci           build(next())
18917db96d56Sopenharmony_ci           i += 1
18927db96d56Sopenharmony_ci           if i == 3 and digits:
18937db96d56Sopenharmony_ci               i = 0
18947db96d56Sopenharmony_ci               build(sep)
18957db96d56Sopenharmony_ci       build(curr)
18967db96d56Sopenharmony_ci       build(neg if sign else pos)
18977db96d56Sopenharmony_ci       return ''.join(reversed(result))
18987db96d56Sopenharmony_ci
18997db96d56Sopenharmony_ci   def pi():
19007db96d56Sopenharmony_ci       """Compute Pi to the current precision.
19017db96d56Sopenharmony_ci
19027db96d56Sopenharmony_ci       >>> print(pi())
19037db96d56Sopenharmony_ci       3.141592653589793238462643383
19047db96d56Sopenharmony_ci
19057db96d56Sopenharmony_ci       """
19067db96d56Sopenharmony_ci       getcontext().prec += 2  # extra digits for intermediate steps
19077db96d56Sopenharmony_ci       three = Decimal(3)      # substitute "three=3.0" for regular floats
19087db96d56Sopenharmony_ci       lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
19097db96d56Sopenharmony_ci       while s != lasts:
19107db96d56Sopenharmony_ci           lasts = s
19117db96d56Sopenharmony_ci           n, na = n+na, na+8
19127db96d56Sopenharmony_ci           d, da = d+da, da+32
19137db96d56Sopenharmony_ci           t = (t * n) / d
19147db96d56Sopenharmony_ci           s += t
19157db96d56Sopenharmony_ci       getcontext().prec -= 2
19167db96d56Sopenharmony_ci       return +s               # unary plus applies the new precision
19177db96d56Sopenharmony_ci
19187db96d56Sopenharmony_ci   def exp(x):
19197db96d56Sopenharmony_ci       """Return e raised to the power of x.  Result type matches input type.
19207db96d56Sopenharmony_ci
19217db96d56Sopenharmony_ci       >>> print(exp(Decimal(1)))
19227db96d56Sopenharmony_ci       2.718281828459045235360287471
19237db96d56Sopenharmony_ci       >>> print(exp(Decimal(2)))
19247db96d56Sopenharmony_ci       7.389056098930650227230427461
19257db96d56Sopenharmony_ci       >>> print(exp(2.0))
19267db96d56Sopenharmony_ci       7.38905609893
19277db96d56Sopenharmony_ci       >>> print(exp(2+0j))
19287db96d56Sopenharmony_ci       (7.38905609893+0j)
19297db96d56Sopenharmony_ci
19307db96d56Sopenharmony_ci       """
19317db96d56Sopenharmony_ci       getcontext().prec += 2
19327db96d56Sopenharmony_ci       i, lasts, s, fact, num = 0, 0, 1, 1, 1
19337db96d56Sopenharmony_ci       while s != lasts:
19347db96d56Sopenharmony_ci           lasts = s
19357db96d56Sopenharmony_ci           i += 1
19367db96d56Sopenharmony_ci           fact *= i
19377db96d56Sopenharmony_ci           num *= x
19387db96d56Sopenharmony_ci           s += num / fact
19397db96d56Sopenharmony_ci       getcontext().prec -= 2
19407db96d56Sopenharmony_ci       return +s
19417db96d56Sopenharmony_ci
19427db96d56Sopenharmony_ci   def cos(x):
19437db96d56Sopenharmony_ci       """Return the cosine of x as measured in radians.
19447db96d56Sopenharmony_ci
19457db96d56Sopenharmony_ci       The Taylor series approximation works best for a small value of x.
19467db96d56Sopenharmony_ci       For larger values, first compute x = x % (2 * pi).
19477db96d56Sopenharmony_ci
19487db96d56Sopenharmony_ci       >>> print(cos(Decimal('0.5')))
19497db96d56Sopenharmony_ci       0.8775825618903727161162815826
19507db96d56Sopenharmony_ci       >>> print(cos(0.5))
19517db96d56Sopenharmony_ci       0.87758256189
19527db96d56Sopenharmony_ci       >>> print(cos(0.5+0j))
19537db96d56Sopenharmony_ci       (0.87758256189+0j)
19547db96d56Sopenharmony_ci
19557db96d56Sopenharmony_ci       """
19567db96d56Sopenharmony_ci       getcontext().prec += 2
19577db96d56Sopenharmony_ci       i, lasts, s, fact, num, sign = 0, 0, 1, 1, 1, 1
19587db96d56Sopenharmony_ci       while s != lasts:
19597db96d56Sopenharmony_ci           lasts = s
19607db96d56Sopenharmony_ci           i += 2
19617db96d56Sopenharmony_ci           fact *= i * (i-1)
19627db96d56Sopenharmony_ci           num *= x * x
19637db96d56Sopenharmony_ci           sign *= -1
19647db96d56Sopenharmony_ci           s += num / fact * sign
19657db96d56Sopenharmony_ci       getcontext().prec -= 2
19667db96d56Sopenharmony_ci       return +s
19677db96d56Sopenharmony_ci
19687db96d56Sopenharmony_ci   def sin(x):
19697db96d56Sopenharmony_ci       """Return the sine of x as measured in radians.
19707db96d56Sopenharmony_ci
19717db96d56Sopenharmony_ci       The Taylor series approximation works best for a small value of x.
19727db96d56Sopenharmony_ci       For larger values, first compute x = x % (2 * pi).
19737db96d56Sopenharmony_ci
19747db96d56Sopenharmony_ci       >>> print(sin(Decimal('0.5')))
19757db96d56Sopenharmony_ci       0.4794255386042030002732879352
19767db96d56Sopenharmony_ci       >>> print(sin(0.5))
19777db96d56Sopenharmony_ci       0.479425538604
19787db96d56Sopenharmony_ci       >>> print(sin(0.5+0j))
19797db96d56Sopenharmony_ci       (0.479425538604+0j)
19807db96d56Sopenharmony_ci
19817db96d56Sopenharmony_ci       """
19827db96d56Sopenharmony_ci       getcontext().prec += 2
19837db96d56Sopenharmony_ci       i, lasts, s, fact, num, sign = 1, 0, x, 1, x, 1
19847db96d56Sopenharmony_ci       while s != lasts:
19857db96d56Sopenharmony_ci           lasts = s
19867db96d56Sopenharmony_ci           i += 2
19877db96d56Sopenharmony_ci           fact *= i * (i-1)
19887db96d56Sopenharmony_ci           num *= x * x
19897db96d56Sopenharmony_ci           sign *= -1
19907db96d56Sopenharmony_ci           s += num / fact * sign
19917db96d56Sopenharmony_ci       getcontext().prec -= 2
19927db96d56Sopenharmony_ci       return +s
19937db96d56Sopenharmony_ci
19947db96d56Sopenharmony_ci
19957db96d56Sopenharmony_ci.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19967db96d56Sopenharmony_ci
19977db96d56Sopenharmony_ci
19987db96d56Sopenharmony_ci.. _decimal-faq:
19997db96d56Sopenharmony_ci
20007db96d56Sopenharmony_ciDecimal FAQ
20017db96d56Sopenharmony_ci-----------
20027db96d56Sopenharmony_ci
20037db96d56Sopenharmony_ciQ. It is cumbersome to type ``decimal.Decimal('1234.5')``.  Is there a way to
20047db96d56Sopenharmony_ciminimize typing when using the interactive interpreter?
20057db96d56Sopenharmony_ci
20067db96d56Sopenharmony_ciA. Some users abbreviate the constructor to just a single letter:
20077db96d56Sopenharmony_ci
20087db96d56Sopenharmony_ci   >>> D = decimal.Decimal
20097db96d56Sopenharmony_ci   >>> D('1.23') + D('3.45')
20107db96d56Sopenharmony_ci   Decimal('4.68')
20117db96d56Sopenharmony_ci
20127db96d56Sopenharmony_ciQ. In a fixed-point application with two decimal places, some inputs have many
20137db96d56Sopenharmony_ciplaces and need to be rounded.  Others are not supposed to have excess digits
20147db96d56Sopenharmony_ciand need to be validated.  What methods should be used?
20157db96d56Sopenharmony_ci
20167db96d56Sopenharmony_ciA. The :meth:`~Decimal.quantize` method rounds to a fixed number of decimal places. If
20177db96d56Sopenharmony_cithe :const:`Inexact` trap is set, it is also useful for validation:
20187db96d56Sopenharmony_ci
20197db96d56Sopenharmony_ci   >>> TWOPLACES = Decimal(10) ** -2       # same as Decimal('0.01')
20207db96d56Sopenharmony_ci
20217db96d56Sopenharmony_ci   >>> # Round to two places
20227db96d56Sopenharmony_ci   >>> Decimal('3.214').quantize(TWOPLACES)
20237db96d56Sopenharmony_ci   Decimal('3.21')
20247db96d56Sopenharmony_ci
20257db96d56Sopenharmony_ci   >>> # Validate that a number does not exceed two places
20267db96d56Sopenharmony_ci   >>> Decimal('3.21').quantize(TWOPLACES, context=Context(traps=[Inexact]))
20277db96d56Sopenharmony_ci   Decimal('3.21')
20287db96d56Sopenharmony_ci
20297db96d56Sopenharmony_ci   >>> Decimal('3.214').quantize(TWOPLACES, context=Context(traps=[Inexact]))
20307db96d56Sopenharmony_ci   Traceback (most recent call last):
20317db96d56Sopenharmony_ci      ...
20327db96d56Sopenharmony_ci   Inexact: None
20337db96d56Sopenharmony_ci
20347db96d56Sopenharmony_ciQ. Once I have valid two place inputs, how do I maintain that invariant
20357db96d56Sopenharmony_cithroughout an application?
20367db96d56Sopenharmony_ci
20377db96d56Sopenharmony_ciA. Some operations like addition, subtraction, and multiplication by an integer
20387db96d56Sopenharmony_ciwill automatically preserve fixed point.  Others operations, like division and
20397db96d56Sopenharmony_cinon-integer multiplication, will change the number of decimal places and need to
20407db96d56Sopenharmony_cibe followed-up with a :meth:`~Decimal.quantize` step:
20417db96d56Sopenharmony_ci
20427db96d56Sopenharmony_ci    >>> a = Decimal('102.72')           # Initial fixed-point values
20437db96d56Sopenharmony_ci    >>> b = Decimal('3.17')
20447db96d56Sopenharmony_ci    >>> a + b                           # Addition preserves fixed-point
20457db96d56Sopenharmony_ci    Decimal('105.89')
20467db96d56Sopenharmony_ci    >>> a - b
20477db96d56Sopenharmony_ci    Decimal('99.55')
20487db96d56Sopenharmony_ci    >>> a * 42                          # So does integer multiplication
20497db96d56Sopenharmony_ci    Decimal('4314.24')
20507db96d56Sopenharmony_ci    >>> (a * b).quantize(TWOPLACES)     # Must quantize non-integer multiplication
20517db96d56Sopenharmony_ci    Decimal('325.62')
20527db96d56Sopenharmony_ci    >>> (b / a).quantize(TWOPLACES)     # And quantize division
20537db96d56Sopenharmony_ci    Decimal('0.03')
20547db96d56Sopenharmony_ci
20557db96d56Sopenharmony_ciIn developing fixed-point applications, it is convenient to define functions
20567db96d56Sopenharmony_cito handle the :meth:`~Decimal.quantize` step:
20577db96d56Sopenharmony_ci
20587db96d56Sopenharmony_ci    >>> def mul(x, y, fp=TWOPLACES):
20597db96d56Sopenharmony_ci    ...     return (x * y).quantize(fp)
20607db96d56Sopenharmony_ci    >>> def div(x, y, fp=TWOPLACES):
20617db96d56Sopenharmony_ci    ...     return (x / y).quantize(fp)
20627db96d56Sopenharmony_ci
20637db96d56Sopenharmony_ci    >>> mul(a, b)                       # Automatically preserve fixed-point
20647db96d56Sopenharmony_ci    Decimal('325.62')
20657db96d56Sopenharmony_ci    >>> div(b, a)
20667db96d56Sopenharmony_ci    Decimal('0.03')
20677db96d56Sopenharmony_ci
20687db96d56Sopenharmony_ciQ. There are many ways to express the same value.  The numbers ``200``,
20697db96d56Sopenharmony_ci``200.000``, ``2E2``, and ``.02E+4`` all have the same value at
20707db96d56Sopenharmony_civarious precisions. Is there a way to transform them to a single recognizable
20717db96d56Sopenharmony_cicanonical value?
20727db96d56Sopenharmony_ci
20737db96d56Sopenharmony_ciA. The :meth:`~Decimal.normalize` method maps all equivalent values to a single
20747db96d56Sopenharmony_cirepresentative:
20757db96d56Sopenharmony_ci
20767db96d56Sopenharmony_ci   >>> values = map(Decimal, '200 200.000 2E2 .02E+4'.split())
20777db96d56Sopenharmony_ci   >>> [v.normalize() for v in values]
20787db96d56Sopenharmony_ci   [Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2')]
20797db96d56Sopenharmony_ci
20807db96d56Sopenharmony_ciQ. Some decimal values always print with exponential notation.  Is there a way
20817db96d56Sopenharmony_cito get a non-exponential representation?
20827db96d56Sopenharmony_ci
20837db96d56Sopenharmony_ciA. For some values, exponential notation is the only way to express the number
20847db96d56Sopenharmony_ciof significant places in the coefficient.  For example, expressing
20857db96d56Sopenharmony_ci``5.0E+3`` as ``5000`` keeps the value constant but cannot show the
20867db96d56Sopenharmony_cioriginal's two-place significance.
20877db96d56Sopenharmony_ci
20887db96d56Sopenharmony_ciIf an application does not care about tracking significance, it is easy to
20897db96d56Sopenharmony_ciremove the exponent and trailing zeroes, losing significance, but keeping the
20907db96d56Sopenharmony_civalue unchanged:
20917db96d56Sopenharmony_ci
20927db96d56Sopenharmony_ci    >>> def remove_exponent(d):
20937db96d56Sopenharmony_ci    ...     return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize()
20947db96d56Sopenharmony_ci
20957db96d56Sopenharmony_ci    >>> remove_exponent(Decimal('5E+3'))
20967db96d56Sopenharmony_ci    Decimal('5000')
20977db96d56Sopenharmony_ci
20987db96d56Sopenharmony_ciQ. Is there a way to convert a regular float to a :class:`Decimal`?
20997db96d56Sopenharmony_ci
21007db96d56Sopenharmony_ciA. Yes, any binary floating point number can be exactly expressed as a
21017db96d56Sopenharmony_ciDecimal though an exact conversion may take more precision than intuition would
21027db96d56Sopenharmony_cisuggest:
21037db96d56Sopenharmony_ci
21047db96d56Sopenharmony_ci.. doctest::
21057db96d56Sopenharmony_ci
21067db96d56Sopenharmony_ci    >>> Decimal(math.pi)
21077db96d56Sopenharmony_ci    Decimal('3.141592653589793115997963468544185161590576171875')
21087db96d56Sopenharmony_ci
21097db96d56Sopenharmony_ciQ. Within a complex calculation, how can I make sure that I haven't gotten a
21107db96d56Sopenharmony_cispurious result because of insufficient precision or rounding anomalies.
21117db96d56Sopenharmony_ci
21127db96d56Sopenharmony_ciA. The decimal module makes it easy to test results.  A best practice is to
21137db96d56Sopenharmony_cire-run calculations using greater precision and with various rounding modes.
21147db96d56Sopenharmony_ciWidely differing results indicate insufficient precision, rounding mode issues,
21157db96d56Sopenharmony_ciill-conditioned inputs, or a numerically unstable algorithm.
21167db96d56Sopenharmony_ci
21177db96d56Sopenharmony_ciQ. I noticed that context precision is applied to the results of operations but
21187db96d56Sopenharmony_cinot to the inputs.  Is there anything to watch out for when mixing values of
21197db96d56Sopenharmony_cidifferent precisions?
21207db96d56Sopenharmony_ci
21217db96d56Sopenharmony_ciA. Yes.  The principle is that all values are considered to be exact and so is
21227db96d56Sopenharmony_cithe arithmetic on those values.  Only the results are rounded.  The advantage
21237db96d56Sopenharmony_cifor inputs is that "what you type is what you get".  A disadvantage is that the
21247db96d56Sopenharmony_ciresults can look odd if you forget that the inputs haven't been rounded:
21257db96d56Sopenharmony_ci
21267db96d56Sopenharmony_ci.. doctest:: newcontext
21277db96d56Sopenharmony_ci
21287db96d56Sopenharmony_ci   >>> getcontext().prec = 3
21297db96d56Sopenharmony_ci   >>> Decimal('3.104') + Decimal('2.104')
21307db96d56Sopenharmony_ci   Decimal('5.21')
21317db96d56Sopenharmony_ci   >>> Decimal('3.104') + Decimal('0.000') + Decimal('2.104')
21327db96d56Sopenharmony_ci   Decimal('5.20')
21337db96d56Sopenharmony_ci
21347db96d56Sopenharmony_ciThe solution is either to increase precision or to force rounding of inputs
21357db96d56Sopenharmony_ciusing the unary plus operation:
21367db96d56Sopenharmony_ci
21377db96d56Sopenharmony_ci.. doctest:: newcontext
21387db96d56Sopenharmony_ci
21397db96d56Sopenharmony_ci   >>> getcontext().prec = 3
21407db96d56Sopenharmony_ci   >>> +Decimal('1.23456789')      # unary plus triggers rounding
21417db96d56Sopenharmony_ci   Decimal('1.23')
21427db96d56Sopenharmony_ci
21437db96d56Sopenharmony_ciAlternatively, inputs can be rounded upon creation using the
21447db96d56Sopenharmony_ci:meth:`Context.create_decimal` method:
21457db96d56Sopenharmony_ci
21467db96d56Sopenharmony_ci   >>> Context(prec=5, rounding=ROUND_DOWN).create_decimal('1.2345678')
21477db96d56Sopenharmony_ci   Decimal('1.2345')
21487db96d56Sopenharmony_ci
21497db96d56Sopenharmony_ciQ. Is the CPython implementation fast for large numbers?
21507db96d56Sopenharmony_ci
21517db96d56Sopenharmony_ciA. Yes.  In the CPython and PyPy3 implementations, the C/CFFI versions of
21527db96d56Sopenharmony_cithe decimal module integrate the high speed `libmpdec
21537db96d56Sopenharmony_ci<https://www.bytereef.org/mpdecimal/doc/libmpdec/index.html>`_ library for
21547db96d56Sopenharmony_ciarbitrary precision correctly rounded decimal floating point arithmetic [#]_.
21557db96d56Sopenharmony_ci``libmpdec`` uses `Karatsuba multiplication
21567db96d56Sopenharmony_ci<https://en.wikipedia.org/wiki/Karatsuba_algorithm>`_
21577db96d56Sopenharmony_cifor medium-sized numbers and the `Number Theoretic Transform
21587db96d56Sopenharmony_ci<https://en.wikipedia.org/wiki/Discrete_Fourier_transform_(general)#Number-theoretic_transform>`_
21597db96d56Sopenharmony_cifor very large numbers.
21607db96d56Sopenharmony_ci
21617db96d56Sopenharmony_ciThe context must be adapted for exact arbitrary precision arithmetic. :attr:`~Context.Emin`
21627db96d56Sopenharmony_ciand :attr:`~Context.Emax` should always be set to the maximum values, :attr:`~Context.clamp`
21637db96d56Sopenharmony_cishould always be 0 (the default).  Setting :attr:`~Context.prec` requires some care.
21647db96d56Sopenharmony_ci
21657db96d56Sopenharmony_ciThe easiest approach for trying out bignum arithmetic is to use the maximum
21667db96d56Sopenharmony_civalue for :attr:`~Context.prec` as well [#]_::
21677db96d56Sopenharmony_ci
21687db96d56Sopenharmony_ci    >>> setcontext(Context(prec=MAX_PREC, Emax=MAX_EMAX, Emin=MIN_EMIN))
21697db96d56Sopenharmony_ci    >>> x = Decimal(2) ** 256
21707db96d56Sopenharmony_ci    >>> x / 128
21717db96d56Sopenharmony_ci    Decimal('904625697166532776746648320380374280103671755200316906558262375061821325312')
21727db96d56Sopenharmony_ci
21737db96d56Sopenharmony_ci
21747db96d56Sopenharmony_ciFor inexact results, :attr:`MAX_PREC` is far too large on 64-bit platforms and
21757db96d56Sopenharmony_cithe available memory will be insufficient::
21767db96d56Sopenharmony_ci
21777db96d56Sopenharmony_ci   >>> Decimal(1) / 3
21787db96d56Sopenharmony_ci   Traceback (most recent call last):
21797db96d56Sopenharmony_ci     File "<stdin>", line 1, in <module>
21807db96d56Sopenharmony_ci   MemoryError
21817db96d56Sopenharmony_ci
21827db96d56Sopenharmony_ciOn systems with overallocation (e.g. Linux), a more sophisticated approach is to
21837db96d56Sopenharmony_ciadjust :attr:`~Context.prec` to the amount of available RAM.  Suppose that you have 8GB of
21847db96d56Sopenharmony_ciRAM and expect 10 simultaneous operands using a maximum of 500MB each::
21857db96d56Sopenharmony_ci
21867db96d56Sopenharmony_ci   >>> import sys
21877db96d56Sopenharmony_ci   >>>
21887db96d56Sopenharmony_ci   >>> # Maximum number of digits for a single operand using 500MB in 8-byte words
21897db96d56Sopenharmony_ci   >>> # with 19 digits per word (4-byte and 9 digits for the 32-bit build):
21907db96d56Sopenharmony_ci   >>> maxdigits = 19 * ((500 * 1024**2) // 8)
21917db96d56Sopenharmony_ci   >>>
21927db96d56Sopenharmony_ci   >>> # Check that this works:
21937db96d56Sopenharmony_ci   >>> c = Context(prec=maxdigits, Emax=MAX_EMAX, Emin=MIN_EMIN)
21947db96d56Sopenharmony_ci   >>> c.traps[Inexact] = True
21957db96d56Sopenharmony_ci   >>> setcontext(c)
21967db96d56Sopenharmony_ci   >>>
21977db96d56Sopenharmony_ci   >>> # Fill the available precision with nines:
21987db96d56Sopenharmony_ci   >>> x = Decimal(0).logical_invert() * 9
21997db96d56Sopenharmony_ci   >>> sys.getsizeof(x)
22007db96d56Sopenharmony_ci   524288112
22017db96d56Sopenharmony_ci   >>> x + 2
22027db96d56Sopenharmony_ci   Traceback (most recent call last):
22037db96d56Sopenharmony_ci     File "<stdin>", line 1, in <module>
22047db96d56Sopenharmony_ci     decimal.Inexact: [<class 'decimal.Inexact'>]
22057db96d56Sopenharmony_ci
22067db96d56Sopenharmony_ciIn general (and especially on systems without overallocation), it is recommended
22077db96d56Sopenharmony_cito estimate even tighter bounds and set the :attr:`Inexact` trap if all calculations
22087db96d56Sopenharmony_ciare expected to be exact.
22097db96d56Sopenharmony_ci
22107db96d56Sopenharmony_ci
22117db96d56Sopenharmony_ci.. [#]
22127db96d56Sopenharmony_ci    .. versionadded:: 3.3
22137db96d56Sopenharmony_ci
22147db96d56Sopenharmony_ci.. [#]
22157db96d56Sopenharmony_ci    .. versionchanged:: 3.9
22167db96d56Sopenharmony_ci       This approach now works for all exact results except for non-integer powers.
2217