xref: /haiku/src/system/libroot/posix/musl/math/coshf.c (revision 0fae96c5a349db3761ac2a4ab4a7fbbf23a3b76c)
1 #include "libm.h"
2 
3 float coshf(float x)
4 {
5 	union {float f; uint32_t i;} u = {.f = x};
6 	uint32_t w;
7 	float t;
8 
9 	/* |x| */
10 	u.i &= 0x7fffffff;
11 	x = u.f;
12 	w = u.i;
13 
14 	/* |x| < log(2) */
15 	if (w < 0x3f317217) {
16 		if (w < 0x3f800000 - (12<<23)) {
17 			FORCE_EVAL(x + 0x1p120f);
18 			return 1;
19 		}
20 		t = expm1f(x);
21 		return 1 + t*t/(2*(1+t));
22 	}
23 
24 	/* |x| < log(FLT_MAX) */
25 	if (w < 0x42b17217) {
26 		t = expf(x);
27 		return 0.5f*(t + 1/t);
28 	}
29 
30 	/* |x| > log(FLT_MAX) or nan */
31 	t = __expo2f(x);
32 	return t;
33 }
34