summaryrefslogtreecommitdiffstats
path: root/4
diff options
context:
space:
mode:
authorSadeep Madurange <smadurange@users.noreply.github.com>2021-12-05 12:56:34 +0800
committerSadeep Madurange <smadurange@users.noreply.github.com>2021-12-05 12:56:34 +0800
commit41e16a70c637264428db4b13617d88de362a8156 (patch)
tree927d530424a33142956f0ffed845bf645b1d19d4 /4
parentf4a422e2d69731be5eabfcb1a6ab722aadb84322 (diff)
downloadk&r-exercises-41e16a70c637264428db4b13617d88de362a8156.tar.gz
4.2
Diffstat (limited to '4')
-rw-r--r--4/2.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/4/2.c b/4/2.c
index 0f842e8..2f94001 100644
--- a/4/2.c
+++ b/4/2.c
@@ -22,7 +22,7 @@ int main(int argc, char *argv[]) {
}
double atof(char s[]) {
- int i, sign;
+ int i, j, sign, exp, exp_sign;
double val, power;
for (i = 0; isspace(s[i]); i++)
@@ -44,5 +44,24 @@ double atof(char s[]) {
power *= 10.0;
}
+ if (s[i] == 'e' || s[i] == 'E')
+ i++;
+
+ exp_sign = s[i] == '-' ? -1 : 1;
+
+ for (i++, exp = 0; isdigit(s[i]); i++)
+ exp = 10 * exp + (s[i] - '0');
+
+ if (exp_sign < 0)
+ exp = exp_sign * exp;
+
+ if (exp < 0) {
+ for (j = exp; j < 0; j++)
+ power *= 10.0;
+ } else {
+ for (j = 0; j < exp; j++)
+ power /= 10.0;
+ }
+
return sign * val / power;
} \ No newline at end of file