c++ - 如果 operator< 适用于浮点类型,为什么我们不能将它用于相等性测试?

标签 c++ floating-point equality

正确测试两个 float 是否相等是很多人(包括我)不完全理解的事情。然而,今天,我想到了一些标准容器如何根据 operator< 来定义相等性。我总是看到人们在平等方面存在问题,但从来没有在其他关系比较方面遇到过问题。甚至还有 silent versions 可供使用,包括除平等和不平等之外的所有内容。

假设 operator< 工作“正常”,不像 operator== ,为什么我们不能这样做:

bool floateq(float a, float b) {
    //check NaN
    return !(a < b) && !(b < a);
}

事实上,如 here 所示,我确实运行了一个额外重载 double 的测试,它似乎与将它们与 operator== 进行比较时存在相同的缺陷:

std::cout << "float->double vs double: " 
          << floateq(static_cast<double>(0.7f), 0.7) << " " 
          << (static_cast<double>(0.7f) == 0.7) << "\n";

输出:

float->double vs double: 0 0

我是否担心使用 all 比较运算符,或者是否存在比较 float 的其他方面我没有正确理解?

最佳答案

== , < , > , <= , >= , 和 !=运算符可以很好地处理 float 。

你似乎有一些合理执行<的前提应该比较 (double)0.7f 等于 0.7。不是这种情况。如果你投 0.7fdouble , 你得到 0x1.666666p-1 .但是,0.7等于 0x1.6666666666666p-1 .这些在数值上并不相等;事实上,(double)0.7f远小于 0.7 --- 如果他们比较相等,那就太可笑了。

在处理 float 时,重要的是要记住它们是 float ,而不是实数或有理数或任何其他类似的东西。您必须考虑他们的属性,而不是每个人都希望他们拥有的属性。这样做,您会自动避免使用 float 时经常提到的大多数“陷阱”。

关于c++ - 如果 operator< 适用于浮点类型,为什么我们不能将它用于相等性测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17663430/

相关文章:

c++ - 如何避免在模板函数中使用浮点文字缩小转换

python - 具有 NaN 相等性比较的 Pandas DataFrames

c++ - 在 C++ 中保留配置设置的正确设计是什么?

c# - 无法增加浮点变量的值

c++ - GDB 和 NS2 : how to stop program at some Function call

c++ - 为什么我们不能从浮点最大值中减去?

javascript - 为什么或如何证明 JavaScript 数组相等性?

c# - 如何在单元测试中测试两个对象是否相等?

c++ - "All memory allocated on the stack is known at compile time"是什么意思?

c++ - 带默认参数的构造函数