xref: /aosp_15_r20/external/musl/src/math/asinhf.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libm.h"
2*c9945492SAndroid Build Coastguard Worker 
3*c9945492SAndroid Build Coastguard Worker /* asinh(x) = sign(x)*log(|x|+sqrt(x*x+1)) ~= x - x^3/6 + o(x^5) */
asinhf(float x)4*c9945492SAndroid Build Coastguard Worker float asinhf(float x)
5*c9945492SAndroid Build Coastguard Worker {
6*c9945492SAndroid Build Coastguard Worker 	union {float f; uint32_t i;} u = {.f = x};
7*c9945492SAndroid Build Coastguard Worker 	uint32_t i = u.i & 0x7fffffff;
8*c9945492SAndroid Build Coastguard Worker 	unsigned s = u.i >> 31;
9*c9945492SAndroid Build Coastguard Worker 
10*c9945492SAndroid Build Coastguard Worker 	/* |x| */
11*c9945492SAndroid Build Coastguard Worker 	u.i = i;
12*c9945492SAndroid Build Coastguard Worker 	x = u.f;
13*c9945492SAndroid Build Coastguard Worker 
14*c9945492SAndroid Build Coastguard Worker 	if (i >= 0x3f800000 + (12<<23)) {
15*c9945492SAndroid Build Coastguard Worker 		/* |x| >= 0x1p12 or inf or nan */
16*c9945492SAndroid Build Coastguard Worker 		x = logf(x) + 0.693147180559945309417232121458176568f;
17*c9945492SAndroid Build Coastguard Worker 	} else if (i >= 0x3f800000 + (1<<23)) {
18*c9945492SAndroid Build Coastguard Worker 		/* |x| >= 2 */
19*c9945492SAndroid Build Coastguard Worker 		x = logf(2*x + 1/(sqrtf(x*x+1)+x));
20*c9945492SAndroid Build Coastguard Worker 	} else if (i >= 0x3f800000 - (12<<23)) {
21*c9945492SAndroid Build Coastguard Worker 		/* |x| >= 0x1p-12, up to 1.6ulp error in [0.125,0.5] */
22*c9945492SAndroid Build Coastguard Worker 		x = log1pf(x + x*x/(sqrtf(x*x+1)+1));
23*c9945492SAndroid Build Coastguard Worker 	} else {
24*c9945492SAndroid Build Coastguard Worker 		/* |x| < 0x1p-12, raise inexact if x!=0 */
25*c9945492SAndroid Build Coastguard Worker 		FORCE_EVAL(x + 0x1p120f);
26*c9945492SAndroid Build Coastguard Worker 	}
27*c9945492SAndroid Build Coastguard Worker 	return s ? -x : x;
28*c9945492SAndroid Build Coastguard Worker }
29