|
|
1.1 root 1: /* atof.s 4.2 83/06/30 */
2:
3: /*
4: C library - ascii to floating
5: */
6:
7: #include <ctype.h>
8: #define LOGHUGE 39
9:
10: double
11: atof(p)
12: register char *p;
13: {
14: register c;
15: double fl, flexp, exp5;
16: static double big = 72057594037927936.; /*2^56 (Dorit)*/
17: double ldexp();
18: int nd;
19: register eexp, exp, neg, negexp, bexp;
20:
21: neg = 1;
22: while((c = *p++) == ' ')
23: ;
24: if (c == '-')
25: neg = -1;
26: else if (c=='+')
27: ;
28: else
29: --p;
30:
31: exp = 0;
32: fl = 0;
33: nd = 0;
34: while ((c = *p++), isdigit(c)) {
35: if (fl<big)
36: fl = 10*fl + (c-'0');
37: else
38: exp++;
39: nd++;
40: }
41:
42: if (c == '.') {
43: while ((c = *p++), isdigit(c)) {
44: if (fl<big) {
45: fl = 10*fl + (c-'0');
46: exp--;
47: }
48: nd++;
49: }
50: }
51:
52: negexp = 1;
53: eexp = 0;
54: if ((c == 'E') || (c == 'e')) {
55: if ((c= *p++) == '+')
56: ;
57: else if (c=='-')
58: negexp = -1;
59: else
60: --p;
61:
62: while ((c = *p++), isdigit(c)) {
63: eexp = 10*eexp+(c-'0');
64: }
65: if (negexp<0)
66: eexp = -eexp;
67: exp = exp + eexp;
68: }
69:
70: negexp = 1;
71: if (exp<0) {
72: negexp = -1;
73: exp = -exp;
74: }
75:
76:
77: if((nd+exp*negexp) < -LOGHUGE){
78: fl = 0;
79: exp = 0;
80: }
81: flexp = 1;
82: exp5 = 5;
83: bexp = exp;
84: for (;;) {
85: if (exp&01)
86: flexp *= exp5;
87: exp >>= 1;
88: if (exp==0)
89: break;
90: exp5 *= exp5;
91: }
92: if (negexp<0)
93: fl /= flexp;
94: else
95: fl *= flexp;
96: fl = ldexp(fl, negexp*bexp);
97: if (neg<0)
98: fl = -fl;
99: return(fl);
100: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.