+ -
当前位置:首页 → 问答吧 → 请教大家一个问题,大家看看这是怎么回事??

请教大家一个问题,大家看看这是怎么回事??

时间: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;
}

作者: lllluuukke   发布时间: 2011-11-19

是double精度的问题,比如输入111的时候,n_temp算出来是0.111,但是10*n_temp=1.1100000000000001,所以结果自然是17了。
我没有什么好的办法,我的临时解决办法是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循环条件改成
代码:
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