调试迭代平方根近似器代码 多测试用例验证求助
迭代平方根近似器代码调试与测试指南
代码核心问题分析
原代码存在几个关键逻辑错误,导致无法正确计算平方根:
- 终止条件完全颠倒:原代码判断
(tmp - number) > tol时返回猜测值,实际应该是当abs(tmp - number) < tol(即猜测值的平方与目标数的误差小于容忍度)时,才认为结果足够精确并返回。原条件会导致程序在第一次迭代就错误返回初始猜测值。 - 迭代方向错误:
- 当猜测值的平方大于目标数(
tmp > number),说明猜大了,应该减小猜测值,但原代码用(1+step)*guess会让猜测值更大; - 当猜测值的平方小于目标数(
tmp < number),说明猜小了,应该增大猜测值,但原代码用(1-step)*guess会让猜测值更小。
- 当猜测值的平方大于目标数(
- 未直接处理0的情况:当输入为0时,虽然初始guess设为0,但仍会进入后续判断,可直接返回0简化逻辑。
修复后的代码
import math def mySqrt(number, guess, step, tol): # 处理负数 if number < 0: print('Error - we do not work with complex numbers here...') return float("NaN") # 直接返回0的情况 if number == 0: return 0.0 # 初始猜测值设置(第一次调用guess为0时触发) if guess == 0: guess = 0.5 * number if number > 1 else number * 2 tmp = guess * guess # 正确的终止条件:误差小于容忍度 if abs(tmp - number) < tol: return guess else: if tmp > number: # 猜大了,用牛顿法思路缩小猜测值(收敛更快) return mySqrt(number, (guess + number/guess)/2, step, tol) else: # 猜小了,用牛顿法思路增大猜测值 return mySqrt(number, (guess + number/guess)/2, step, tol) # 测试指定集合及大数值 test_values = [-4, 0, 0.5, 1, 3, 9, 34, 10000] for val in test_values: result = mySqrt(val, 0, 0.001, 0.001) print(f"平方根计算结果:{val} -> {result}") # 对比内置函数结果(验证精度) if val >= 0: print(f"内置函数参考值:{math.sqrt(val)}") print("---")
测试用例预期输出参考(容忍度tol=0.001)
-4:输出错误提示,返回NaN0:返回0.00.5:返回值接近0.7071(误差小于0.001)1:返回值接近1.03:返回值接近1.7329:返回值接近3.034:返回值接近5.83010000:返回值接近100.0
额外调试建议
- 添加日志打印:在递归调用前后打印当前guess、tmp值,直观看到每一步的迭代变化,快速定位逻辑问题。
- 替换递归为循环:对于极大数值,递归可能导致栈溢出,改成while循环更稳定。
- 调整迭代策略:原代码用固定step调整猜测值效率较低,牛顿迭代法(
(guess + number/guess)/2)收敛速度更快,结果更精确。
内容的提问来源于stack exchange,提问作者LunaDaLlama
相关产品推荐
相关产品推荐

