148129Syokota#include "libm.h" 248129Syokota 348129Syokota#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 448129Syokotalong double sinhl(long double x) 548129Syokota{ 660107Sobrien return sinh(x); 760107Sobrien} 8270229Sse#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 948129Syokotalong double sinhl(long double x) 1048129Syokota{ 1148129Syokota union ldshape u = {x}; 1248129Syokota unsigned ex = u.i.se & 0x7fff; 1348129Syokota long double h, t, absx; 1448129Syokota 1548129Syokota h = 0.5; 1648129Syokota if (u.i.se & 0x8000) 1748129Syokota h = -h; 1848129Syokota /* |x| */ 1948129Syokota u.i.se = ex; 2048129Syokota absx = u.f; 2148129Syokota 2248129Syokota /* |x| < log(LDBL_MAX) */ 2348129Syokota if (ex < 0x3fff+13 || (ex == 0x3fff+13 && u.i.m>>32 < 0xb17217f7)) { 2448129Syokota t = expm1l(absx); 2548129Syokota if (ex < 0x3fff) { 2648129Syokota if (ex < 0x3fff-32) 2748129Syokota return x; 2848129Syokota return h*(2*t - t*t/(1+t)); 29270114Sse } 3048129Syokota return h*(t + t/(t+1)); 31270114Sse } 32270114Sse 33270114Sse /* |x| > log(LDBL_MAX) or nan */ 34270114Sse t = expl(0.5*absx); 35270114Sse return h*t*t; 36270114Sse} 37270114Sse#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 38270114Sse// TODO: broken implementation to make things compile 39270114Sselong double sinhl(long double x) 40270114Sse{ 41270114Sse return sinh(x); 42270114Sse} 43270114Sse#endif 44270114Sse