Research V7 development
authorDennis Ritchie <dmr@research.uucp>
Sat, 5 May 1979 06:18:42 +0000 (01:18 -0500)
committerDennis Ritchie <dmr@research.uucp>
Sat, 5 May 1979 06:18:42 +0000 (01:18 -0500)
Work on file usr/src/libc/gen/atof.c

Synthesized-from: v7

usr/src/libc/gen/atof.c [new file with mode: 0644]

diff --git a/usr/src/libc/gen/atof.c b/usr/src/libc/gen/atof.c
new file mode 100644 (file)
index 0000000..608de64
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+       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);
+}