7 #include "cl_complex.h"
15 #include "cl_rational.h"
20 #define MAYBE_INLINE inline
21 #include "cl_F_from_R_def.cc"
23 const cl_N acosh (const cl_N& z)
26 // Wert und Branch Cuts nach der Formel CLTL2, S. 314:
27 // arcosh(z) = 2 log(sqrt((z+1)/2)+sqrt((z-1)/2))
31 // Bei x=1: Ergebnis 0.
32 // Bei x=1/2: Ergebnis pi/3 i.
33 // Bei x=0: Ergebnis pi/2 i.
34 // Bei x=-1/2: Ergebnis 2pi/3 i.
35 // Bei x=-1: Ergebnis pi i.
37 // x in Float umwandeln, Ergebnis log(sqrt(x^2-1)-x) + i pi.
38 // Sonst nach (!) mit u = sqrt((z+1)/2) und v = sqrt((z-1)/2) :
39 // arcosh(z) = 4 artanh(v/(u+1)) = 4 artanh(sqrt((z-1)/2)/(1+sqrt((z+1)/2)))
41 // Um für zwei Zahlen u,v mit u^2-v^2=1 und u,v beide in Bild(sqrt)
42 // (d.h. Realteil>0.0 oder Realteil=0.0 und Imaginärteil>=0.0)
43 // log(u+v) zu berechnen:
44 // log(u+v) = 2 artanh(v/(u+1)) (!)
45 // (Beweis: 2 artanh(v/(u+1)) = log(1+(v/(u+1))) - log(1-(v/(u+1)))
46 // = log((1+u+v)/(u+1)) - log((1+u-v)/(u+1)) == log((1+u+v)/(1+u-v))
47 // = log(u+v) mod 2 pi i, und beider Imaginärteil ist > -pi und <= pi.)
53 var const cl_R& x = z;
60 if (eq(x,0)) // x=0 -> Ergebnis pi/2 i
61 return complex_C(0,scale_float(cl_pi(),-1));
62 if (eq(x,1)) // x=1 -> Ergebnis 0
64 if (eq(x,-1)) // x=-1 -> Ergebnis pi i
65 return complex_C(0,cl_pi());
69 if (eq(denominator(x),2)) { // Nenner = 2 ?
70 if (eq(numerator(x),1)) // x=1/2 -> Ergebnis pi/3 i
71 return complex_C(0,cl_pi()/3);
72 if (eq(numerator(x),-1)) // x=-1/2 -> Ergebnis 2pi/3 i
73 return complex_C(0,scale_float(cl_pi(),1)/3);
79 var cl_F xf = cl_float(x);
82 // log(sqrt(x^2-1)-x), ein Float >=0, Imaginärteil pi
83 return complex_C(ln(sqrt(square(x)-1)-x),cl_pi());
86 return 4 * atanh( sqrt(minus1(z)/2) / plus1(sqrt(plus1(z)/2)) );