1#include "libm.h" 2 3float sinhf(float x) { 4 union { 5 float f; 6 uint32_t i; 7 } u = {.f = x}; 8 uint32_t w; 9 float t, h, absx; 10 11 h = 0.5; 12 if (u.i >> 31) 13 h = -h; 14 /* |x| */ 15 u.i &= 0x7fffffff; 16 absx = u.f; 17 w = u.i; 18 19 /* |x| < log(FLT_MAX) */ 20 if (w < 0x42b17217) { 21 t = expm1f(absx); 22 if (w < 0x3f800000) { 23 if (w < 0x3f800000 - (12 << 23)) 24 return x; 25 return h * (2 * t - t * t / (t + 1)); 26 } 27 return h * (t + t / (t + 1)); 28 } 29 30 /* |x| > logf(FLT_MAX) or nan */ 31 t = 2 * h * __expo2f(absx); 32 return t; 33} 34