xref: /aosp_15_r20/external/musl/src/math/asinhl.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libm.h"
2*c9945492SAndroid Build Coastguard Worker 
3*c9945492SAndroid Build Coastguard Worker #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
asinhl(long double x)4*c9945492SAndroid Build Coastguard Worker long double asinhl(long double x)
5*c9945492SAndroid Build Coastguard Worker {
6*c9945492SAndroid Build Coastguard Worker 	return asinh(x);
7*c9945492SAndroid Build Coastguard Worker }
8*c9945492SAndroid Build Coastguard Worker #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
9*c9945492SAndroid Build Coastguard Worker /* asinh(x) = sign(x)*log(|x|+sqrt(x*x+1)) ~= x - x^3/6 + o(x^5) */
asinhl(long double x)10*c9945492SAndroid Build Coastguard Worker long double asinhl(long double x)
11*c9945492SAndroid Build Coastguard Worker {
12*c9945492SAndroid Build Coastguard Worker 	union ldshape u = {x};
13*c9945492SAndroid Build Coastguard Worker 	unsigned e = u.i.se & 0x7fff;
14*c9945492SAndroid Build Coastguard Worker 	unsigned s = u.i.se >> 15;
15*c9945492SAndroid Build Coastguard Worker 
16*c9945492SAndroid Build Coastguard Worker 	/* |x| */
17*c9945492SAndroid Build Coastguard Worker 	u.i.se = e;
18*c9945492SAndroid Build Coastguard Worker 	x = u.f;
19*c9945492SAndroid Build Coastguard Worker 
20*c9945492SAndroid Build Coastguard Worker 	if (e >= 0x3fff + 32) {
21*c9945492SAndroid Build Coastguard Worker 		/* |x| >= 0x1p32 or inf or nan */
22*c9945492SAndroid Build Coastguard Worker 		x = logl(x) + 0.693147180559945309417232121458176568L;
23*c9945492SAndroid Build Coastguard Worker 	} else if (e >= 0x3fff + 1) {
24*c9945492SAndroid Build Coastguard Worker 		/* |x| >= 2 */
25*c9945492SAndroid Build Coastguard Worker 		x = logl(2*x + 1/(sqrtl(x*x+1)+x));
26*c9945492SAndroid Build Coastguard Worker 	} else if (e >= 0x3fff - 32) {
27*c9945492SAndroid Build Coastguard Worker 		/* |x| >= 0x1p-32 */
28*c9945492SAndroid Build Coastguard Worker 		x = log1pl(x + x*x/(sqrtl(x*x+1)+1));
29*c9945492SAndroid Build Coastguard Worker 	} else {
30*c9945492SAndroid Build Coastguard Worker 		/* |x| < 0x1p-32, raise inexact if x!=0 */
31*c9945492SAndroid Build Coastguard Worker 		FORCE_EVAL(x + 0x1p120f);
32*c9945492SAndroid Build Coastguard Worker 	}
33*c9945492SAndroid Build Coastguard Worker 	return s ? -x : x;
34*c9945492SAndroid Build Coastguard Worker }
35*c9945492SAndroid Build Coastguard Worker #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
36*c9945492SAndroid Build Coastguard Worker // TODO: broken implementation to make things compile
asinhl(long double x)37*c9945492SAndroid Build Coastguard Worker long double asinhl(long double x)
38*c9945492SAndroid Build Coastguard Worker {
39*c9945492SAndroid Build Coastguard Worker 	return asinh(x);
40*c9945492SAndroid Build Coastguard Worker }
41*c9945492SAndroid Build Coastguard Worker #endif
42