4 #include "base/cl_sysdep.h"
12 #include "float/transcendental/cl_F_tran.h"
13 #include "float/cl_F.h"
14 #include "cln/lfloat.h"
15 #include "float/lfloat/cl_LF.h"
19 const cl_F sinh (const cl_F& x)
22 // Genauigkeit erhöhen,
23 // e := Exponent aus (decode-float x)
24 // falls e<0: (sinh(x)/x)^2 errechnen, Wurzel ziehen, mit x multiplizieren.
25 // falls e>=0: y:=exp(x) errechnen, (scale-float (- y (/ y)) -1) bilden.
27 if (float_exponent(x) < 0) { // Exponent e abtesten
29 // Rechengenauigkeit erhöhen
33 if (TheLfloat(x)->len >= infty) {
34 var cl_LF xx = extend(x,TheLfloat(x)->len+1);
35 var cl_LF_cosh_sinh_t hyp = cl_coshsinh_ratseries(xx);
36 return cl_float(hyp.sinh,x);
39 if ((TheLfloat(x)->len >= 500)
40 && (float_exponent(x) > (-(sintC)float_digits(x))>>1)) {
41 // verwende exp(x), schneller als cl_coshsinh_ratseries
42 // (aber nur bei 0 > e > -d/2, denn wir müssen, um
43 // Auslöschung zu verhindern, |e| Bits dazunehmen)
44 var cl_LF xx = extend(x,TheLfloat(x)->len+ceiling((uintE)(-float_exponent(x)),intDsize));
46 var cl_F z = scale_float(y - recip(y), -1); // (/ (- y (/ y)) 2)
49 var cl_LF xx = The(cl_LF)(cl_F_extendsqrt(x));
50 // Wurzel aus sinh(x)^2 bilden
51 var cl_LF z = sqrt(sinhx_naive(xx));
57 var cl_F xx = cl_F_extendsqrt(x);
58 // Wurzel aus (sinh(x)/x)^2 mit x multiplizieren und wieder runden
59 return cl_float(sqrt(sinhxbyx_naive(xx))*xx,x);
62 // e>=0 -> verwende exp(x)
64 return scale_float(y - recip(y), -1); // (/ (- y (/ y)) 2)
68 // Timings of the two algorithms, on an i486 33 MHz, running Linux,
69 // applied to x = sqrt(2)-1 = 0.414...
79 // ==> ratseries faster for N >= 1300.