|
|
1.1 ! root 1: union { ! 2: short foo0[4]; ! 3: double big; ! 4: } bar0 /* = {0x5c80,0,0,0} */ ; /* 2**56 as double floating point */ ! 5: union { ! 6: short foo1[4]; ! 7: double huge; ! 8: } bar1 /* = {0x8000,0,0,0} */ ; /* reserved operand */ ! 9: ! 10: double atof(p) register char *p; { ! 11: register double exp,val; ! 12: register char c; register int dpdig; ! 13: int scale; char sign,esign; ! 14: ! 15: abort(); /* THE REAL ROUTINE IS atofo.s !!!!! */ ! 16: while ((c= *p++)==' '); /* skip leading spaces */ ! 17: sign=0; ! 18: if (c=='-') ++sign; /* mark negative */ ! 19: else if (c=='+') ; /* ignore plus */ ! 20: else --p; /* get back on track */ ! 21: ! 22: val=0; dpdig=0; ! 23: /* true value is aproximately ((-1)**sign) * val * (10 ** dpdig) */ ! 24: while ((c= *p++)<='9' && c>='0') ! 25: if(val<bar0.big) {val *= 10; val += c-'0';} ! 26: else ++dpdig; ! 27: if (c=='.') ! 28: while ((c= *p++)<='9' && c>='0') ! 29: if(val<bar0.big) {--dpdig; val *= 10; val += c-'0';} ! 30: if (sign) val = -val; /* sign has been taken care of, if val in range */ ! 31: scale=0; ! 32: if (c=='E' || c=='e') {/* scale factor */ ! 33: esign=0; ! 34: if ((c= *p++)=='-') ++esign; ! 35: else if (c=='+'); ! 36: else --p; ! 37: while ((c= *p++)<='9' && c>='0') {scale *= 10; scale += c-'0';} ! 38: if (esign) scale = -scale; ! 39: } ! 40: dpdig += scale; ! 41: if (dpdig==0) return(val); ! 42: esign=0; if (dpdig<0) {++esign; dpdig = -dpdig;} ! 43: if (dpdig>38) if (esign) return(0); else return(sign? -bar1.huge : bar1.huge); ! 44: exp=1; while (dpdig) { ! 45: if (dpdig==21) {exp *= 1.0e+21; break;} ! 46: exp *= 10; --dpdig; ! 47: } ! 48: if (esign) return(val/exp); return(val*exp); ! 49: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.