7 #include "cl_complex.h"
15 #include "cl_rational.h"
19 inline const cl_F cl_pi (const cl_R& v)
29 const cl_N acos (const cl_N& z)
32 // Wert und Branch Cuts nach der Formel CLTL2, S. 312:
33 // arccos(z) = log(z+i*sqrt(1-z^2))/i = pi/2 - arcsin(z)
37 // Bei x=1: Ergebnis 0.
38 // Bei x=1/2: Ergebnis pi/3.
39 // Bei x=0: Ergebnis pi/2.
40 // Bei x=-1/2: Ergebnis 2pi/3.
41 // Bei x=-1: Ergebnis pi.
42 // Sonst x in Float umwandeln.
43 // Falls x>1: Ergebnis i ln(x+sqrt(x^2-1)).
44 // Sonst errechne u+iv = arsinh(-y+ix) wie oben, Ergebnis (pi/2-v)+iu.
50 var const cl_R& x = z;
58 if (eq(x,0)) // x=0 -> Ergebnis pi/2
59 return scale_float(cl_pi(),-1);
60 if (eq(x,1)) // x=1 -> Ergebnis 0
62 if (eq(x,-1)) // x=-1 -> Ergebnis pi
68 if (eq(denominator(x),2)) { // Nenner = 2 ?
69 if (eq(numerator(x),1)) // x=1/2 -> Ergebnis pi/3
71 if (eq(numerator(x),-1)) // x=-1/2 -> Ergebnis 2pi/3
72 return scale_float(cl_pi(),1)/3;
84 return complex_C(0,ln(x+sqrt(square(x)-1)));
88 u_v = asinh(-imagpart(z),realpart(z));
90 var cl_R& u = u_v.realpart;
91 var cl_R& v = u_v.imagpart;
92 var cl_F pi = cl_pi(v); // pi im Float-Format von v
93 return complex(scale_float(pi,-1)-v,u); // (pi/2-v)+iu