Commit Diff


commit - c0524b21c58b6c724a07074d102b99d45e14b194
commit + f3ab4731474ff00c5b7ea00a4896b3f1d29cf121
blob - /dev/null
blob + 5c2d96de2bbb5a0ecd26bea1cc532832dec28660 (mode 644)
--- /dev/null
+++ 4-2-input
@@ -0,0 +1,26 @@
+-12.34
+234.56
+-123456.7890
+-1.234567890
+123.45e-6
+0.0000000000000000012345
+.0000000000000000012345
+1.234567e89
+.1234567e90
+12345e-6
+12345678e-9
+1234567e89
+1.17549e-38
+3.40282e+38
+117.549e-40
+0.0340282e+40
+0.0117549e-36
+340.282e+36
+.117549e-37
+.340282e+39
+2.22507e-308
+1.79769e+308
+2.22507e-308
+1.79769e+308
+3.3621e-4932
+1.18973e+4932
blob - /dev/null
blob + 13b05df8f499fbefdad46e9ce7362989e298959a (mode 644)
--- /dev/null
+++ 4-2-output
@@ -0,0 +1,26 @@
+-12.34
+234.56
+-123457
+-1.23457
+0.00012345
+1.2345e-18
+1.2345e-18
+1.23457e+89
+1.23457e+89
+0.012345
+0.0123457
+1.23457e+95
+1.17549e-38
+3.40282e+38
+1.17549e-38
+3.40282e+38
+1.17549e-38
+3.40282e+38
+1.17549e-38
+3.40282e+38
+2.22507e-308
+inf
+2.22507e-308
+inf
+0
+inf
blob - /dev/null
blob + 02e63350f68ce84fa3b4efbeea9cf6e20b7a1a17 (mode 644)
--- /dev/null
+++ 4-2.c
@@ -0,0 +1,65 @@
+/* 4-2 Extend atof to handle scientific notation of the form 123.45e-6 where a
+ * floating-point number may be followed by e or E and an optionally signed
+ * exponent. */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+
+#define MAXLINE 1000            /* maximum input line size */
+
+int getlin(char line[], int maxline);
+double atof(char s[]);
+double pow(double x, double y);
+
+int main() {
+	char line[MAXLINE];
+	while(getlin(line, MAXLINE) > 0) {
+		double d = atof(line);
+		printf("%g\n", d);
+	}
+	return 0;
+}
+
+/* getlin: read a line into s, return length; modified to trim ending newline */
+int getlin(char s[], int lim) {
+	int c, i;
+
+	for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
+		s[i] = c;
+	s[i] = '\0';
+	return i;
+}
+
+/* atof: convert string s to double */
+double atof(char s[]) {
+	double val;
+	double power = 1.0;
+	int i, sign;
+	int exp = 0;
+	int expsign = 1;
+
+	for (i = 0; isspace(s[i]); i++)		/* skip white space */
+		;
+	sign = (s[i] == '-') ? -1 : 1;
+	if (s[i] == '+' || s[i] == '-')
+		i++;
+	for (val = 0.0; isdigit(s[i]); i++)
+		val = 10.0 * val + (s[i] - '0');
+	if (s[i] == '.')
+		i++;
+	for (; isdigit(s[i]); i++) {
+		val = 10.0 * val + (s[i] - '0');
+		power *= 10.0;
+	}
+	if (s[i] == 'e' || s[i] == 'E') {
+		i++;
+		expsign = (s[i] == '-') ? -1 : 1;
+		if (s[i] == '+' || s[i] == '-')
+			i++;
+		for (; isdigit(s[i]); i++) {
+			exp = 10 * exp + (s[i] - '0');
+		}
+	}
+	return sign * val * pow(10, expsign*exp) / power;
+}