roundl.c 709 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include "libm.h"
  2. #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
  3. long double roundl(long double x)
  4. {
  5. return round(x);
  6. }
  7. #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
  8. #if LDBL_MANT_DIG == 64
  9. #define TOINT 0x1p63
  10. #elif LDBL_MANT_DIG == 113
  11. #define TOINT 0x1p112
  12. #endif
  13. long double roundl(long double x)
  14. {
  15. union ldshape u = {x};
  16. int e = u.i.se & 0x7fff;
  17. long double y;
  18. if (e >= 0x3fff+LDBL_MANT_DIG-1)
  19. return x;
  20. if (u.i.se >> 15)
  21. x = -x;
  22. if (e < 0x3fff-1) {
  23. FORCE_EVAL(x + TOINT);
  24. return 0*u.f;
  25. }
  26. y = x + TOINT - TOINT - x;
  27. if (y > 0.5)
  28. y = y + x - 1;
  29. else if (y <= -0.5)
  30. y = y + x + 1;
  31. else
  32. y = y + x;
  33. if (u.i.se >> 15)
  34. y = -y;
  35. return y;
  36. }
  37. #endif