|
|
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.