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

关于Python二分法求平方根中abs()作用的技术疑问

原代码示例

x = 25
epsilon = 0.01
numGuesses = 0
low = 0.0
high = max(1.0, x)
ans = (high + low)/2.0
while abs(ans**2 - x) >= epsilon:
    print ('low =', low, 'high =', high, 'ans =', ans)
    numGuesses += 1
    if ans**2 < x:
        low = ans
    else:
        high = ans
    ans = (high + low)/2.0
print ('numGuesses =', numGuesses)
print (ans, 'is close to square root of', x)

用户疑问

各位好:
我对上述代码中的while abs(ans**2 - x) >= epsilon:语句存在疑问。我原本认为abs()仅在处理负数时发挥作用,但移除abs()后使用while (ans**2 - x) >= epsilon:会导致平方根求解出现问题,这是为什么?我忽略了什么关键要点?


嘿,这个问题问得特别到位!咱们来拆解一下这里的核心逻辑:

首先,这段代码用的是二分法逼近平方根,核心思路是不断缩小low和high的范围,让中间值ans逐渐靠近真实的平方根。循环的终止条件是「ans的平方和x的差距足够小」——这里的“差距”指的是绝对值差,不管ans是比真实平方根大还是小,只要差距小于epsilon(0.01),就认为结果足够准确。

你忽略的关键要点是:ans**2 - x的差值可能是正,也可能是负:

  • 当ans比真实平方根大时,ans**2 - x是正数,这时候(ans**2 - x) >= epsilon会成立,循环能继续执行;
  • 但当ans比真实平方根小时,ans**2 - x是负数,这时候(ans**2 - x) >= epsilon会直接不成立,循环会提前终止!

举个具体的例子:比如x=25,真实平方根是5。假设某次循环中ans=4,ans**2=16,这时候16-25=-9,显然-9 >= 0.01是假的,循环会直接停止,但这时候ans=4离真实的平方根5还差得远,结果自然就出错了。

而abs()的作用就是把正、负差值都转换成正数,这样不管ans是偏大还是偏小,只要和真实值的差距还没到epsilon以内,循环就会继续执行,直到ans足够接近真实平方根为止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:54:57