使用Python编写Pi计算器如何获取更多位小数精度
圆周率计算代码优化方案
原代码问题
- 采用的巴塞尔级数收敛速度为线性级,要达到1e-15精度需要1e15次迭代,8500万次迭代仅能得到前8位左右的正确小数,无法满足15位以上的精度需求
- 原生Python
float为64位双精度浮点数,仅能提供约15~17位有效数字,累加过程还会产生精度损失,天然无法支撑更高精度的计算 - 无自动终止条件,死循环运行无法自动得到目标精度结果
修改后可直接运行的代码
from decimal import Decimal, getcontext # 此处设置你需要的小数位数,可自行调整 target_decimal_digits = 20 # 运算精度设置为目标位数+10,预留足够余量避免运算过程中的精度损失 getcontext().prec = target_decimal_digits + 10 def calculate_pi(): # 采用楚德诺夫斯基算法,单次迭代可获得约14位十进制精度 constant = Decimal(426880) * Decimal(10005).sqrt() L = Decimal(13591409) X = Decimal(1) M = Decimal(1) K = Decimal(6) sum_total = L n = 1 # 迭代次数仅需目标位数/14+1即可,20位精度仅需迭代2次 for _ in range(target_decimal_digits // 14 + 1): M = (K**3 - 16 * K) * M / n**3 L += 545140134 X *= -262537412640768000 sum_total += M * L / X K += 12 n += 1 pi = constant / sum_total # 格式化输出保留目标小数位数 return pi.quantize(Decimal("1." + "0" * target_decimal_digits)) if __name__ == "__main__": print(calculate_pi())
运行上述代码即可直接得到20位精度的圆周率结果:3.14159265358979323846,调整target_decimal_digits参数即可获得任意位数的计算结果。
修改逻辑说明
- 级数替换:将收敛速度极慢的巴塞尔级数替换为楚德诺夫斯基算法,该算法误差为指数级下降,每迭代1次可获得约14位十进制精度,仅需2次迭代即可满足15位以上的精度需求,计算效率相比原方案提升超过10^14倍。
- 高精度运算支持:引入Python标准库
decimal模块实现任意精度运算,突破原生双精度浮点数的精度限制,通过自定义运算精度保证计算过程中不会出现精度损失。 - 逻辑优化:新增目标位数参数,可灵活调整输出精度,新增自动终止逻辑,达到目标精度后自动停止运算并输出结果,不需要手动终止死循环。
内容的提问来源于stack exchange,提问作者Not Gartificial
相关产品推荐
相关产品推荐

