Fix edge cases in ANGLE.
authorTaylor R Campbell <campbell@mumble.net>
Tue, 20 Aug 2019 03:03:25 +0000 (03:03 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Tue, 20 Aug 2019 04:17:07 +0000 (04:17 +0000)
src/relnotes/bug-anglezero [new file with mode: 0644]
src/runtime/arith.scm
tests/runtime/test-arith.scm

diff --git a/src/relnotes/bug-anglezero b/src/relnotes/bug-anglezero
new file mode 100644 (file)
index 0000000..b92270c
--- /dev/null
@@ -0,0 +1 @@
+Bug fix: (angle z) now correctly handles edge cases with signed zero.
index 42c616a17e5572aa98d16df9ab597f036d514430..2c0fb5187ad7493760d865a486292ca55130f7a9 100644 (file)
@@ -1972,11 +1972,12 @@ USA.
 \f
 (define (complex:angle z)
   (cond ((recnum? z)
-        (if (and (real:zero? (rec:real-part z))
+        (if (and (complex:exact? z)
+                 (real:zero? (rec:real-part z))
                  (real:zero? (rec:imag-part z)))
-            (real:0 (complex:exact? z))
+            0
             (real:atan2 (rec:imag-part z) (rec:real-part z))))
-       ((real:negative? z) rec:pi)
+       ((real:sign-negative? z) rec:pi)
        (else (real:0 (real:exact? z)))))
 
 (define (complex:magnitude z)
index 2af91e59566f7691cc6f17d64345f7ead4647508..61bb26dd078abde81baaca6e2ed8c17b2c4d2896 100644 (file)
@@ -741,9 +741,9 @@ USA.
    (list 0 0)
    (list 0. 0.)
    (list +0.i 0.)
-   (list -0.i -0. expect-failure)
+   (list -0.i -0.)
    (list +0.+0.i 0.)
-   (list +0.-0.i -0. expect-failure)
+   (list +0.-0.i -0.)
    ;; angle(+inf +/- y i) = +/- 0 for finite y
    (list +inf.0 0.)   ;XXX Why not exact, if imag-part is exact 0?
    (list +inf.0+0.i 0.)
@@ -774,9 +774,9 @@ USA.
    (list -inf.0+i pi)
    (list -inf.0-i (- pi))
    ;; angle(-0 +/- 0i) = +/- pi
-   (list -0. pi expect-failure)
-   (list -0.+0.i pi expect-failure)
-   (list -0.-0.i (- pi) expect-failure))
+   (list -0. pi)
+   (list -0.+0.i pi)
+   (list -0.-0.i (- pi)))
   (lambda (z t #!optional xfail)
     (with-expected-failure xfail
       (lambda ()