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