modff.c 542 B

12345678910111213141516171819202122232425262728293031323334
  1. #include "libm.h"
  2. float modff(float x, float *iptr)
  3. {
  4. union {float f; uint32_t i;} u = {x};
  5. uint32_t mask;
  6. int e = (int)(u.i>>23 & 0xff) - 0x7f;
  7. /* no fractional part */
  8. if (e >= 23) {
  9. *iptr = x;
  10. if (e == 0x80 && u.i<<9 != 0) { /* nan */
  11. return x;
  12. }
  13. u.i &= 0x80000000;
  14. return u.f;
  15. }
  16. /* no integral part */
  17. if (e < 0) {
  18. u.i &= 0x80000000;
  19. *iptr = u.f;
  20. return x;
  21. }
  22. mask = 0x007fffff>>e;
  23. if ((u.i & mask) == 0) {
  24. *iptr = x;
  25. u.i &= 0x80000000;
  26. return u.f;
  27. }
  28. u.i &= ~mask;
  29. *iptr = u.f;
  30. return x - u.f;
  31. }