• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "libm.h"
2 
3 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
sinhl(long double x)4 long double sinhl(long double x)
5 {
6 	return sinh(x);
7 }
8 #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
sinhl(long double x)9 long double sinhl(long double x)
10 {
11 	union ldshape u = {x};
12 	unsigned ex = u.i.se & 0x7fff;
13 	long double h, t, absx;
14 
15 	h = 0.5;
16 	if (u.i.se & 0x8000)
17 		h = -h;
18 	/* |x| */
19 	u.i.se = ex;
20 	absx = u.f;
21 
22 	/* |x| < log(LDBL_MAX) */
23 	if (ex < 0x3fff+13 || (ex == 0x3fff+13 && u.i.m>>32 < 0xb17217f7)) {
24 		t = expm1l(absx);
25 		if (ex < 0x3fff) {
26 			if (ex < 0x3fff-32)
27 				return x;
28 			return h*(2*t - t*t/(1+t));
29 		}
30 		return h*(t + t/(t+1));
31 	}
32 
33 	/* |x| > log(LDBL_MAX) or nan */
34 	t = expl(0.5*absx);
35 	return h*t*t;
36 }
37 #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
38 // TODO: broken implementation to make things compile
sinhl(long double x)39 long double sinhl(long double x)
40 {
41 	return sinh(x);
42 }
43 #endif
44