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

Python While循环无法终止及√2平方根计算异常问题求助

解决√2计算脚本的两个问题

嘿,我来帮你搞定这两个头疼的问题!咱们挨个拆解:

问题1:While循环停不下来,重复输出最后几行

这种情况几乎肯定是浮点数精度限制搞的鬼。你大概率用了类似while x*x != 2或者过于严苛的误差判断作为终止条件——但浮点数本身是有限精度的,当迭代到一定程度后,x*x和2的差值已经小到浮点数无法再区分,每次迭代的结果都完全一致,所以循环会一直跑下去,输出重复内容。

解决办法很简单:

  • 把终止条件改成误差小于一个极小的阈值(比如1e-15),而不是要求完全等于0。示例:
    while abs(x*x - 2) > 1e-15:
        # 你的迭代逻辑
    
  • 或者检查当前值和上一次迭代值的差值,如果小于阈值就停止,避免无意义的重复计算:
    prev_x = 0
    while abs(x - prev_x) > 1e-15:
        prev_x = x
        # 你的迭代逻辑
    

问题2:计算结果停在1.41421356237,无法生成更多位数

这还是浮点数的锅!Python里默认的float是双精度浮点数,最多只能表示15-17位有效数字,1.41421356237刚好是它能精确存储的√2近似值的极限,再往后的位数它根本存不住。

如果想要更多位数的√2,得用Python的decimal模块——它支持任意精度的十进制运算。下面给你一个现成的示例:

from decimal import Decimal, getcontext

# 设置你想要的有效数字位数,比如50位
getcontext().prec = 50

def calculate_sqrt_two():
    x = Decimal(1)  # 迭代初始值
    prev_x = Decimal(0)
    # 用和精度匹配的极小阈值判断终止
    threshold = Decimal('1e-' + str(getcontext().prec))
    while abs(x - prev_x) > threshold:
        prev_x = x
        # 牛顿迭代核心公式
        x = (x + Decimal(2)/x) / Decimal(2)
        print(x)
    return x

calculate_sqrt_two()

这段代码设置了50位精度,运行后会输出到50位有效数字的√2,而且循环会在迭代收敛后自动停止,不会无限重复。

最后再划个重点

  1. 循环停不下来:别死磕“误差等于0”,换成基于极小阈值的终止条件;
  2. 精度不够:用decimal模块替代默认float,自定义需要的精度。

内容的提问来源于stack exchange,提问作者Kieran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:05:46