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