Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
 
4
/*
5
 * floating-point mod function without infinity or NaN checking
6
 */
7
double
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
}