Exercise 4.2 - Extend atof to handle scientific notation¶
Question¶
Exercise 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.
/**
*
* Program demonstrating atof(char s[]).The function which converts the string
* to a floating point value.
*
*/
#include <ctype.h>
#include <stdio.h>
#define MAXLINE 100
double myatof(char s[]);
int mgetline(char line[], int lim);
int main(void) {
char str[MAXLINE];
double num;
mgetline(str, MAXLINE);
num = myatof(str);
printf("%f", num);
return 0;
}
double myatof(char s[]) {
double val, pow;
int sign, i, esign, exp;
int power(int base, int exp);
for (i = 0; isspace(s[i]); i++);
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 (pow = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
pow *= 10.0;
}
if (s[i] == 'e' || s[i] == 'E')
i++;
if (s[i] == '+' || s[i] == '-') {
esign = s[i];
i++;
}
for (exp = 0; isdigit(s[i]); i++)
exp = 10.0 * exp + (s[i] - '0');
if (esign == '-')
return sign * (val / pow) / power(10, exp);
else
return sign * (val / pow) * power(10, exp);
}
int mgetline(char line[], int lim) {
int i, c;
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
line[i] = c;
if (c == '\n')
line[i++] = c;
line[i] = '\0';
}
int power(int base, int exp) {
int power;
power = 1;
while (exp-- > 0)
power *= base;
return power;
}
Explanation¶
For the input:
1.0e10
We might get the output:
1410065408.000000