Use fabs(3) for C implementation of FLONUM-ABS.
authorTaylor R Campbell <campbell@mumble.net>
Thu, 29 Nov 2018 02:05:51 +0000 (02:05 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Fri, 30 Nov 2018 06:53:15 +0000 (06:53 +0000)
A conditional based on < doesn't handle NaN correctly.

src/microcode/flonum.c
src/relnotes/bug-floabs [new file with mode: 0644]
tests/runtime/test-flonum.scm

index 4b24e1d7eb088fd64f1e5d5ee4cfe1a258fd6fc2..d6330b9680bb4247ad73505b77d1e0324e047886 100644 (file)
@@ -103,7 +103,7 @@ DEFINE_PRIMITIVE ("FLONUM-ABS", Prim_flonum_abs, 1, 1, 0)
   PRIMITIVE_HEADER (1);
   {
     double x = (arg_flonum (1));
-    FLONUM_RESULT ((x < 0) ? (-x) : x);
+    FLONUM_RESULT (fabs (x));
   }
 }
 
diff --git a/src/relnotes/bug-floabs b/src/relnotes/bug-floabs
new file mode 100644 (file)
index 0000000..e10ab01
--- /dev/null
@@ -0,0 +1,2 @@
+Bug fix: abs now always correctly adjusts the sign of a NaN and never
+raises a floating-point exception, following IEEE 754-2008.
index c2ae9440006b7be4f1913780808ac3b840e6dc57..0ce0b0c9264ceea53dc1c5eb3258e6e8c5280c37 100644 (file)
@@ -625,35 +625,23 @@ USA.
       (assert-nan
        (no-traps (lambda () (flo:max-mag (flo:snan) (flo:snan))))))))
 
-(define expect-failure-interpreted
-  (if (and (compiled-procedure? (lambda (x) x))
-           (compiled-procedure? flo:abs))
-      #!default
-      expect-failure))
-
-(define expect-error-interpreted
-  (if (and (compiled-procedure? (lambda (x) x))
-           (compiled-procedure? flo:abs))
-      #!default
-      expect-error))
-
 (define-enumerated-test 'abs
   `((-inf.0)
     (-1.)
-    (-0. ,expect-failure-interpreted)
+    (-0.)
     (+0.)
     (+1.)
     (+inf.0)
-    (,(flo:make-nan #t #t 0) ,expect-failure-interpreted)
+    (,(flo:make-nan #t #t 0))
     (,(flo:make-nan #f #t 0))
-    (,(flo:make-nan #t #t 1) ,expect-failure-interpreted)
+    (,(flo:make-nan #t #t 1))
     (,(flo:make-nan #f #t 1))
-    (,(flo:make-nan #t #t (- (expt 2 51) 1)) ,expect-failure-interpreted)
+    (,(flo:make-nan #t #t (- (expt 2 51) 1)))
     (,(flo:make-nan #f #t (- (expt 2 51) 1)))
-    (,(flo:make-nan #t #f 1) ,expect-error-interpreted)
-    (,(flo:make-nan #f #f 1) ,expect-error-interpreted)
-    (,(flo:make-nan #t #f (- (expt 2 51) 1)) ,expect-error-interpreted)
-    (,(flo:make-nan #f #f (- (expt 2 51) 1)) ,expect-error-interpreted))
+    (,(flo:make-nan #t #f 1))
+    (,(flo:make-nan #f #f 1))
+    (,(flo:make-nan #t #f (- (expt 2 51) 1)))
+    (,(flo:make-nan #f #f (- (expt 2 51) 1))))
   (lambda (x #!optional xfail)
     (with-expected-failure xfail
       (lambda ()