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,而且循环会在迭代收敛后自动停止,不会无限重复。
最后再划个重点
- 循环停不下来:别死磕“误差等于0”,换成基于极小阈值的终止条件;
- 精度不够:用
decimal模块替代默认float,自定义需要的精度。
内容的提问来源于stack exchange,提问作者Kieran
相关产品推荐
相关产品推荐

