用C乘以双打时丢失精度(Losing precision when multiplying Doub

2019-09-28 18:18发布

我试图让一个双数约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;
}

确定后,我读了一些东西ü张贴我在想我怎么会从我的电话号码删除这个多余的东西,以保持稳定的乘法。 例如,在我的例子。 我的小数部分会以这种方式chaning: 0.3,0.6,0.2,0.4,0.8...我们可以降低其余保持这个数字?

Answer 1:

与典型的FP是binary64 , double 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;
}


Answer 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;
}


Answer 3:

虽然你的程序是做一些很不同寻常的事情,主要回答你的问题是,这是点数如何浮动工作。 他们是不精确的。

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



文章来源: Losing precision when multiplying Doubles in C