Invent complex:log1m to get correct branch cut in atan on exact inputs.
authorTaylor R Campbell <campbell@mumble.net>
Sun, 18 Nov 2018 05:34:23 +0000 (05:34 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Sun, 18 Nov 2018 06:11:43 +0000 (06:11 +0000)
Not going to export it for now without further thought, though.

src/runtime/arith.scm
tests/runtime/test-arith.scm

index ffbf8cb08b843bcbad28ac1504642b674bcd3278..b0a0a690afd07f82eaeab13bac8d4faed2a7282e 100644 (file)
@@ -1750,6 +1750,11 @@ USA.
       (complex:log (complex:+ z 1))    ;XXX
       ((copy real:log1p) z)))
 
+(define (complex:log1m z)
+  (if (and (real:real? z) (real:< 1 z))
+      (make-recnum (real:log (real:- z 1)) (real:negate rec:pi))
+      (complex:log1p (complex:negate z))))
+
 (define (complex:sin z)
   (if (recnum? z)
       (complex:/ (let ((iz (complex:+i* z)))
@@ -1839,8 +1844,8 @@ USA.
 
 (define (rec:atan z)
   (complex:/ (let ((iz (complex:+i* z)))
-              (complex:- (complex:log (complex:1+ iz))
-                         (complex:log (complex:- 1 iz))))
+              (complex:- (complex:log1p iz)
+                         (complex:log1m iz)))
             +2i))
 \f
 (define (complex:angle z)
index 7ee2b6371c19290f3dc26756ad952cdc94c5e5b2..852f956179d4e2d16e86e4ef273d32ab8f606739 100644 (file)
@@ -483,7 +483,7 @@ USA.
    (vector +2i +1.5707963267948966+.5493061443340549i)
    (vector +0.+2i +1.5707963267948966+.5493061443340549i)
    (vector -0.+2i -1.5707963267948966+.5493061443340549i)
-   (vector -2i +1.5707963267948966-.5493061443340549i 'xfail)
+   (vector -2i +1.5707963267948966-.5493061443340549i)
    (vector +0.-2i +1.5707963267948966-.5493061443340549i)
    (vector -0.-2i -1.5707963267948966-.5493061443340549i))
   (lambda (v)