求助:如何用Python正确实现1/π近似计算公式的求和循环?
修正拉马努金1/π近似公式的Python实现
你当前的代码存在几个关键错误,导致结果异常:
- 未实现公式要求的求和逻辑:该公式是对k从0到N的所有项累加,你只计算了单个k=N的项,还错误地乘以了N。
- k的起始值错误:公式中k的取值从0开始,而非1。
- 幂运算表达式错误:
396**4*k应为396**(4*k),你当前的写法是先计算396的4次方再乘以k,与公式不符。
以下是正确的实现代码:
import math def approximate_reciprocal_pi(N): # 初始化求和变量 total = 0.0 for k in range(0, N+1): # 计算每一项的分子 numerator = math.factorial(4 * k) * (1103 + 26390 * k) # 计算每一项的分母 denominator = (math.factorial(k) ** 4) * (396 ** (4 * k)) # 累加当前项 total += numerator / denominator # 打印当前迭代进度 print(f"正在迭代k={k}/{N}", end="\r", flush=True) # 乘以公式的前置系数 rec_pi = (2 * math.sqrt(2) / 9801) * total return rec_pi # 测试:仅需N=10即可得到极高精度的1/π N = 10 reciprocal_pi = approximate_reciprocal_pi(N) print(f"\n1/π的近似值:{reciprocal_pi}") print(f"真实1/π值:{1/math.pi}") print(f"误差:{abs(reciprocal_pi - 1/math.pi)}")
补充说明
- 拉马努金的这个公式收敛极快,仅N=10就能得到超过30位的有效数字,完全不需要取到132这么大的N。
- 使用
math.factorial计算阶乘时,k过大(比如k>100)会触发数值溢出,但公式的快速收敛特性根本不需要这么大的迭代次数。
内容的提问来源于stack exchange,提问作者FIG
相关产品推荐
相关产品推荐

