关于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
相关产品推荐
相关产品推荐

