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