练习4-2 对atof函数进行扩充,使它可以处理形如123.45e-6的科学表示法,其中浮点数后面可能会紧跟一个e或E以及一个指数

来源:互联网 发布:手机淘宝怎么买电影票 编辑:程序博客网 时间:2024/06/13 13:09

扩充部分过程与atoi一样

#include <stdio.h>#include <ctype.h>#define MAXLINE 1000int getline(char s[],int lim);double atof(char s[]);main(){    double val;    char line[MAXLINE];    while(getline(line,MAXLINE)>0)        val=atof(line);    printf("%f",val);}int getline(char s[],int lim){    int c,i;    i=0;    while(--lim>0&&(c=getchar())!=EOF&&c!='\n')        s[i++]=c;    if(c=='\n')        s[i++]=c;    s[i]='\0';    return i;}double atof(char s[]){    double val,power;    int i,sign,n;    n=0;    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(power=1.0;isdigit(s[i]);i++){        val=10.0*val+(s[i]-'0');        power*=10.0;    }    val=sign*val/power;    if(s[i]=='e'||s[i]=='E'){        i++;        sign=(s[i]=='-') ? -1:1;        if(s[i]=='+'||s[i]=='-')            i++;        for(;isdigit(s[i]);++i){            n=10*n+(s[i]-'0');        }        for(;n>0;--n){            if(sign>0)                val=val*10.0;            else                val=val*0.1;        }    }    return val;}

答案说,用val去除以10而不是乘以0.1的原因是:0.1无法用二进制数精确地表示出来,在大多数机器上,0.1的二进制表示法都要比0.1稍微小一点。

0 0
原创粉丝点击