# [Git][cmucl/cmucl][rtoy-issue-78-unneded-code-code-in-complex-acos] Derive the values on the branch cuts for atanh

Raymond Toy gitlab at common-lisp.net
Sun May 24 15:10:48 UTC 2020

Raymond Toy pushed to branch rtoy-issue-78-unneded-code-code-in-complex-acos at cmucl / cmucl

Commits:
fe15b0a3 by Raymond Toy at 2020-05-24T08:10:39-07:00
Derive the values on the branch cuts for atanh

Conclusion:  atanh is continuous with quadrant Iv for x > 1 and
quadrant II for x < -1.  This, of course, is consistent with Kahan's
coutner-clowkwise continuity principla.

- - - - -

1 changed file:

- src/code/irrat.lisp

Changes:

=====================================
src/code/irrat.lisp
=====================================
@@ -1449,7 +1449,44 @@ Z may be any number, but the result is always a complex."
;; +infinity, but the following code returns approx 176 + i*pi/4. The
;; reason for the imaginary part is caused by the fact that arg i*y is
;; never 0 since we have positive and negative zeroes.
-
+;;
+;; The branch cut for atanh is on the real axis for x < -1 and x > 1.
+;; Let's derive the values on the branch cut.
+;;
+;; atanh(z) = 1/2*(log(1+z)-log(1-z))
+;;
+;; For z = x, x > 1:
+;;   atanh(x) = 1/2*(log(1+x) - log(1-x))
+;;            = 1/2*(log(1+x) - [log(x-1) + i*arg(1-x))
+;;            = 1/2*(log(1+x) - (log(x-1) + i*pi))
+;;            = 1/2*(log(1+x) - log(x-1) _ i*pi)
+;;            = 1/2*log((1+x)/(x-1)) - i*pi/2
+;;
+;; For z = -x, x > 1
+;;   atanh(x) = 1/2*(log(1-x) - log(1+x))
+;;            = 1/2*((log(x-1) + i*arg(1-x)) - log(1+x))
+;;            = 1/2*((log(x-1) + i*pi) - log(1+x))
+;;            = 1/2*(log((x-1)/(x+1)) + i*pi)
+;;            = 1/2*log((x-1)/(x+1)) + i*pi/2
+;;
+;; For z = x - i0, x > 1
+;;  atanh(z) = 1/2*(log(1+x - i0) - log(1-x+i0))
+;;           = 1/2*(log(1+x) + i*arg(1+x,-0) - (log(x-1) + i*arg(1-x, +0)))
+;;           = 1/2*(log(1+x) - i*0 - (log(x-1) + i*pi))
+;;           = 1/2*(log(1+x) - log(x-1) - i*pi)
+;;           = 1/2*log((1+x)/(x-1)) - i*pi/2
+;;
+;; This is the same answer we get for atanh(x), x > 1.  Hence, atanh
+;; is continuous with quadrant IV along the branch cut x > 1.
+;;
+;; Similary, for z = -x + i0, x > 1:
+;;  atanh(z) = 1/2*(log(1-x + i0) - log(1+x-i0))
+;;           = 1/2*((log(x-1) + i*arg(1-x, +0)) - (log(1+x)+i*arg(1+x, -0)))
+;;           = 1/2*(log(x-1) + i*pi - (log(1+x) - i0))
+;;           = 1/2*(log(x-1) - log(1+x) + i*pi)
+;;           = 1/2*log((x-1)/(x+1)) + i*pi/2
+;; This is same answer as atanh(x), x < -1.  Thus, atanh is continuous
+;; with quadrant II on the branch cut for x < -1
(defun complex-atanh (z)
"Compute atanh z = (log(1+z) - log(1-z))/2"
(declare (number z))

View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/fe15b0a31119288135a67ab0a26f65b48e704fe8

--
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/fe15b0a31119288135a67ab0a26f65b48e704fe8
You're receiving this email because of your account on gitlab.common-lisp.net.

-------------- next part --------------
An HTML attachment was scrubbed...