4 #include "base/cl_sysdep.h"
7 #include "cln/complex.h"
12 #include "complex/cl_C.h"
14 #include "real/cl_R.h"
15 #include "cln/rational.h"
16 #include "rational/cl_RA.h"
17 #include "cln/float.h"
21 inline const cl_F pi (const cl_R& v)
31 const cl_N acos (const cl_N& z)
34 // Wert und Branch Cuts nach der Formel CLTL2, S. 312:
35 // arccos(z) = log(z+i*sqrt(1-z^2))/i = pi/2 - arcsin(z)
39 // Bei x=1: Ergebnis 0.
40 // Bei x=1/2: Ergebnis pi/3.
41 // Bei x=0: Ergebnis pi/2.
42 // Bei x=-1/2: Ergebnis 2pi/3.
43 // Bei x=-1: Ergebnis pi.
44 // Sonst x in Float umwandeln.
45 // Falls x>1: Ergebnis i ln(x+sqrt(x^2-1)).
46 // Sonst errechne u+iv = arsinh(-y+ix) wie oben, Ergebnis (pi/2-v)+iu.
52 var const cl_R& x = z;
60 if (eq(x,0)) // x=0 -> Ergebnis pi/2
61 return scale_float(pi(),-1);
62 if (eq(x,1)) // x=1 -> Ergebnis 0
64 if (eq(x,-1)) // x=-1 -> Ergebnis pi
70 if (eq(denominator(x),2)) { // Nenner = 2 ?
71 if (eq(numerator(x),1)) // x=1/2 -> Ergebnis pi/3
73 if (eq(numerator(x),-1)) // x=-1/2 -> Ergebnis 2pi/3
74 return scale_float(pi(),1)/3;
86 return complex_C(0,ln(x+sqrt(square(x)-1)));
90 u_v = asinh(-imagpart(z),realpart(z));
92 var cl_R& u = u_v.realpart;
93 var cl_R& v = u_v.imagpart;
94 var cl_F archimedes = pi(v); // pi im Float-Format von v
95 return complex(scale_float(archimedes,-1)-v,u); // (pi/2-v)+iu