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)14 float 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