fmod.c 439 B

12345678910111213141516171819202122232425262728293031
  1. #include <u.h>
  2. #include <libc.h>
  3. /*
  4. * floating-point mod function without infinity or NaN checking
  5. */
  6. double
  7. fmod (double x, double y)
  8. {
  9. int sign, yexp, rexp;
  10. double r, yfr, rfr;
  11. if (y == 0)
  12. return x;
  13. if (y < 0)
  14. y = -y;
  15. yfr = frexp(y, &yexp);
  16. sign = 0;
  17. if(x < 0) {
  18. r = -x;
  19. sign++;
  20. } else
  21. r = x;
  22. while(r >= y) {
  23. rfr = frexp(r, &rexp);
  24. r -= ldexp(y, rexp - yexp - (rfr < yfr));
  25. }
  26. if(sign)
  27. r = -r;
  28. return r;
  29. }