正确测试两个浮点数是否相等是很多人,包括我在内,并不完全理解的事情。然而,今天,我想到了一些标准容器如何根据operator<
. 我总是看到人们在平等方面存在问题,但从来没有在其他关系比较方面遇到过问题。它们甚至还有无声版本可供使用,其中包括除平等和不平等之外的所有内容。
假设operator<
工作“正确”,不像operator==
,为什么我们不能这样做:
bool floateq(float a, float b) {
//check NaN
return !(a < b) && !(b < a);
}
事实上,我确实运行了一个额外的双打重载测试,如此处所示,它似乎与比较它们有相同的陷阱operator==
:
std::cout << "float->double vs double: "
<< floateq(static_cast<double>(0.7f), 0.7) << " "
<< (static_cast<double>(0.7f) == 0.7) << "\n";
输出:
浮动->双与双:0 0
我是否要担心使用所有比较运算符,或者是否存在比较我不正确理解的浮点数的其他方面?