Fix rationalize with +nan.0 tolerance
Calling `rationalize` with `+nan.0` as the second argument was causing a "no exact representation error." This commit changes it to produce `+nan.0`. There was an unexercised set of tests for `rationalize` in the test suite which, once called, demonstrate the bug. Those tests also specify that `rationalize` should produce an exact result when the first argument is exact and the second is an infinity. That's not what the implementation does; it coerces the result to inexact. I changed the test cases to match the implementation, which is consistent with other Schemes (Chez, MIT) and standards (R6RS).
This commit is contained in:
parent
4fa48182c0
commit
c93837c2ce
|
@ -2440,16 +2440,16 @@
|
||||||
(err/rt-test (rationalize .3+0.0i 1/10))
|
(err/rt-test (rationalize .3+0.0i 1/10))
|
||||||
|
|
||||||
(define (test-rat-inf v)
|
(define (test-rat-inf v)
|
||||||
(define zero (if (exact? v) 0 0.0))
|
|
||||||
|
|
||||||
(test +inf.0 rationalize +inf.0 v)
|
(test +inf.0 rationalize +inf.0 v)
|
||||||
(test -inf.0 rationalize -inf.0 v)
|
(test -inf.0 rationalize -inf.0 v)
|
||||||
(test-nan.0 rationalize +nan.0 v)
|
(test-nan.0 rationalize +nan.0 v)
|
||||||
|
|
||||||
(test zero rationalize v +inf.0)
|
(test 0.0 rationalize v +inf.0)
|
||||||
(test zero rationalize v -inf.0)
|
(test 0.0 rationalize v -inf.0)
|
||||||
(test-nan.0 rationalize v +nan.0))
|
(test-nan.0 rationalize v +nan.0))
|
||||||
|
|
||||||
|
(test-rat-inf 1/3)
|
||||||
|
|
||||||
(let loop ([i 100])
|
(let loop ([i 100])
|
||||||
(unless (= i -100)
|
(unless (= i -100)
|
||||||
(test (/ i 100) rationalize (inexact->exact (/ i 100.0)) 1/100000)
|
(test (/ i 100) rationalize (inexact->exact (/ i 100.0)) 1/100000)
|
||||||
|
|
|
@ -68,12 +68,12 @@
|
||||||
[lo (- x delta)]
|
[lo (- x delta)]
|
||||||
[hi (+ x delta)])
|
[hi (+ x delta)])
|
||||||
(cond
|
(cond
|
||||||
[(equal? x +nan.0) x]
|
[(not (= x x)) x]
|
||||||
[(or (equal? x +inf.0)
|
[(or (equal? x +inf.0)
|
||||||
(equal? x -inf.0))
|
(equal? x -inf.0))
|
||||||
(if (equal? delta +inf.0) +nan.0 x)]
|
(if (equal? delta +inf.0) +nan.0 x)]
|
||||||
[(equal? delta +inf.0) 0.0]
|
[(equal? delta +inf.0) 0.0]
|
||||||
[(not (= x x)) +nan.0]
|
[(not (= within within)) within]
|
||||||
[(<= lo 0 hi) (if (exact? x) 0 0.0)]
|
[(<= lo 0 hi) (if (exact? x) 0 0.0)]
|
||||||
[(or (inexact? lo) (inexact? hi))
|
[(or (inexact? lo) (inexact? hi))
|
||||||
(exact->inexact (do-find-between (inexact->exact lo) (inexact->exact hi)))]
|
(exact->inexact (do-find-between (inexact->exact lo) (inexact->exact hi)))]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user