Decimal class 可以处理的最大数字是多少?
What is the largest number the Decimal class can handle?
我的程序计算数学常数 e,这是无理数。为此,我需要获取非常大的数的阶乘。
int
无法处理大于 170! 的数字。 (我发现 Google 的计算器可以处理的最大数是 170.654259,但我不确定非整数如何因式分解。) float
也不能处理非常大的数。
我计算出e为750000位,math.factorial(750000)
是一个令人难以置信的大数字。然而,Decimal
处理起来显然很轻松。
在引发 OverflowError
之前,Decimal
可以处理多大的数字? Python 2 与 Python 3 的尺寸是否不同?
这取决于您为 Decimal 对象提供的上下文。来自 library documentation:
class decimal.Context(prec=None, rounding=None, traps=None,
flags=None, Emin=None, Emax=None, capitals=1)
Emax
和 Emin
控制小数点的范围。如果指数大于 Emax
或小于 Emin
将出现溢出信号。您可以查看 decimal.defaultContext
中的字段以查看默认情况下的字段,或 decimal.getContext()
以查看它们在任何给定时间的字段。
编辑:正如@davidism 指出的那样,您无法从 decimal
计算中得到准确的答案。该模块的默认精度为 28。因此可以精确表示最大为 999999999999999999999999999999(28 个九)的所有整数,更高的数字可能会四舍五入。
What is the largest number the Decimal class can handle?
最大幅度为无穷大:
>>> from decimal import Decimal
>>> Decimal('Inf')
Decimal('Infinity')
给定平台上可表示的最大有限数取决于 decimal.MAX_EMAX
:
>>> from decimal import Context, MAX_EMAX
>>> d = Context(Emax=MAX_EMAX, prec=1).create_decimal('9e'+str(MAX_EMAX))
>>> d.is_finite()
True
>>> d.next_plus()
Decimal('Infinity')
>>> d
Decimal('9E+999999999999999999')
有效数字的数量取决于decimal.MAX_PREC
例如,要使用给定的精度计算e
:
>>> from decimal import Context
>>> Context(prec=60).exp(1)
Decimal('2.71828182845904523536028747135266249775724709369995957496697')
常量(MAX_EMAX
、MAX_PREC
)仅与 C 实现相关。纯 Python 版本可以使用更大的值:
>>> from decimal import Context, MAX_EMAX
>>> Context(Emax=MAX_EMAX+1, prec=1).create_decimal('9e'+str(MAX_EMAX+1))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: valid range for Emax is [0, MAX_EMAX]
>>> from _pydecimal import Context, MAX_EMAX
>>> Context(Emax=MAX_EMAX+1, prec=1).create_decimal('9e'+str(MAX_EMAX+1))
Decimal('9E+1000000000000000000')
我的程序计算数学常数 e,这是无理数。为此,我需要获取非常大的数的阶乘。
int
无法处理大于 170! 的数字。 (我发现 Google 的计算器可以处理的最大数是 170.654259,但我不确定非整数如何因式分解。) float
也不能处理非常大的数。
我计算出e为750000位,math.factorial(750000)
是一个令人难以置信的大数字。然而,Decimal
处理起来显然很轻松。
在引发 OverflowError
之前,Decimal
可以处理多大的数字? Python 2 与 Python 3 的尺寸是否不同?
这取决于您为 Decimal 对象提供的上下文。来自 library documentation:
class decimal.Context(prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=1)
Emax
和 Emin
控制小数点的范围。如果指数大于 Emax
或小于 Emin
将出现溢出信号。您可以查看 decimal.defaultContext
中的字段以查看默认情况下的字段,或 decimal.getContext()
以查看它们在任何给定时间的字段。
编辑:正如@davidism 指出的那样,您无法从 decimal
计算中得到准确的答案。该模块的默认精度为 28。因此可以精确表示最大为 999999999999999999999999999999(28 个九)的所有整数,更高的数字可能会四舍五入。
What is the largest number the Decimal class can handle?
最大幅度为无穷大:
>>> from decimal import Decimal
>>> Decimal('Inf')
Decimal('Infinity')
给定平台上可表示的最大有限数取决于 decimal.MAX_EMAX
:
>>> from decimal import Context, MAX_EMAX
>>> d = Context(Emax=MAX_EMAX, prec=1).create_decimal('9e'+str(MAX_EMAX))
>>> d.is_finite()
True
>>> d.next_plus()
Decimal('Infinity')
>>> d
Decimal('9E+999999999999999999')
有效数字的数量取决于decimal.MAX_PREC
例如,要使用给定的精度计算e
:
>>> from decimal import Context
>>> Context(prec=60).exp(1)
Decimal('2.71828182845904523536028747135266249775724709369995957496697')
常量(MAX_EMAX
、MAX_PREC
)仅与 C 实现相关。纯 Python 版本可以使用更大的值:
>>> from decimal import Context, MAX_EMAX
>>> Context(Emax=MAX_EMAX+1, prec=1).create_decimal('9e'+str(MAX_EMAX+1))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: valid range for Emax is [0, MAX_EMAX]
>>> from _pydecimal import Context, MAX_EMAX
>>> Context(Emax=MAX_EMAX+1, prec=1).create_decimal('9e'+str(MAX_EMAX+1))
Decimal('9E+1000000000000000000')