Annotation of 43BSD/usr.lib/libm/floor.c, revision 1.1.1.1

1.1       root        1: /*     @(#)floor.c     4.2     9/11/85 */
                      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: /*
                     35:  * algorithm for rint(x) in pseudo-pascal form ...
                     36:  *
                     37:  * real rint(x): real x;
                     38:  *     ... delivers integer nearest x in direction of prevailing rounding
                     39:  *     ... mode
                     40:  * const       L = (last consecutive integer)/2
                     41:  *       = 2**55; for VAX D
                     42:  *       = 2**52; for IEEE 754 Double
                     43:  * real        s,t;
                     44:  * begin
                     45:  *     if x != x then return x;                ... NaN
                     46:  *     if |x| >= L then return x;              ... already an integer
                     47:  *     s := copysign(L,x);
                     48:  *     t := x + s;                             ... = (x+s) rounded to integer
                     49:  *     return t - s
                     50:  * end;
                     51:  *
                     52:  * Note: Inexact will be signaled if x is not an integer, as is
                     53:  *     customary for IEEE 754.  No other signal can be emitted.
                     54:  */
                     55: #ifdef VAX
                     56: static long Lx[] = {0x5c00,0x0};               /* 2**55 */
                     57: #define L *(double *) Lx
                     58: #else  /* IEEE double */
                     59: static double L = 4503599627370496.0E0;                /* 2**52 */
                     60: #endif
                     61: double
                     62: rint(x)
                     63: double x;
                     64: {
                     65:        double s,t,one = 1.0,copysign();
                     66: #ifndef VAX
                     67:        if (x != x)                             /* NaN */
                     68:                return (x);
                     69: #endif
                     70:        if (copysign(x,one) >= L)               /* already an integer */
                     71:            return (x);
                     72:        s = copysign(L,x);
                     73:        t = x + s;                              /* x+s rounded to integer */
                     74:        return (t - s);
                     75: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.