xref: /haiku/src/system/libroot/posix/musl/math/coshl.c (revision 21258e2674226d6aa732321b6f8494841895af5f)
1 #include "libm.h"
2 
3 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
4 long double coshl(long double x)
5 {
6 	return cosh(x);
7 }
8 #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
9 long double coshl(long double x)
10 {
11 	union ldshape u = {x};
12 	unsigned ex = u.i.se & 0x7fff;
13 	uint32_t w;
14 	long double t;
15 
16 	/* |x| */
17 	u.i.se = ex;
18 	x = u.f;
19 	w = u.i.m >> 32;
20 
21 	/* |x| < log(2) */
22 	if (ex < 0x3fff-1 || (ex == 0x3fff-1 && w < 0xb17217f7)) {
23 		if (ex < 0x3fff-32) {
24 			FORCE_EVAL(x + 0x1p120f);
25 			return 1;
26 		}
27 		t = expm1l(x);
28 		return 1 + t*t/(2*(1+t));
29 	}
30 
31 	/* |x| < log(LDBL_MAX) */
32 	if (ex < 0x3fff+13 || (ex == 0x3fff+13 && w < 0xb17217f7)) {
33 		t = expl(x);
34 		return 0.5*(t + 1/t);
35 	}
36 
37 	/* |x| > log(LDBL_MAX) or nan */
38 	t = expl(0.5*x);
39 	return 0.5*t*t;
40 }
41 #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
42 // TODO: broken implementation to make things compile
43 long double coshl(long double x)
44 {
45 	return cosh(x);
46 }
47 #endif
48