Python平方根函数实现中step取epsilon平方的原因咨询
x = 25 epsilon = 0.01 step = epsilon**2 numGuesses = 0 ans = 0.0 while abs(ans**2 - x) >= epsilon and ans <= x: ans += step numGuesses += 1 print('numGuesses =', numGuesses) if abs(ans**2 - x) >= epsilon: print('Failed on square root of', x) else: print(ans, 'is close to square root of', x)
以上是《Python计算与编程导论》一书中的穷举法求平方根实现,关于step = epsilon**2的取值推导逻辑如下:
- 算法的核心目标是找到满足
|ans² - x| < epsilon的近似解,epsilon是我们允许的平方误差阈值,本例中为0.01。 - 这是线性穷举算法,每次给候选值
ans加固定步长step,要保证步长足够小,不会一步跨过符合误差要求的区间,导致漏判(明明存在符合要求的解,却返回查找失败)。 - 我们可以计算步长带来的平方值增量:
(ans + step)² - ans² = 2*ans*step + step²,这个增量必须小于epsilon,才能保证不会漏解。 - 作者选择了非常保守、无需额外预计算的步长取值:直接取
step为epsilon的平方,也就是0.0001。代入本例x=25的场景,候选值ans最大不超过5,平方增量最大值约为2*5*0.0001 = 0.001,远小于epsilon=0.01,完全可以保证不会跳过符合要求的解。就算x取到100以内的数值,这个步长带来的平方增量都不会超过0.002,依然满足要求,适用范围很广。 - 这个取值的优势是实现简单,不需要提前估算x的平方根范围,非常适合入门教学场景。
内容的提问来源于stack exchange,提问作者Walid
相关产品推荐
相关产品推荐

