C++如何避免浮点运算错误

标签 c++ floating-point floating-point-precision

<分区>

我正在编写一个以 float 递增的循环,但我遇到了一个浮点运算问题,如下例所示:

for(float value = -2.0; value <= 2.0; value += 0.2)
    std::cout << value << std::endl;

这是输出:

-2
-1.8
-1.6
-1.4
-1.2
-1
-0.8
-0.6
-0.4
-0.2
1.46031e-07
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8

为什么我得到的是 1.46031e-07 而不是 0?我知道这与浮点错误有关,但我无法理解为什么会发生这种情况以及我应该采取什么措施来防止这种情况发生(如果有办法的话)。有人可以解释(或指向一个链接)来帮助我理解吗?任何输入表示赞赏。谢谢!

最佳答案

正如其他人所说,这是因为实数是无限且不可数的集合,而浮点表示使用有限位数。由于其定义, float 只能近似于实数,甚至在许多简单情况下也不精确。正如您现在看到的,0.2 实际上不是 0.2,而是一个非常接近它的数字。当您将这些添加到 value 时,您会累积每一步的错误。

作为替代方案,尝试使用 int 进行迭代并将结果除以将其返回到您需要的域中:

for (int value = -20; value <= 20; value += 2) {
  std::cout << (value / 10.f) << std::endl;
}

对我来说,这给了:

-2
-1.8
-1.6
-1.4
-1.2
-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2

关于C++如何避免浮点运算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14859875/

相关文章:

C++ 取模 2 性能

c++ - 从txt文件C++读取浮点错误值

Java:要 float 的毫秒时间戳字符串

c++ - OpenGL 网格错误位置

c++ - 分析.WAV文件

c++ - 在 c++(11) 中是否有更简洁的方法来复制具有多类型值的 unordered_map

SQLite 查询带 float 的 where 子句失败?

C# 浮点精度

python - 如何从变量指定浮点小数精度?

html - CSS:0.1em === WTF,浮点不准确?