Python中的BBP算法 - 使用任意精度算法

时间:2015-03-01 14:02:48

标签: python algorithm pi arbitrary-precision

我正在写一篇关于pi计算的学期论文。虽然我已经完成了理论网站,但我现在正在用Python实现BBP算法。

你可以在这里找到BBP算法: http://en.wikipedia.org/wiki/Bailey%E2%80%93Borwein%E2%80%93Plouffe_formula

这是我在Python中的实现:

from sympy.mpmath import *
pi = mpf(0)
mp.dps = 30;
for n in range(0,500):
    pi = pi + mpf((1/16**n)*(4/(8*n+1)-  2/(8*n+4)-  1/(8*n+5)-  1/(8*n+6)) )


print(pi)

我的问题是,无论我设置k有多高或者设置pi的小数位数有多高我都不能获得比16位更高的精度。

我使用mpmath获得更高的精度,因为我之前遇到过一些问题。

如何改进我的代码,以便获得更多数字?

1 个答案:

答案 0 :(得分:1)

默认情况下,python将使用IEEE-754定义的标准浮点。这具有大约12位数的精度,并且可以将数字表示为 2 -1022 的低点,现在您可以通过先前调用mpf运算符来解决此问题因此,这个过程,更具可读性和更精确的版本:

from sympy.mpmath import *
pi = mpf(0)
mp.dps = 30;
for n in range(0,500):
    u = 4.0/(8*n+1)-2.0/(8*n+4)-1.0/(8*n+5)-1.0/(8*n+6)
    u = mpf(u)
    d = mpf(16.0/1.0)**n
    pi += u/d

print(pi)

但是,当您计算u部分时,这仍然存在问题。要做到这一点,您可以使用:

from sympy.mpmath import *
pi = mpf(0)
mp.dps = 50;
for n in range(0,50000):
    u = mpf(4)/mpf(8*n+1)-mpf(2)/mpf(8*n+4)-mpf(1)/mpf(8*n+5)-mpf(1)/mpf(8*n+6)
    d = mpf(16.0)**n
    pi += u/d

print(pi)

对于前50位数字,这是正确的:

3.1415926535 8979323846 2643383279 502884197 1693993751

(添加空格)