blob: 562fcd688e8beff910b26336da4690527232fa85 [file] [log] [blame]
Guido van Rossum2b7e04a1995-02-19 15:54:36 +00001
2/* Just in case you haven't got an atof() around...
3 This one doesn't check for bad syntax or overflow,
4 and is slow and inaccurate.
5 But it's good enough for the occasional string literal... */
6
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +00007#include "pyconfig.h"
Guido van Rossum2b7e04a1995-02-19 15:54:36 +00008
9#include <ctype.h>
10
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000011double atof(char *s)
Guido van Rossum2b7e04a1995-02-19 15:54:36 +000012{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000013 double a = 0.0;
14 int e = 0;
15 int c;
16 while ((c = *s++) != '\0' && isdigit(c)) {
17 a = a*10.0 + (c - '0');
18 }
19 if (c == '.') {
20 while ((c = *s++) != '\0' && isdigit(c)) {
21 a = a*10.0 + (c - '0');
22 e = e-1;
23 }
24 }
25 if (c == 'e' || c == 'E') {
26 int sign = 1;
27 int i = 0;
28 c = *s++;
29 if (c == '+')
30 c = *s++;
31 else if (c == '-') {
32 c = *s++;
33 sign = -1;
34 }
35 while (isdigit(c)) {
36 i = i*10 + (c - '0');
37 c = *s++;
38 }
39 e += i*sign;
40 }
41 while (e > 0) {
42 a *= 10.0;
43 e--;
44 }
45 while (e < 0) {
46 a *= 0.1;
47 e++;
48 }
49 return a;
Guido van Rossum2b7e04a1995-02-19 15:54:36 +000050}