【发布时间】:2016-09-27 23:47:59
【问题描述】:
对于我的学校项目,我试图计算使用不同方法的价值。我发现的公式之一是可以使用 arctan(x) 的泰勒展开式计算的 Machin 公式。
我用python写了如下代码:
import decimal
count = pi = a = b = c = d = val1 = val2 = decimal.Decimal(0) #Initializing the variables
decimal.getcontext().prec = 25 #Setting percision
while (decimal.Decimal(count) <= decimal.Decimal(100)):
a = pow(decimal.Decimal(-1), decimal.Decimal(count))
b = ((decimal.Decimal(2) * decimal.Decimal(count)) + decimal.Decimal(1))
c = pow(decimal.Decimal(1/5), decimal.Decimal(b))
d = (decimal.Decimal(a) / decimal.Decimal(b)) * decimal.Decimal(c)
val1 = decimal.Decimal(val1) + decimal.Decimal(d)
count = decimal.Decimal(count) + decimal.Decimal(1)
#The series has been divided into multiple small parts to reduce confusion
count = a = b = c = d = decimal.Decimal(0) #Resetting the variables
while (decimal.Decimal(count) <= decimal.Decimal(10)):
a = pow(decimal.Decimal(-1), decimal.Decimal(count))
b = ((decimal.Decimal(2) * decimal.Decimal(count)) + decimal.Decimal(1))
c = pow(decimal.Decimal(1/239), decimal.Decimal(b))
d = (decimal.Decimal(a) / decimal.Decimal(b)) * decimal.Decimal(c)
val2 = decimal.Decimal(val2) + decimal.Decimal(d)
count = decimal.Decimal(count) + decimal.Decimal(1)
#The series has been divided into multiple small parts to reduce confusion
pi = (decimal.Decimal(16) * decimal.Decimal(val1)) - (decimal.Decimal(4) * decimal.Decimal(val2))
print(pi)
问题是,无论循环重复多少次,我只能得到正确的 pi 值直到小数点后 15 位。
例如:
在第一个循环的 11 次重复时
pi = 3.141592653589793408632493
第一个循环重复 100 次
pi = 3.141592653589793410703296
我不会增加第二个循环的重复次数,因为 arctan(1/239) 非常小,只需几次重复即可达到极小的值,因此不应影响仅小数点后 15 位的 pi 值。
额外信息:
Machin 公式指出:
π = (16 * Summation of (((-1)^n) / 2n+1) * ((1/5)^(2n+1))) - (4 * Summation of (((-1)^n) / 2n+1) * ((1/239)^(2n+1)))
【问题讨论】:
-
我没有检查你的代码,但是写 Decimal(1/5) 没有问题吗?它不提供 0.2 而是 0.2000....1110223024... 因为 1/5 首先转换为浮点数,而浮点数不能准确存储 0.2。写入 Decimal(1)/Decimal(5) 正好提供 0.2