xref: /aosp_15_r20/external/musl/src/math/sinhf.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libm.h"
2*c9945492SAndroid Build Coastguard Worker 
sinhf(float x)3*c9945492SAndroid Build Coastguard Worker float sinhf(float x)
4*c9945492SAndroid Build Coastguard Worker {
5*c9945492SAndroid Build Coastguard Worker 	union {float f; uint32_t i;} u = {.f = x};
6*c9945492SAndroid Build Coastguard Worker 	uint32_t w;
7*c9945492SAndroid Build Coastguard Worker 	float t, h, absx;
8*c9945492SAndroid Build Coastguard Worker 
9*c9945492SAndroid Build Coastguard Worker 	h = 0.5;
10*c9945492SAndroid Build Coastguard Worker 	if (u.i >> 31)
11*c9945492SAndroid Build Coastguard Worker 		h = -h;
12*c9945492SAndroid Build Coastguard Worker 	/* |x| */
13*c9945492SAndroid Build Coastguard Worker 	u.i &= 0x7fffffff;
14*c9945492SAndroid Build Coastguard Worker 	absx = u.f;
15*c9945492SAndroid Build Coastguard Worker 	w = u.i;
16*c9945492SAndroid Build Coastguard Worker 
17*c9945492SAndroid Build Coastguard Worker 	/* |x| < log(FLT_MAX) */
18*c9945492SAndroid Build Coastguard Worker 	if (w < 0x42b17217) {
19*c9945492SAndroid Build Coastguard Worker 		t = expm1f(absx);
20*c9945492SAndroid Build Coastguard Worker 		if (w < 0x3f800000) {
21*c9945492SAndroid Build Coastguard Worker 			if (w < 0x3f800000 - (12<<23))
22*c9945492SAndroid Build Coastguard Worker 				return x;
23*c9945492SAndroid Build Coastguard Worker 			return h*(2*t - t*t/(t+1));
24*c9945492SAndroid Build Coastguard Worker 		}
25*c9945492SAndroid Build Coastguard Worker 		return h*(t + t/(t+1));
26*c9945492SAndroid Build Coastguard Worker 	}
27*c9945492SAndroid Build Coastguard Worker 
28*c9945492SAndroid Build Coastguard Worker 	/* |x| > logf(FLT_MAX) or nan */
29*c9945492SAndroid Build Coastguard Worker 	t = __expo2f(absx, 2*h);
30*c9945492SAndroid Build Coastguard Worker 	return t;
31*c9945492SAndroid Build Coastguard Worker }
32