请教大家一个问题,大家看看这是怎么回事??
时间:2011-11-19
来源:互联网
初学c,在写一个算有效数字的算法,基本完成了,但是有奇葩的bug。正常情况下,输入1234,应该输出4;输入0.123应该输出3;输入123.5467应该输出7,等等等等。测试的大部分数字都是正常的,但是输入1110, 0.111, 234, 111,3.1415等某些数字,它们的输出都是17。而double的精度也是17位,不知道这两者之间有没什么关系。
请问是怎么回事,应该怎么解决。
源码
请问是怎么回事,应该怎么解决。
源码
代码:
#include<stdio.h>
#include<math.h>
int main(void) {
double n, n_temp;
long top, neg = 1, sig_fig = 1;
scanf("%lf", &n);
if(n <= 0) {
n_temp = -1*n;
neg = -1;
}
else
n_temp = n;
if(n_temp > 1) {
top = log10(n_temp)+1;
n_temp = n_temp/pow(10, top);
}
while((10*n_temp) != (floor(10*n_temp))) {
sig_fig++;
n_temp = 10*n_temp;
}
printf("%ld\n", sig_fig);
return 0;
}
#include<math.h>
int main(void) {
double n, n_temp;
long top, neg = 1, sig_fig = 1;
scanf("%lf", &n);
if(n <= 0) {
n_temp = -1*n;
neg = -1;
}
else
n_temp = n;
if(n_temp > 1) {
top = log10(n_temp)+1;
n_temp = n_temp/pow(10, top);
}
while((10*n_temp) != (floor(10*n_temp))) {
sig_fig++;
n_temp = 10*n_temp;
}
printf("%ld\n", sig_fig);
return 0;
}
作者: lllluuukke 发布时间: 2011-11-19
是double精度的问题,比如输入111的时候,n_temp算出来是0.111,但是10*n_temp=1.1100000000000001,所以结果自然是17了。
我没有什么好的办法,我的临时解决办法是while循环条件改成
另外算法本身存在缺陷,1110返回3而不是4
我没有什么好的办法,我的临时解决办法是while循环条件改成
代码:
while((10*n_temp) - (floor(10*n_temp)) > 1e-6)
另外算法本身存在缺陷,1110返回3而不是4
作者: wjchen 发布时间: 2011-11-19
wjchen 写道:
是double精度的问题,比如输入111的时候,n_temp算出来是0.111,但是10*n_temp=1.1100000000000001,所以结果自然是17了。
我没有什么好的办法,我的临时解决办法是while循环条件改成
另外算法本身存在缺陷,1110返回3而不是4
我没有什么好的办法,我的临时解决办法是while循环条件改成
代码:
while((10*n_temp) - (floor(10*n_temp)) > 1e-6)
另外算法本身存在缺陷,1110返回3而不是4
试了一下,10*n_temp真的是1.1100000000000001,有点不理解。但是,输入1110,输出的是3,没错啊...
另外,如果我想输入1110.,输出4,或者输入1110.00,输出6怎么办?
作者: lllluuukke 发布时间: 2011-11-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28