一尘不染

Python pi计算?

algorithm

我是python初学者,我想计算pi。我试过使用Chudnovsky算法,因为听说它比其他算法快。

这是我的代码:

from math import factorial
from decimal import Decimal, getcontext

getcontext().prec=100

def calc(n):
    t= Decimal(0)
    pi = Decimal(0)
    deno= Decimal(0)
    k = 0
    for k in range(n):
        t = ((-1)**k)*(factorial(6*k))*(13591409+545140134*k)
        deno = factorial(3*k)*(factorial(k)**3)*(640320**(3*k))
        pi += Decimal(t)/Decimal(deno)                                   
    pi = pi * Decimal(12)/Decimal(640320**(1.5))
    pi = 1/pi
    return pi

print calc(25)

出于某种原因,此代码与可接受的值相比最多只能生成15个小数的pi
vakue。我试图通过提高精度值来解决这个问题。这会增加位数,但是只有前15位仍然是正确的。我试图改变它计算算法的方式,但也没有用。所以我的问题是,
可以对这段代码进行一些处理以使其更加准确吗,还是我必须使用其他算法?
我将不胜感激,因为我不知道如何在python中使用这么多的数字。我希望能够控制程序确定和显示的(正确)数字的数量-是否为10、100、1000等。


阅读 331

收藏
2020-07-28

共1个答案

一尘不染

似乎您在此行中失去了精度:

pi = pi * Decimal(12)/Decimal(640320**(1.5))

尝试使用:

pi = pi * Decimal(12)/Decimal(640320**Decimal(1.5))

发生这种情况是因为,即使Python可以处理任意小数位整数,但对于浮点数来说效果并不理想。

奖金

使用另一种算法(BBP公式)的单行实现:

from decimal import Decimal, getcontext
getcontext().prec=100
print sum(1/Decimal(16)**k * 
          (Decimal(4)/(8*k+1) - 
           Decimal(2)/(8*k+4) - 
           Decimal(1)/(8*k+5) -
           Decimal(1)/(8*k+6)) for k in range(100))
2020-07-28