home *** CD-ROM | disk | FTP | other *** search
- /*
- C library - ascii to floating
- */
-
- #include <math.h>
- #include <ctype.h>
-
- double
- atof(p)
- register char *p;
- {
- register c;
- double fl, flexp, exp5;
- double big = 72057594037927936.; /*2^56*/
- double ldexp();
- int nd;
- register eexp, exp, neg, negexp, bexp;
-
- neg = 1;
- while((c = *p++) == ' ')
- ;
- if (c == '-')
- neg = -1;
- else if (c=='+')
- ;
- else
- --p;
-
- exp = 0;
- fl = 0;
- nd = 0;
- while ((c = *p++), isdigit(c)) {
- if (fl<big)
- fl = 10*fl + (c-'0');
- else
- exp++;
- nd++;
- }
-
- if (c == '.') {
- while ((c = *p++), isdigit(c)) {
- if (fl<big) {
- fl = 10*fl + (c-'0');
- exp--;
- }
- nd++;
- }
- }
-
- negexp = 1;
- eexp = 0;
- if ((c == 'E') || (c == 'e')) {
- if ((c= *p++) == '+')
- ;
- else if (c=='-')
- negexp = -1;
- else
- --p;
-
- while ((c = *p++), isdigit(c)) {
- eexp = 10*eexp+(c-'0');
- }
- if (negexp<0)
- eexp = -eexp;
- exp = exp + eexp;
- }
-
- negexp = 1;
- if (exp<0) {
- negexp = -1;
- exp = -exp;
- }
-
-
- if((nd+exp*negexp) < -LOGHUGE){
- fl = 0;
- exp = 0;
- }
- flexp = 1;
- exp5 = 5;
- bexp = exp;
- for (;;) {
- if (exp&01)
- flexp *= exp5;
- exp >>= 1;
- if (exp==0)
- break;
- exp5 *= exp5;
- }
- if (negexp<0)
- fl /= flexp;
- else
- fl *= flexp;
- fl = ldexp(fl, negexp*bexp);
- if (neg<0)
- fl = -fl;
- return(fl);
- }
-