1 #include "libm.h"
2 
floorf(float x)3 float floorf(float x) {
4     union {
5         float f;
6         uint32_t i;
7     } u = {x};
8     int e = (int)(u.i >> 23 & 0xff) - 0x7f;
9     uint32_t m;
10 
11     if (e >= 23)
12         return x;
13     if (e >= 0) {
14         m = 0x007fffff >> e;
15         if ((u.i & m) == 0)
16             return x;
17         FORCE_EVAL(x + 0x1p120f);
18         if (u.i >> 31)
19             u.i += m;
20         u.i &= ~m;
21     } else {
22         FORCE_EVAL(x + 0x1p120f);
23         if (u.i >> 31 == 0)
24             u.i = 0;
25         else if (u.i << 1)
26             u.f = -1.0;
27     }
28     return u.f;
29 }
30