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