xref: /plan9/sys/src/libc/port/fmod.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
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)8 fmod (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