这段代码取自 Sussman and Wisdom 的Structure and Interpretation of Classical Mechanics,其目的是导出(接近)主机支持的最小正浮点数。 https://github.com/hnarayanan/sicm/blob/e37f011db68f8efc51ae309cd61bf497b90970da/scmutils/src/kernel/numeric.scm
在 DrRacket 中运行它会在我的机器上生成 2.220446049250313e-016。
我的问题,是什么导致它甚至返回一个值?这段代码是尾递归的,在某些时候计算机不能再除以 2 是有意义的。为什么它不抛出?
(define *machine-epsilon*
(let loop ((e 1.0))
(if (= 1.0 (+ e 1.0))
(* 2 e)
(loop (/ e 2)))))
*machine-epsilon*