Python 3用while循环计算圆周率出错求助,结果为3.414
问题分析与修复方案
嘿,我来帮你排查这个用while循环计算圆周率的问题~你得到3.414的结果,是因为代码里的循环条件、迭代逻辑和最终计算π的方式都偏离了正确的公式(看起来你想用韦达公式来逼近π,对吧?)。
先拆解下你的代码里的核心问题:
1. 循环条件完全错误
你写的while 2 * (2 / sqrt(2 + denominator) > 1)逻辑混乱:
- 首先
2 / sqrt(2 + denominator)在初始阶段是大于1的(比如第一次计算时,denominator≈1.847,sqrt(2+1.847)≈1.961,2/1.961≈1.02>1),括号内为True,乘以2后还是True,但这个条件完全没体现迭代的终止逻辑。正确的做法是判断当前项和1的差值是否小于某个精度阈值(比如1e-6),当迭代项趋近于1时,再继续循环对精度提升已经很小,就可以停止了。
2. 迭代步骤不符合韦达公式
韦达公式的迭代逻辑是不断生成嵌套的根号项:
π/2 = (2/√2) × (2/√(2+√2)) × (2/√(2+√(2+√2))) × ...
所以每次迭代应该计算新的分母:denominator = sqrt(2 + denominator),而不是把denominator平方(denominator *= denominator这一步完全错了)。
3. π的计算逻辑错误
你最后直接把denominator赋值给pi,这完全不符合公式。我们需要维护一个乘积变量,每次乘以当前项2 / denominator,最后再乘以2得到π的近似值。
修正后的代码
from math import sqrt # 初始化韦达公式的第一项 product = 2 / sqrt(2) denominator = sqrt(2 + sqrt(2)) # 设置精度阈值,当当前项和1的差小于这个值时停止循环 epsilon = 1e-6 while abs((2 / denominator) - 1) > epsilon: product *= 2 / denominator # 更新分母为下一个嵌套根号项 denominator = sqrt(2 + denominator) # 根据韦达公式,π = 2 × 累积乘积 pi = 2 * product print("Approximation of pi: %s" % (round(pi, 3)))
运行这段代码,你会得到正确的近似值3.141(或者更精确的结果,取决于你设置的epsilon大小)。
额外说明
- 如果你想更直观地看到迭代过程,可以在循环里加一句
print(f"当前乘积: {product}, 当前π近似值: {2*product}"),观察每次迭代的变化。 - 精度阈值
epsilon越小,迭代次数越多,π的近似值越精确,但计算时间也会稍长。
内容的提问来源于stack exchange,提问作者123glkj
相关产品推荐
相关产品推荐

