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