| OLD | NEW |
| 1 #include "libm.h" | 1 #include "libm.h" |
| 2 | 2 |
| 3 #if FLT_EVAL_METHOD==0 | 3 #if FLT_EVAL_METHOD == 0 |
| 4 #define EPS FLT_EPSILON | 4 #define EPS FLT_EPSILON |
| 5 #elif FLT_EVAL_METHOD==1 | 5 #elif FLT_EVAL_METHOD == 1 |
| 6 #define EPS DBL_EPSILON | 6 #define EPS DBL_EPSILON |
| 7 #elif FLT_EVAL_METHOD==2 | 7 #elif FLT_EVAL_METHOD == 2 |
| 8 #define EPS LDBL_EPSILON | 8 #define EPS LDBL_EPSILON |
| 9 #endif | 9 #endif |
| 10 static const float_t toint = 1/EPS; | 10 static const float_t toint = 1 / EPS; |
| 11 | 11 |
| 12 float roundf(float x) | 12 float roundf(float x) { |
| 13 { | 13 union { |
| 14 » union {float f; uint32_t i;} u = {x}; | 14 float f; |
| 15 » int e = u.i >> 23 & 0xff; | 15 uint32_t i; |
| 16 » float_t y; | 16 } u = {x}; |
| 17 int e = u.i >> 23 & 0xff; |
| 18 float_t y; |
| 17 | 19 |
| 18 » if (e >= 0x7f+23) | 20 if (e >= 0x7f + 23) |
| 19 » » return x; | 21 return x; |
| 20 » if (u.i >> 31) | 22 if (u.i >> 31) |
| 21 » » x = -x; | 23 x = -x; |
| 22 » if (e < 0x7f-1) { | 24 if (e < 0x7f - 1) { |
| 23 » » FORCE_EVAL(x + toint); | 25 FORCE_EVAL(x + toint); |
| 24 » » return 0*u.f; | 26 return 0 * u.f; |
| 25 » } | 27 } |
| 26 » y = x + toint - toint - x; | 28 y = x + toint - toint - x; |
| 27 » if (y > 0.5f) | 29 if (y > 0.5f) |
| 28 » » y = y + x - 1; | 30 y = y + x - 1; |
| 29 » else if (y <= -0.5f) | 31 else if (y <= -0.5f) |
| 30 » » y = y + x + 1; | 32 y = y + x + 1; |
| 31 » else | 33 else |
| 32 » » y = y + x; | 34 y = y + x; |
| 33 » if (u.i >> 31) | 35 if (u.i >> 31) |
| 34 » » y = -y; | 36 y = -y; |
| 35 » return y; | 37 return y; |
| 36 } | 38 } |
| OLD | NEW |