improve asin acos on +inf.0 and -inf.0

Avoid tripping into +nan.0 by using 0 instead of 0.0
for the imaginary part of a real number and by using
`atan` with two arguments instead of one.

original commit: e3f499adfbcbe94726fe11869ca23176fa2c3b78
This commit is contained in:
Matthew Flatt 2019-06-28 15:34:21 -06:00
parent d31368fc09
commit 5f92ffa3c4
2 changed files with 10 additions and 2 deletions

View File

@ -2816,6 +2816,10 @@
(let ([x 0.5+1.5i]) (cfl~= (asin (sin x)) x))
(let ([x 0.5-1.5i]) (cfl~= (asin (sin x)) x))
(let ([z 2.2-1.1i]) (cfl~= (asin z) (/ (asinh (* +1.0i z)) +1.0i)))
(fl~= 1.5707963267948966 (real-part (asin +inf.0)))
(eqv? -inf.0 (imag-part (asin +inf.0)))
(fl~= -1.5707963267948966 (real-part (asin -inf.0)))
(eqv? +inf.0 (imag-part (asin -inf.0)))
)
(mat acos
@ -2834,6 +2838,8 @@
(* +1.0i (sqrt (/ (- 1 z) 2))))))
+1.0i)))
(let ([x 10+10.0i]) (cfl~= (+ (asin x) (acos x)) (/ pi 2)))
(fl~= 1.5707963267948966 (real-part (acos -inf.0i)))
(eqv? +inf.0 (imag-part (acos -inf.0i)))
)
(mat atan

View File

@ -468,7 +468,7 @@
[z+ (cflsqrt (cfl+ 1.0 z))])
(let ([a (cfl-real-part z-)] [b (cfl-imag-part z-)]
[c (cfl-real-part z+)] [d (cfl-imag-part z+)])
(fl-make-rectangular (fl* 2.0 ($flatan (fl/ a c)))
(fl-make-rectangular (fl* 2.0 (flatan2 a c))
(flasinh (fl- (fl* b c) (fl* a d))))))))
(define cflasin
@ -484,7 +484,9 @@
(let ([a (cfl-real-part z-)] [b (cfl-imag-part z-)]
[c (cfl-real-part z+)] [d (cfl-imag-part z+)])
(fl-make-rectangular
($flatan (fl/ (cfl-real-part z) (fl- (fl* a c) (fl* b d))))
(flatan2 (cfl-real-part z) (if (flonum? z)
0.0
(fl- (fl* a c) (fl* b d))))
(flasinh (fl- (fl* a d) (fl* b c))))))))
(define cflasinh