使用浮点数时避免不规则的微小数字

时间:2011-12-09 18:05:23

标签: c++ floating-point floating-accuracy

有些时候我在c ++中使用浮点数并且只使用数字作为for的倍数,比如0.1,作为for循环的增量,实际的循环迭代器数不是0.1的倍数但是有不可预测地增加或减少1 ^ -17数量级的微小数字。我怎么能避免这种情况?

3 个答案:

答案 0 :(得分:7)

在迭代中使用整数,并在使用之前乘以浮点增量。

或者找到一个十进制数学包并使用它而不是浮点数。

答案 1 :(得分:6)

不要迭代浮点数。

问题是0.1不能用浮点精确表示。所以相反,你应该做类似的事情:

for (int i = 0; i < N; i++)
{
    float f = i * 0.1f;

    ...
}

答案 2 :(得分:1)

这是关于使用浮动主题的excellent article。有一个讨论恰好涵盖了你的例子 - 增量为0.1:

for (double r=0.0; r!=1.0; r+=0.1) printf("*");
  

要打印多少颗星?十?跑吧,感到惊讶。代码只是继续打印星星,直到我们打破它。

     

问题出在哪里?我们已经知道,双打并不是无限精确的。我们在这里遇到的问题如下:在二进制中,0.1的表示不是有限的(因为它在基数10中)。十进制0.1相当于二进制0.0(0011),其中括号中的部分永远重复。当0.1存储在double变量中时,它会四舍五入到最接近的可表示值。因此,如果我们将其添加10次,则结果不完全等于1。

如果您使用浮点数进行大量工作,我强烈建议您阅读整篇文章。