xref: /original-bsd/lib/libm/common_source/floor.c (revision 92c664ec)
1 /*	@(#)floor.c	4.2	9/11/85; 5.1 (ucb.elefunt) 11/30/87 */
2 
3 /*
4  * floor and ceil-- greatest integer <= arg
5  * (resp least >=)
6  */
7 
8 double	modf();
9 
10 double
11 floor(d)
12 double d;
13 {
14 	double fract;
15 
16 	if (d<0.0) {
17 		d = -d;
18 		fract = modf(d, &d);
19 		if (fract != 0.0)
20 			d += 1;
21 		d = -d;
22 	} else
23 		modf(d, &d);
24 	return(d);
25 }
26 
27 double
28 ceil(d)
29 double d;
30 {
31 	return(-floor(-d));
32 }
33 
34 #ifndef national			/* rint() is in ./NATIONAL/support.s */
35 /*
36  * algorithm for rint(x) in pseudo-pascal form ...
37  *
38  * real rint(x): real x;
39  *	... delivers integer nearest x in direction of prevailing rounding
40  *	... mode
41  * const	L = (last consecutive integer)/2
42  * 	  = 2**55; for VAX D
43  * 	  = 2**52; for IEEE 754 Double
44  * real	s,t;
45  * begin
46  * 	if x != x then return x;		... NaN
47  * 	if |x| >= L then return x;		... already an integer
48  * 	s := copysign(L,x);
49  * 	t := x + s;				... = (x+s) rounded to integer
50  * 	return t - s
51  * end;
52  *
53  * Note: Inexact will be signaled if x is not an integer, as is
54  *	customary for IEEE 754.  No other signal can be emitted.
55  */
56 #if defined(vax)||defined(tahoe)
57 #ifdef vax
58 #define _0x(A,B)	0x/**/A/**/B
59 #else	/* vax */
60 #define _0x(A,B)	0x/**/B/**/A
61 #endif	/* vax */
62 static long Lx[] = {_0x(0000,5c00),_0x(0000,0000)};	/* 2**55 */
63 #define L *(double *) Lx
64 #else	/* defined(vax)||defined(tahoe) */
65 static double L = 4503599627370496.0E0;		/* 2**52 */
66 #endif	/* defined(vax)||defined(tahoe) */
67 double
68 rint(x)
69 double x;
70 {
71 	double s,t,one = 1.0,copysign();
72 #if !defined(vax)&&!defined(tahoe)
73 	if (x != x)				/* NaN */
74 		return (x);
75 #endif	/* !defined(vax)&&!defined(tahoe) */
76 	if (copysign(x,one) >= L)		/* already an integer */
77 	    return (x);
78 	s = copysign(L,x);
79 	t = x + s;				/* x+s rounded to integer */
80 	return (t - s);
81 }
82 #endif	/* not national */
83