2 5dc21454 2023-07-14 jrmu * Exercise 4-2. Extend atof to handle scientific notation of the form
6 5dc21454 2023-07-14 jrmu * where a floating point number may be followed by e or E and an optionally
7 5dc21454 2023-07-14 jrmu * signed exponent.
10 5dc21454 2023-07-14 jrmu #include <stdio.h>
11 5dc21454 2023-07-14 jrmu #include <ctype.h>
12 5dc21454 2023-07-14 jrmu #include <math.h>
14 5dc21454 2023-07-14 jrmu #define MAXLINE 100
16 5dc21454 2023-07-14 jrmu /* rudimentary calculator */
18 5dc21454 2023-07-14 jrmu double pow(double x, double y);
20 5dc21454 2023-07-14 jrmu int main() {
21 5dc21454 2023-07-14 jrmu double atof(char []);
22 5dc21454 2023-07-14 jrmu char line[MAXLINE];
23 5dc21454 2023-07-14 jrmu int getlin(char line[], int max);
25 5dc21454 2023-07-14 jrmu while (getlin(line, MAXLINE) > 0)
26 5dc21454 2023-07-14 jrmu printf("\t%f\n", atof(line));
30 5dc21454 2023-07-14 jrmu /* getlin: get line into s, return length */
31 5dc21454 2023-07-14 jrmu int getlin(char s[], int lim) {
34 5dc21454 2023-07-14 jrmu while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
36 5dc21454 2023-07-14 jrmu if (c == '\n')
38 5dc21454 2023-07-14 jrmu s[i] = '\0';
42 5dc21454 2023-07-14 jrmu /* atof: convert string s to double */
43 5dc21454 2023-07-14 jrmu double atof(char s[]) {
44 5dc21454 2023-07-14 jrmu double val, power;
45 5dc21454 2023-07-14 jrmu int i, sign, expsign, exp;
47 5dc21454 2023-07-14 jrmu for (i = 0; isspace(s[i]); i++) /* skip white space */
49 5dc21454 2023-07-14 jrmu sign = (s[i] == '-') ? -1 : 1;
50 5dc21454 2023-07-14 jrmu if (s[i] == '+' || s[i] == '-')
52 5dc21454 2023-07-14 jrmu for (val = 0.0; isdigit(s[i]); i++)
53 5dc21454 2023-07-14 jrmu val = 10.0 * val + (s[i] - '0');
54 5dc21454 2023-07-14 jrmu if (s[i] == '.')
56 5dc21454 2023-07-14 jrmu for (power = 1.0; isdigit(s[i]); i++) {
57 5dc21454 2023-07-14 jrmu val = 10.0 * val + (s[i] - '0');
58 5dc21454 2023-07-14 jrmu power *= 10.0;
60 5dc21454 2023-07-14 jrmu if (s[i] == 'e' || s[i] == 'E') {
62 5dc21454 2023-07-14 jrmu expsign = (s[i] == '-') ? -1 : 1;
63 5dc21454 2023-07-14 jrmu if (s[i] == '+' || s[i] == '-')
65 5dc21454 2023-07-14 jrmu for (exp = 0; isdigit(s[i]); i++)
66 5dc21454 2023-07-14 jrmu exp = 10 * exp + (s[i] - '0');
69 5dc21454 2023-07-14 jrmu expsign = 1;
71 5dc21454 2023-07-14 jrmu return sign * val * pow(10,expsign*exp) / power;
74 5dc21454 2023-07-14 jrmu int atoi(char s[]) {
75 5dc21454 2023-07-14 jrmu double atof(char s[]);
76 5dc21454 2023-07-14 jrmu return (int) atof(s);