mhw pushed a commit to branch stable-2.2 in repository guile. commit e1dffd35040dab4dd9f631e8c6dc9fc110f791e8 Author: Mark H Weaver <m...@netris.org> Date: Sun May 27 22:04:27 2018 -0400
Avoid inexact arithmetic in the type inferrer for 'sqrt'. * module/language/cps/types.scm: Use 'exact-integer-sqrt' and avoid inexact arithmetic in the range analysis of the type inferrer for 'sqrt'. --- module/language/cps/types.scm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/module/language/cps/types.scm b/module/language/cps/types.scm index 4326a8d..5c1d712 100644 --- a/module/language/cps/types.scm +++ b/module/language/cps/types.scm @@ -1512,13 +1512,16 @@ where (A0 <= A <= A1) and (B0 <= B <= B1)." (define-type-inferrer (sqrt x result) (let ((type (&type x))) (cond - ((and (zero? (logand type &complex)) (<= 0 (&min x))) + ((and (zero? (logand type &complex)) + (non-negative? (&min x))) (define! result (logior type &flonum) - (inexact->exact (floor (sqrt (&min x)))) + (exact-integer-sqrt (&min x)) (if (inf? (&max x)) +inf.0 - (inexact->exact (ceiling (sqrt (&max x))))))) + (call-with-values (lambda () (exact-integer-sqrt (&max x))) + (lambda (s r) + (if (zero? r) s (+ s 1))))))) (else (define! result (logior type &flonum &complex) -inf.0 +inf.0)))))