溢出错误:(34,'结果太大')

2024-05-17 15:05:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到一个溢出错误(overflow error:(34,'结果太大')
我想计算圆周率到100位小数这是我的代码:

def pi(): 
    pi = 0 
    for k in range(350): 
        pi += (4./(8.*k+1.) - 2./(8.*k+4.) - 1./(8.*k+5.) - 1./(8.*k+6.)) / 16.**k 
    return pi 
print(pi())

Tags: 代码inforreturndef错误pirange
3条回答

16.*256太大,无法存储在双精度浮点中。我建议你运行你的周期少,像范围(250),因为更大的k值不会贡献到前100位。

另一件事,你可以尝试乘以16.*(-k),而不是除以16。*k。对于大k,此数字将四舍五入为零,因此不会出现运行时错误。

我建议您使用numpy.power而不是**,它可以更好地处理溢出。例如,在您的代码中,numpy.power(16.,256)的计算结果是inf,将有限的数字除以inf得到零,这样就避免了运行时错误,就像前面一段中建议的方法一样。

您达到了平台的float支持的极限,可能是在k = 256之后:

>>> k = 256
>>> (4./(8.*k+1.) - 2./(8.*k+4.) - 1./(8.*k+5.) - 1./(8.*k+6.)) / 16.**k
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')
>>> k = 255
>>> (4./(8.*k+1.) - 2./(8.*k+4.) - 1./(8.*k+5.) - 1./(8.*k+6.)) / 16.**k
3.19870064997e-313

请参阅sys.float_info了解确切的限制,但您不太可能遇到当前的CPU和OS组合,在任何情况下都会给您100个有效数字;我的MacBook Pro和64位OS X只支持15个。

使用^{} module超越硬件限制。

from decimal import Decimal, localcontext

def pi(): 
    with localcontext() as ctx:
        ctx.prec = 100  # 100 digits precision
        pi = Decimal(0) 
        for k in range(350): 
            pi += (Decimal(4)/(Decimal(8)*k+1) - Decimal(2)/(Decimal(8)*k+4) - Decimal(1)/(Decimal(8)*k+5) - Decimal(1)/(Decimal(8)*k+6)) / Decimal(16)**k 
    return pi 

Python浮动既不是任意精度,也不是无限大小。当k=349时,16.**k太大了,差不多是2^1400。幸运的是,decimal库允许任意精度并可以处理大小:

import decimal
decimal.getcontext().prec = 100
def pi():
    pi = decimal.Decimal(0)
    for k in range(350):
        pi += (decimal.Decimal(4)/(decimal.Decimal(8)*decimal.Decimal(k+1))...)

相关问题 更多 >