xref: /plan9/sys/src/libc/port/floor.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include <u.h>
2*3e12c5d1SDavid du Colombier #include <libc.h>
3*3e12c5d1SDavid du Colombier /*
4*3e12c5d1SDavid du Colombier  * floor and ceil-- greatest integer <= arg
5*3e12c5d1SDavid du Colombier  * (resp least >=)
6*3e12c5d1SDavid du Colombier  */
7*3e12c5d1SDavid du Colombier 
8*3e12c5d1SDavid du Colombier double
floor(double d)9*3e12c5d1SDavid du Colombier floor(double d)
10*3e12c5d1SDavid du Colombier {
11*3e12c5d1SDavid du Colombier 	double fract;
12*3e12c5d1SDavid du Colombier 
13*3e12c5d1SDavid du Colombier 	if(d < 0) {
14*3e12c5d1SDavid du Colombier 		fract = modf(-d, &d);
15*3e12c5d1SDavid du Colombier 		if(fract != 0.0)
16*3e12c5d1SDavid du Colombier 			d += 1;
17*3e12c5d1SDavid du Colombier 		d = -d;
18*3e12c5d1SDavid du Colombier 	} else
19*3e12c5d1SDavid du Colombier 		modf(d, &d);
20*3e12c5d1SDavid du Colombier 	return d;
21*3e12c5d1SDavid du Colombier }
22*3e12c5d1SDavid du Colombier 
23*3e12c5d1SDavid du Colombier double
ceil(double d)24*3e12c5d1SDavid du Colombier ceil(double d)
25*3e12c5d1SDavid du Colombier {
26*3e12c5d1SDavid du Colombier 	return -floor(-d);
27*3e12c5d1SDavid du Colombier }
28