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

SICP 1.7平方根实现是否存在错误场景?求指导

SICP 1.7平方根实现的问题分析与错误案例

你写的这个平方根实现里,good-enough?通过判断当前guess和improve后的结果是否相等来终止迭代——这本质是找牛顿迭代的不动点:当guess满足guess = (guess + x/guess)/2时,它就是x的平方根。在有限精度的浮点数环境下,大部分输入都会在有限步内收敛到浮点数能表示的不动点,所以你测试的小数值和大数值都能正常终止。

但存在特殊输入会触发无限循环,下面是具体案例:

错误案例1:输入0

运行(sqrt 0)时,迭代会不断把guess缩小,直到变成0.0:

  • 当guess为0.0时,improve(0.0, 0)会计算(0.0 + 0/0.0)/2,而0/0.0会得到NaN(非数值)。
  • Scheme里(= 0.0 NaN)的结果是#f,接下来的迭代会一直传入NaN作为guess,但improve(NaN, 0)还是返回NaN,且(= NaN NaN)同样是#f,直接导致无限循环。

错误案例2:输入NaN

如果测试(sqrt +nan.0),初始guess=1.0,improve(1.0, +nan.0)会得到NaN,之后的迭代永远满足不了good-enough?的判断条件,陷入无限循环。

为什么你测试的数值没问题?

你试的小数值和超大数值能正常终止,是因为它们的迭代误差会逐渐缩小,直到浮点数无法区分guess和improve(guess, x)的差异——这时候两者在浮点数表示下完全相等,触发终止条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:44:51