Exercise 4.2 - Extend atof to handle scientific notation#

Question#

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<stdio.h>
#include<ctype.h>
#define MAXLINE 100

double myatof(char s[]);
int mgetline(char line[],int maxline);

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 s[],int lim)
{
    int i,c;

    for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)
        s[i] = c;
    
    if(c=='\n')
        s[i++]=c;

    s[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