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中找到该号码?
#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)
假设您正在使用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)