| #include "libm.h" | 
 |  | 
 | #if FLT_EVAL_METHOD == 0 | 
 | #define EPS FLT_EPSILON | 
 | #elif FLT_EVAL_METHOD == 1 | 
 | #define EPS DBL_EPSILON | 
 | #elif FLT_EVAL_METHOD == 2 | 
 | #define EPS LDBL_EPSILON | 
 | #endif | 
 | static const float_t toint = 1 / EPS; | 
 |  | 
 | float roundf(float x) { | 
 |     union { | 
 |         float f; | 
 |         uint32_t i; | 
 |     } u = {x}; | 
 |     int e = u.i >> 23 & 0xff; | 
 |     float_t y; | 
 |  | 
 |     if (e >= 0x7f + 23) | 
 |         return x; | 
 |     if (u.i >> 31) | 
 |         x = -x; | 
 |     if (e < 0x7f - 1) { | 
 |         FORCE_EVAL(x + toint); | 
 |         return 0 * u.f; | 
 |     } | 
 |     y = x + toint - toint - x; | 
 |     if (y > 0.5f) | 
 |         y = y + x - 1; | 
 |     else if (y <= -0.5f) | 
 |         y = y + x + 1; | 
 |     else | 
 |         y = y + x; | 
 |     if (u.i >> 31) | 
 |         y = -y; | 
 |     return y; | 
 | } |