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

调试迭代平方根近似器代码 多测试用例验证求助

迭代平方根近似器代码调试与测试指南

代码核心问题分析

原代码存在几个关键逻辑错误,导致无法正确计算平方根:

  • 终止条件完全颠倒:原代码判断(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:输出错误提示,返回NaN
  • 0:返回0.0
  • 0.5:返回值接近0.7071(误差小于0.001)
  • 1:返回值接近1.0
  • 3:返回值接近1.732
  • 9:返回值接近3.0
  • 34:返回值接近5.830
  • 10000:返回值接近100.0

额外调试建议

  • 添加日志打印:在递归调用前后打印当前guess、tmp值,直观看到每一步的迭代变化,快速定位逻辑问题。
  • 替换递归为循环:对于极大数值,递归可能导致栈溢出,改成while循环更稳定。
  • 调整迭代策略:原代码用固定step调整猜测值效率较低,牛顿迭代法((guess + number/guess)/2)收敛速度更快,结果更精确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:55:23