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)))))
 

Reply via email to