math: fix __fpclassifyl(-0.0) for IEEE binary128
[oweals/musl.git] / src / math / ceilf.c
1 #include "libm.h"
2
3 float ceilf(float x)
4 {
5         union {float f; uint32_t i;} u = {x};
6         int e = (int)(u.i >> 23 & 0xff) - 0x7f;
7         uint32_t m;
8
9         if (e >= 23)
10                 return x;
11         if (e >= 0) {
12                 m = 0x007fffff >> e;
13                 if ((u.i & m) == 0)
14                         return x;
15                 FORCE_EVAL(x + 0x1p120f);
16                 if (u.i >> 31 == 0)
17                         u.i += m;
18                 u.i &= ~m;
19         } else {
20                 FORCE_EVAL(x + 0x1p120f);
21                 if (u.i >> 31)
22                         u.f = -0.0;
23                 else if (u.i << 1)
24                         u.f = 1.0;
25         }
26         return u.f;
27 }