Racket 比弗洛姆

Racket 比弗洛姆,racket,flonum,Racket,Flonum,我想定义一个具有以下属性的函数: (almost-equal? (cos (/ pi 2)) 0.0) ; --> #t 为此,我认为应该以以下方式使用flulp: (define (almost-equal? a b) (let [[epsilon (max (abs (flulp (* 10.0 a))) (abs (flulp (* 10.0 b))))]] (<= (absolute-error a b) epsilon))) (定义(几乎相等?a b)

我想定义一个具有以下属性的函数:

(almost-equal? (cos (/ pi 2)) 0.0)   ; --> #t
为此,我认为应该以以下方式使用
flulp

(define (almost-equal? a b)
  (let [[epsilon (max (abs (flulp (* 10.0 a))) (abs (flulp (* 10.0 b))))]]
    (<= (absolute-error a b) epsilon)))
(定义(几乎相等?a b)
(设[[epsilon(max(abs(flulp(*10.0a)))(abs(flulp(*10.0b)))]]

(使用
相对误差

我可以推荐这篇关于如何调试数值函数的文章:


Neil Toronto和Jay McCarthy(相对误差(cos(/pi 2))0.0)
给我
+inf.0
。事实上,由于使用cos,理想的ε会复杂得多。由于一些IRC聊天,我意识到ε取决于输入的微积分,而不是输入的相对精度。我能做的最好的事情是让用户决定ε并添加一个额外的参数。理想的ε将是:
(绝对误差(cos(+(flulp(/pi 2))(/pi 2)))(cos(/pi 2))
感谢btwI没有想到的链接!由于预期值为零,相对误差将是
(x-0)/0=+inf.0
。但是对于预期的非零值,则
相对误差
是要使用的函数。