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