You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:17:51