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

使用巴比伦法计算平方根结果错误的问题求助

使用巴比伦法计算平方根结果错误的问题求助

嘿,我看了你用巴比伦法写的平方根计算代码,输入100返回26确实离谱,咱们来一步步揪出问题所在:

先还原你的问题:

我感觉逻辑都对,但就是算不对平方根。每次运行结果都有问题,比如输入100,它返回26,这明显不对。我哪里做错了?

你的代码如下:

def sqrt(n):
    nextGuess = n / 2
    lastGuess = 1
    accuracy = 0.000001
    while lastGuess > accuracy:
        x = (lastGuess + n / lastGuess) / 2
        lastGuess = nextGuess - x
        nextGuess = x
        return x

n = float(input('Enter a value:'))
if n <= 0:
    print('Invalid number. Enter a positive number.')
else:
    print(sqrt(n))

第一个致命问题:return 放错地方了!

你把return x直接写在while循环里面了,这意味着循环刚跑第一次就直接返回结果了——巴比伦法本来需要多次迭代慢慢收敛到正确值,你这直接掐断了迭代过程,结果能对才怪!

第二个大问题:迭代公式用错了变量

巴比伦法的核心是用当前的猜测值去算下一个更准的猜测值,公式是新猜测 = (旧猜测 + n/旧猜测)/2。但你第一次算x的时候,用的是初始值lastGuess=1,而不是你一开始设的nextGuess(也就是n/2),这直接让第一次计算就跑偏了——输入100的话,用1算出来的是(1+100)/2=50.5,不过你说返回26,应该是你写代码时把变量搞混了,要是误用nextGuess计算的话,(50+100/50)/2=26,这就是你得到错误结果的直接原因!

还有循环条件也错了

你写的while lastGuess > accuracy完全不合逻辑:你把lastGuess赋值成nextGuess - x,这个值可能是负数(比如第一次循环后是50-50.5=-0.5),-0.5肯定小于0.000001,循环直接就停了。正确的循环条件应该是判断两次猜测值的差的绝对值是否大于精度——也就是当新旧猜测的差距还比较大的时候,继续迭代。

给你修正后的代码

我把变量名改得更清晰,逻辑也理顺了:

def sqrt(n):
    # 初始猜测值设为n/2,这是巴比伦法常用的初始值
    current_guess = n / 2
    accuracy = 0.000001
    
    while True:
        # 用当前猜测值计算下一个更准确的结果
        next_guess = (current_guess + n / current_guess) / 2
        # 检查是否达到精度要求:新旧猜测的差足够小
        if abs(next_guess - current_guess) < accuracy:
            break
        # 更新当前猜测值,准备下一轮迭代
        current_guess = next_guess
    
    return next_guess

n = float(input('Enter a value:'))
if n <= 0:
    print('Invalid number. Enter a positive number.')
else:
    print(sqrt(n))

你再测试输入100,这个代码会返回接近10的结果(比如9.999999999999998),完全符合预期。

备注:内容来源于stack exchange,提问作者Qui333

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:33:14