fmod.c 428 B

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