1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-09 21:40:33 +02:00

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'.
This commit is contained in:
Mark H Weaver 2018-05-27 22:04:27 -04:00 committed by Andy Wingo
parent c6f6edcc50
commit fe92bc26a6

View file

@ -1668,13 +1668,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)))))