Annotation of lucent/sys/src/libc/68020/frexp.c, revision 1.1.1.1

1.1       root        1: #include <u.h>
                      2: #include <libc.h>
                      3: 
                      4: #define        MASK    0x7ffL
                      5: #define        SHIFT   20
                      6: #define        BIAS    1022L
                      7: 
                      8: typedef        union
                      9: {
                     10:        double  d;
                     11:        struct
                     12:        {
                     13:                long    ms;
                     14:                long    ls;
                     15:        };
                     16: } Cheat;
                     17: 
                     18: double
                     19: frexp(double d, int *ep)
                     20: {
                     21:        Cheat x;
                     22: 
                     23:        if(d == 0) {
                     24:                *ep = 0;
                     25:                return 0;
                     26:        }
                     27:        x.d = d;
                     28:        *ep = ((x.ms >> SHIFT) & MASK) - BIAS;
                     29:        x.ms &= ~(MASK << SHIFT);
                     30:        x.ms |= BIAS << SHIFT;
                     31:        return x.d;
                     32: }
                     33: 
                     34: double
                     35: ldexp(double d, int e)
                     36: {
                     37:        Cheat x;
                     38: 
                     39:        if(d == 0)
                     40:                return 0;
                     41:        x.d = d;
                     42:        e += (x.ms >> SHIFT) & MASK;
                     43:        if(e <= 0)
                     44:                return 0;       /* underflow */
                     45:        if(e >= MASK){          /* overflow */
                     46:                if(d < 0)
                     47:                        return Inf(-1);
                     48:                return Inf(1);
                     49:        }
                     50:        x.ms &= ~(MASK << SHIFT);
                     51:        x.ms |= (long)e << SHIFT;
                     52:        return x.d;
                     53: }
                     54: 
                     55: double
                     56: modf(double d, double *ip)
                     57: {
                     58:        Cheat x;
                     59:        int e;
                     60: 
                     61:        if(d < 1) {
                     62:                if(d < 0) {
                     63:                        x.d = modf(-d, ip);
                     64:                        *ip = -*ip;
                     65:                        return -x.d;
                     66:                }
                     67:                *ip = 0;
                     68:                return d;
                     69:        }
                     70:        x.d = d;
                     71:        e = ((x.ms >> SHIFT) & MASK) - BIAS;
                     72:        if(e <= SHIFT+1) {
                     73:                x.ms &= ~(0x1fffffL >> e);
                     74:                x.ls = 0;
                     75:        } else
                     76:        if(e <= SHIFT+33)
                     77:                x.ls &= ~(0x7fffffffL >> (e-SHIFT-2));
                     78:        *ip = x.d;
                     79:        return d - x.d;
                     80: }

unix.superglobalmegacorp.com

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