如何找到添加到1.0的最小正数会给出更大的值?

soe*_*ard 7 scheme numerical racket

在将一些Fortran翻译为Scheme/Racket时,我遇到了这个功能:

; EPSILON(X)      The  least  positive  number  that added
;                 to 1 returns a number that is greater than 1
Run Code Online (Sandbox Code Playgroud)

如何在Scheme中找到该号码?

dyo*_*yoo 6

#lang racket/base

;; http://en.wikipedia.org/wiki/Machine_epsilon
;; approximates the machine epsilon

(require racket/flonum)

(define (compute-machine-epsilon)
  (let loop ([n 1.0])
    (define next-n (fl/ n 2.0))
    (if (fl= 1.0 (fl+ 1.0 next-n))
        n
        (loop next-n))))
Run Code Online (Sandbox Code Playgroud)


Dan*_*den 5

假设您正在使用IEEE-754浮点(在Scheme中可能不是这种情况,我不知道),那么机器epsilon是众所周知的:对于双精度算术,它是1.11e-16.

对于其他平台或浮点实现,Wikipedia显示计算它的公式(在Haskell中):

main = print . last . map (subtract 1) . takeWhile (/= 1) . map (+ 1) . iterate (/2) $ 1
Run Code Online (Sandbox Code Playgroud)