Nor*_*Rad 15 python algorithm pi
我是一个蟒蛇初学者,我想计算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)
Run Code Online (Sandbox Code Playgroud)
出于某种原因,与可接受的值相比,此代码产生pi的vakue,最多只有15位小数.我试图通过提高精度值来解决这个问题; 这会增加位数,但只有前15位仍然准确.我尝试改变计算算法的方式,但它也没有用.所以我的问题是,是否可以对此代码进行一些操作以使其更准确或者我是否必须使用其他算法?我很感激这方面的帮助,因为我不知道如何在python中使用这么多位数.我希望能够控制程序确定和显示的(正确)数字的数量 - 无论是10,100,1000等.
Jua*_*pes 18
看来你在这条线上正在失去精确度:
pi = pi * Decimal(12)/Decimal(640320**(1.5))
Run Code Online (Sandbox Code Playgroud)
尝试使用:
pi = pi * Decimal(12)/Decimal(640320**Decimal(1.5))
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为即使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))
Run Code Online (Sandbox Code Playgroud)
对于那些来到这里的人来说,只是为了获得一个现成的解决方案来获得Python的任意精度pi:
import decimal
def pi():
"""
Compute Pi to the current precision.
Examples
--------
>>> print(pi())
3.141592653589793238462643383
Notes
-----
Taken from https://docs.python.org/3/library/decimal.html#recipes
"""
decimal.getcontext().prec += 2 # extra digits for intermediate steps
three = decimal.Decimal(3) # substitute "three=3.0" for regular floats
lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
while s != lasts:
lasts = s
n, na = n + na, na + 8
d, da = d + da, da + 32
t = (t * n) / d
s += t
decimal.getcontext().prec -= 2
return +s # unary plus applies the new precision
decimal.getcontext().prec = 1000
pi = pi()
Run Code Online (Sandbox Code Playgroud)