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)

EmaxEmin 控制小数点的范围。如果指数大于 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_EMAXMAX_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')