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

use*_*766 13 python pi decimal overflow

我收到溢出错误(OverflowError:(34,'结果太大')
我想计算pi到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())
Run Code Online (Sandbox Code Playgroud)

Pet*_*per 27

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))...)
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 14

您达到了平台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
Run Code Online (Sandbox Code Playgroud)

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

使用该decimal模块超出了硬件限制.

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 
Run Code Online (Sandbox Code Playgroud)