#include "libm.h" | |
float ceilf(float x) | |
{ | |
union {float f; uint32_t i;} u = {x}; | |
int e = (int)(u.i >> 23 & 0xff) - 0x7f; | |
uint32_t m; | |
if (e >= 23) | |
return x; | |
if (e >= 0) { | |
m = 0x007fffff >> e; | |
if ((u.i & m) == 0) | |
return x; | |
FORCE_EVAL(x + 0x1p120f); | |
if (u.i >> 31 == 0) | |
u.i += m; | |
u.i &= ~m; | |
} else { | |
FORCE_EVAL(x + 0x1p120f); | |
if (u.i >> 31) | |
u.f = -0.0; | |
else if (u.i << 1) | |
u.f = 1.0; | |
} | |
return u.f; | |
} |