我有一个程序打算使用 Chudnovsky 算法来近似 pi,但是我的方程中一个非常小的项一直被四舍五入为零。
这是算法:
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,但它只是零。因此,我在第一个 =0 之后的所有条款。如何让 python 计算 s 的确切值而不是将其四舍五入为 0?