我有一个用Chudnovsky算法近似计算圆周率的程序,但方程中一个非常小的项一直被舍入为零。
这是算法:
import math
from decimal import *
getcontext().prec = 100
pi = Decimal(0.0)
C = Decimal(12/(math.sqrt(640320**3)))
k = 0
x = Decimal(0.0)
result = Decimal(0.0)
sign = 1
while k<10:
r = Decimal(math.factorial(6*k)/((math.factorial(k)**3)*math.factorial(3*k)))
s = Decimal((13591409+545140134*k)/((640320**3)**k))
x += Decimal(sign*r*s)
sign = sign*(-1)
k += 1
result = Decimal(C*x)
pi = Decimal(1/result)
print Decimal(pi)
去掉“小数”项,方程会更清晰。
import math
pi = 0.0
C = 12/(math.sqrt(640320**3))
k = 0
x = 0.0
result = 0.0
sign = 1
while k<10:
r = math.factorial(6*k)/((math.factorial(k)**3)*math.factorial(3*k))
s = (13591409+545140134*k)/((640320**3)**k)
x += sign*r*s
sign = sign*(-1)
k += 1
result = C*x
pi = 1/result
print pi
问题出在 "s" 变量上,对于 k>0,它总是变成了零。例如,在 k=1 时,s 应该约为 2.1e-9,但实际上它只是零。因此,我的第一个项之后的所有项都等于零。我如何让 python 计算 s 的精确值,而不是将其舍入为零?
s = float(13591409+545140134*k)/((640320**3)**k)
吗? - karthikrk < 10
足够大。 - unutbufrom decimal import Decimal
代替from decimal import *
。 - Solomon Ucko