1#include "libm.h" 2 3float ceilf(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 == 0) 19 u.i += m; 20 u.i &= ~m; 21 } else { 22 FORCE_EVAL(x + 0x1p120f); 23 if (u.i >> 31) 24 u.f = -0.0; 25 else if (u.i << 1) 26 u.f = 1.0; 27 } 28 return u.f; 29} 30