chr*_*ris 17 c++ floating-point equality
正确地测试两个浮点数是否相等是包括我在内的很多人都不完全理解的.然而,今天,我想到了一些标准容器如何定义平等operator<.我总是看到人们在平等方面存在问题,但从未与其他关系比较相提并论.甚至可以使用它们的静默版本,其中包括除了平等和不平等之外的所有内容.
假设operator<作品"正常",不像operator==,为什么我们不能这样做:
bool floateq(float a, float b) {
//check NaN
return !(a < b) && !(b < a);
}
Run Code Online (Sandbox Code Playgroud)
其实,我并运行一个测试与双打额外的过载,因为看到这里,似乎有同样的缺陷作为他们的比较operator==:
std::cout << "float->double vs double: "
<< floateq(static_cast<double>(0.7f), 0.7) << " "
<< (static_cast<double>(0.7f) == 0.7) << "\n";
Run Code Online (Sandbox Code Playgroud)
输出:
float-> double vs double:0 0
我是否担心使用所有比较运算符,或者是否存在比较我不理解的浮点数的其他方面?
tmy*_*ebu 16
的==,<,>,<=,>=,和!=运营商合作只是浮点数的罚款.
你似乎有一个前提,即一些合理的实现< 应该比较(加倍)0.7f等于0.7.不是这种情况.如果你投0.7f了一个double,你得到0x1.666666p-1.但是,0.7等于0x1.6666666666666p-1.这些在数值上并不相同; 事实上,它(double)0.7f比相当小的人要小得多0.7- 这是荒谬的.
使用浮点数时,重要的是要记住它们是浮点数,而不是实数或有理数或任何其他类似的东西.您必须考虑他们的属性,而不是每个人都希望他们拥有的属性.这样做,你自动避免使用浮点数的大多数常见的"陷阱".