Decimal类可以处理的最大数字是多少?

时间:2015-01-22 04:00:57

标签: python python-3.x decimal python-2.x

我的程序计算数学常数 e ,这是不合理的。为了做到这一点,我需要得到非常大数的阶乘。

int无法处理大于170的数字! (我发现Google最大的计算器可以处理的是170.654259,但我不确定如何将非整数分解。)float也无法处理非常大的数字。

我计算 e 到750000位数,math.factorial(750000)是一个令人难以置信的大数字。然而,Decimal很容易处理它。

在引发Decimal之前,OverflowError处理的数字有多大? Python 2与Python 3的大小不同吗?

2 个答案:

答案 0 :(得分:7)

  

Decimal类可以处理的最大数字是多少?

最大幅度是无穷大:

>>> 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')

答案 1 :(得分:1)

这取决于您为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个9)的所有整数,并且可以舍入更高的数字。