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