mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-29 03:04:38 +08:00
* Update ten Python library modules to Python 3.15 final Migrate dependency-ordered linecache, locale, _pydecimal, decimal, random, uuid, wave, _strptime, zipapp and poplib with their canonical tests and WAV fixtures using update_lib. Assisted-by: OpenAI Codex:model version unavailable * Align dependent datetime and warning tests with Python 3.15 final Generate complete dependent tests and pure datetime through update_lib from CPython d220409a13b77de7a6c30abe16ea90db01528edc. Preserve the existing tracemalloc expected failure. Pass warning module metadata to WarningMessage, use sys context after stack exhaustion, and identify invalid category classes with the existing qualified-name helper. Assisted-by: OpenAI Codex:model version unavailable
110 lines
2.8 KiB
Python
Vendored
110 lines
2.8 KiB
Python
Vendored
"""Decimal fixed-point and floating-point arithmetic.
|
|
|
|
This is an implementation of decimal floating-point arithmetic based on
|
|
the General Decimal Arithmetic Specification:
|
|
|
|
http://speleotrove.com/decimal/decarith.html
|
|
|
|
and IEEE standard 854-1987:
|
|
|
|
http://en.wikipedia.org/wiki/IEEE_854-1987
|
|
|
|
Decimal floating point has finite precision with arbitrarily large bounds.
|
|
|
|
The purpose of this module is to support arithmetic using familiar
|
|
"schoolhouse" rules and to avoid some of the tricky representation
|
|
issues associated with binary floating point. The package is especially
|
|
useful for financial applications or for contexts where users have
|
|
expectations that are at odds with binary floating point (for instance,
|
|
in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
|
|
of 0.0; Decimal('1.00') % Decimal('0.1') returns the expected
|
|
Decimal('0.00')).
|
|
|
|
Here are some examples of using the decimal module:
|
|
|
|
>>> from decimal import *
|
|
>>> setcontext(ExtendedContext)
|
|
>>> Decimal(0)
|
|
Decimal('0')
|
|
>>> Decimal('1')
|
|
Decimal('1')
|
|
>>> Decimal('-.0123')
|
|
Decimal('-0.0123')
|
|
>>> Decimal(123456)
|
|
Decimal('123456')
|
|
>>> Decimal('123.45e12345678')
|
|
Decimal('1.2345E+12345680')
|
|
>>> Decimal('1.33') + Decimal('1.27')
|
|
Decimal('2.60')
|
|
>>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41')
|
|
Decimal('-2.20')
|
|
>>> dig = Decimal(1)
|
|
>>> print(dig / Decimal(3))
|
|
0.333333333
|
|
>>> getcontext().prec = 18
|
|
>>> print(dig / Decimal(3))
|
|
0.333333333333333333
|
|
>>> print(dig.sqrt())
|
|
1
|
|
>>> print(Decimal(3).sqrt())
|
|
1.73205080756887729
|
|
>>> print(Decimal(3) ** 123)
|
|
4.85192780976896427E+58
|
|
>>> inf = Decimal(1) / Decimal(0)
|
|
>>> print(inf)
|
|
Infinity
|
|
>>> neginf = Decimal(-1) / Decimal(0)
|
|
>>> print(neginf)
|
|
-Infinity
|
|
>>> print(neginf + inf)
|
|
NaN
|
|
>>> print(neginf * inf)
|
|
-Infinity
|
|
>>> print(dig / 0)
|
|
Infinity
|
|
>>> getcontext().traps[DivisionByZero] = 1
|
|
>>> print(dig / 0)
|
|
Traceback (most recent call last):
|
|
...
|
|
...
|
|
...
|
|
decimal.DivisionByZero: x / 0
|
|
>>> c = Context()
|
|
>>> c.traps[InvalidOperation] = 0
|
|
>>> print(c.flags[InvalidOperation])
|
|
0
|
|
>>> c.divide(Decimal(0), Decimal(0))
|
|
Decimal('NaN')
|
|
>>> c.traps[InvalidOperation] = 1
|
|
>>> print(c.flags[InvalidOperation])
|
|
1
|
|
>>> c.flags[InvalidOperation] = 0
|
|
>>> print(c.flags[InvalidOperation])
|
|
0
|
|
>>> print(c.divide(Decimal(0), Decimal(0)))
|
|
Traceback (most recent call last):
|
|
...
|
|
...
|
|
...
|
|
decimal.InvalidOperation: 0 / 0
|
|
>>> print(c.flags[InvalidOperation])
|
|
1
|
|
>>> c.flags[InvalidOperation] = 0
|
|
>>> c.traps[InvalidOperation] = 0
|
|
>>> print(c.divide(Decimal(0), Decimal(0)))
|
|
NaN
|
|
>>> print(c.flags[InvalidOperation])
|
|
1
|
|
>>>
|
|
"""
|
|
|
|
try:
|
|
from _decimal import *
|
|
from _decimal import __libmpdec_version__ # noqa: F401
|
|
from _decimal import __getattr__ # noqa: F401
|
|
except ImportError:
|
|
import _pydecimal
|
|
import sys
|
|
_pydecimal.__doc__ = __doc__
|
|
sys.modules[__name__] = _pydecimal
|