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
。但是对于预期的非零值,则相对误差
是要使用的函数。