diff --git a/libguile/numbers.c b/libguile/numbers.c index 7bbdc56c0..63a6501dd 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -8906,7 +8906,8 @@ SCM_PRIMITIVE_GENERIC (scm_angle, "angle", 1, 0, 0, } else if (SCM_REALP (z)) { - if (SCM_REAL_VALUE (z) >= 0) + double x = SCM_REAL_VALUE (z); + if (x > 0.0 || double_is_non_negative_zero (x)) return flo0; else return scm_from_double (atan2 (0.0, -1.0)); diff --git a/test-suite/tests/numbers.test b/test-suite/tests/numbers.test index b1f3d8bc0..a6697c9a3 100644 --- a/test-suite/tests/numbers.test +++ b/test-suite/tests/numbers.test @@ -4241,7 +4241,7 @@ (with-test-prefix "angle" (define pi 3.14159265358979323846) (define (almost= x y) - (> 0.01 (magnitude (- x y)))) + (> 0.000001 (magnitude (- x y)))) (pass-if (documented? angle)) @@ -4252,7 +4252,10 @@ (pass-if "bignum -ve" (almost= pi (angle (1- fixnum-min)))) (pass-if "flonum +ve" (= 0 (angle 1.5))) - (pass-if "flonum -ve" (almost= pi (angle -1.5)))) + (pass-if "flonum -ve" (almost= pi (angle -1.5))) + + (pass-if "signed zero +ve" (= 0 (angle 0.0))) + (pass-if "signed zero -ve" (almost= pi (angle -0.0)))) ;;; ;;; inexact->exact