此计划代码如何返回值?

问题描述 投票:0回答:1

此代码取自Sussman and Wisdom的古典力学的结构和解释,其目的是得出(接近)主机支持的最小正浮点数。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*

sqrt-machine-epsilon

scheme racket
1个回答
0
投票

此代码是尾部递归的,并且在某些时候计算机不再可以除以2才有意义。为什么它不抛出?

否,想法不同:在某些时候计算机仍然[[can除以2,但是结果(e)与0(e + 1.0 = 1.0)变得难以区分,这正是if子句的含义检查)。从机器的角度来看,我们肯定知道先前的e仍大于零(否则我们将无法到达当前的执行点),因此我们只返回e*2

© www.soinside.com 2019 - 2024. All rights reserved.