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