在C中乘以双倍时丢失精度

时间:2014-12-03 20:49:31

标签: c double precision

我试图获得双倍数的多重小数部分约500次。随着时间的推移,这个数字开始失去精确度。是否有任何技巧可以使连续乘法准确?

double x = 0.3;
double binary = 2.0;

for (i=0; i<500; i++){
    x = x * binary;
    printf("x equals to : %f",x);
    if(x>=1.0)
        x = x - 1;
}

好的,在我阅读了你发布的一些内容后,我在想如何从我的号码中删除这些不需要的东西,以保持乘法稳定。例如在我的例子中。我的小数部分将以这种方式进行处理:0.3,0.6,0.2,0.4,0.8...我们可以削减其余部分以保留这些数字吗?

3 个答案:

答案 0 :(得分:2)

通常,浮点数学并不完全精确,如其他答案和许多在线资源所示。问题是某些数字不能用二进制表示。 0.3是这样的数字,但所有自然数都不是。所以你可以改变你的程序:

double x = 3.0;
double binary = 2.0;

for (i=0; i<500; i++){
    x = x * binary;
    printf("x equals to : %f",x/10.0);
    if(x>=10.0)
        x = x - 10.0;
}

答案 1 :(得分:2)

典型的FP为binary64double x = 0.3;会产生x,其值更像0.29999999999999998890...,因此代码与开头有差异。

x缩放10以保持精确数学 - 或使用decimal64 double

int main(void) {
  double x = 3.0;
  double binary = 2.0;
  printf("x equals to : %.20f\n",x);
  for (int i=0; i<500; i++){
      x = x * binary;
      printf("x equals to : %.20f\n",x/10);
      if(x>=10.0)
          x = x - 10;
  }
  return 0;
}

答案 2 :(得分:1)

虽然你的程序正在做一些非常不寻常的事情,但问题的主要答案是这就是浮点数的工作原理。它们不精确。

http://floating-point-gui.de/basic/