c++ - 与精确值的 double / float 比较

标签 c++ floating-point comparison

有很多关于 float 比较的文档和讨论。但就我而言,不清楚能否始终保证数字的直接比较适用于所有编译器和平台?

double x = 1.;
if (1. == x)
{
   //do something
}

我们会一直进入if block 吗?

已编辑:

这里哪个比较是正确的(总是有效)?这个?:

double x = 1.;
if (std::abs(1. - x) < std::numeric_limits<double>::epsilon())
{
   //do something
}

最佳答案

是的,像这样的直接比较——没有中间操作——总是有效的。为浮点文字存储的位模式是浮点系统(几乎总是 IEEE-754)可表示的最接近的位模式。所以测试 1.0 == 1.0 将始终有效,因为位模式是 1.0 的位模式;并且 0.3 == 0.3始终有效,因为在这两种情况下,位模式——虽然不完全是 0.3——是最接近 0.3 的可表示数字。

至于 epsilon,请远离机器 epsilon,直到您真正了解它代表什么以及它的用途。机器epsilon是相对的,不是绝对的;并使用它来比较“足够接近”需要了解各种操作会引入多少错误。有趣的是,在您的特定情况下,这两个测试实际上是相同的:只有 1.0 才能通过测试。

关于c++ - 与精确值的 double / float 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40990187/

相关文章:

c++ - GCC:由于数据类型的范围有限,比较总是正确的——在模板参数中?

.net - 比较对象时的 Equals 与 GetHashCode

c# - 使用 SWIG 从 c# 使用 c++ uint8_t *

c# - 为什么这个指定的转换无效??

language-agnostic - 为什么在 IEEE754 标准中被零除会导致无限值?

algorithm - 如何计算任意幂/根?

python - python 中的 != 和 <> 比较运算符有什么区别?

c++ - 在 Qt 中滚动滚动区域

C++ A *优先级队列的集合与 vector +堆操作

c++ - 使用 GCC-4.8.1 在 MinGW 上编译 wxWidgets-2.8.12 时出错