roundf.c 414 B

123456789101112131415161718192021222324252627
  1. #include "libm.h"
  2. float roundf(float x)
  3. {
  4. union {float f; uint32_t i;} u = {x};
  5. int e = u.i >> 23 & 0xff;
  6. float_t y;
  7. if (e >= 0x7f+23)
  8. return x;
  9. if (u.i >> 31)
  10. x = -x;
  11. if (e < 0x7f-1) {
  12. FORCE_EVAL(x + 0x1p23f);
  13. return 0*u.f;
  14. }
  15. y = (float)(x + 0x1p23f) - 0x1p23f - x;
  16. if (y > 0.5f)
  17. y = y + x - 1;
  18. else if (y <= -0.5f)
  19. y = y + x + 1;
  20. else
  21. y = y + x;
  22. if (u.i >> 31)
  23. y = -y;
  24. return y;
  25. }