正确测试两个 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.7f
到 double
, 你得到 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/