练习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
- 练习4-2 对atof函数进行扩充,使它可以处理形如123.45e-6的科学表示法,其中浮点数后面可能会紧跟一个e或E以及一个指数
- 练习4-2 对atof函数进行扩充,使它可以处理形如123.456e-6的科学表示法,其中,浮点数后面可能会紧跟一个e或E以及一个指数(可能有正负号)
- C r e a t e T h r e a d的最后一个参数是p d w T h r e a d I D,可以(并且通常是这样做的)为该参 数传递N U L L。它告诉函数,你对线程的I D不感兴趣
- HDU 4465 Candy【指数表示法】E
- atof函数,可以处理科学计数法
- e的科学计数法
- 科学计数法 E
- Codeforces Round #348 E. Little Artem and Time Machine(给你一个n,有三种选择,1表示增加一个值,2表示删除这个数的一个值,3表示查询)
- 程序员面试金典: 9.5位操作5.2对一个浮点数,打印它的二进制表示
- 【codeforces 27 E】【反素数】【给一个数n,求一个最小的正整数,使得它的因子个数为n】
- e
- E
- E
- e
- e
- e
- e
- e
- Intersection of Two Arrays II
- ACtion的多例和单例(网站看到的。自己遇到的)
- hexo写博客
- 【Linux学习日志】源码编译安装GVIM7.4/VIM7.4
- 十年之后重学C语言
- 练习4-2 对atof函数进行扩充,使它可以处理形如123.45e-6的科学表示法,其中浮点数后面可能会紧跟一个e或E以及一个指数
- 《笑话大全》APP代码详解2
- 为javascript的JSON对象扩展forEach方法
- 欧拉路径
- laravel配置路由出现404解决办法
- Android 布局开发之百分比布局、弹性布局
- 找回Linux系统Root账户密码
- OpenMPI学习笔记(五)之乒乓球比赛模拟(一)
- ASP.NET Webform的一个副作用及解决方法