有些时候我在c ++中使用浮点数并且只使用数字作为for的倍数,比如0.1,作为for循环的增量,实际的循环迭代器数不是0.1的倍数但是有不可预测地增加或减少1 ^ -17数量级的微小数字。我怎么能避免这种情况?
答案 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。
如果您使用浮点数进行大量工作,我强烈建议您阅读整篇文章。