1 #include "libm.h" 2 3 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 sinhl(long double x)4long 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)9long 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)39long double sinhl(long double x) 40 { 41 return sinh(x); 42 } 43 #endif 44