1 #include <float.h> 2 #include <math.h> 3 #include <stdint.h> 4 5 #if FLT_EVAL_METHOD == 0 6 #define EPS FLT_EPSILON 7 #elif FLT_EVAL_METHOD == 1 8 #define EPS DBL_EPSILON 9 #elif FLT_EVAL_METHOD == 2 10 #define EPS LDBL_EPSILON 11 #endif 12 static const float_t toint = 1 / EPS; 13 rintf(float x)14float rintf(float x) { 15 union { 16 float f; 17 uint32_t i; 18 } u = {x}; 19 int e = u.i >> 23 & 0xff; 20 int s = u.i >> 31; 21 float_t y; 22 23 if (e >= 0x7f + 23) 24 return x; 25 if (s) 26 y = x - toint + toint; 27 else 28 y = x + toint - toint; 29 if (y == 0) 30 return s ? -0.0f : 0.0f; 31 return y; 32 } 33