3 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
4 long double asinhl(long double x
)
8 #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
9 /* asinh(x) = sign(x)*log(|x|+sqrt(x*x+1)) ~= x - x^3/6 + o(x^5) */
10 long double asinhl(long double x
)
12 union ldshape u
= {x
};
13 unsigned e
= u
.i
.se
& 0x7fff;
14 unsigned s
= u
.i
.se
>> 15;
20 if (e
>= 0x3fff + 32) {
21 /* |x| >= 0x1p32 or inf or nan */
22 x
= logl(x
) + 0.693147180559945309417232121458176568L;
23 } else if (e
>= 0x3fff + 1) {
25 x
= logl(2*x
+ 1/(sqrtl(x
*x
+1)+x
));
26 } else if (e
>= 0x3fff - 32) {
28 x
= log1pl(x
+ x
*x
/(sqrtl(x
*x
+1)+1));
30 /* |x| < 0x1p-32, raise inexact if x!=0 */
31 FORCE_EVAL(x
+ 0x1p
120f
);
35 #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
36 // TODO: broken implementation to make things compile
37 long double asinhl(long double x
)