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

Tar*_*rek 0 c++ floating-point floating-accuracy

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

Mar*_*som 7

使用整数进行迭代并乘以浮点增量.

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


Oli*_*rth 6

不要迭代浮点数.

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

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 最好的部分是,因为他每次都会加上"0.1",即使他得到一个逻辑上应该完全可以表示的数字(例如"1.0"),他很有可能不会.因此像`for(float f = 0.0f; f <1.0; f + = 0.1f)`这样的行最终可能只迭代9次. (2认同)