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