|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.