正确地测试两个浮点数是否相等是包括我在内的很多人都不完全理解的.然而,今天,我想到了一些标准容器如何定义平等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";
输出:
float-> double vs double:0 0
我是否担心使用所有比较运算符,或者是否存在比较我不理解的浮点数的其他方面?
从另一个人的.c文件中,我看到了这个:
const float c = 0.70710678118654752440084436210485f;
他想避免计算的地方sqrt(1/2).
这可以用普通的方式存储C/C++吗?我的意思是没有失去精确度.对我来说似乎不可能.
我正在使用C++,但我不相信这两种语言之间的精确差异太大(如果有的话),那就是为什么我没有测试它.
所以,我写了几行,看看代码的行为:
std::cout << "Number:    0.70710678118654752440084436210485\n";
const float f = 0.70710678118654752440084436210485f;
std::cout << "float:     " << std::setprecision(32) << f << std::endl;
const double d = 0.70710678118654752440084436210485; // no f extension
std::cout << "double:    " << std::setprecision(32) << d << std::endl;
const double df = 0.70710678118654752440084436210485f;
std::cout << "doublef:   " << std::setprecision(32) << df << std::endl;
const long double ld = 0.70710678118654752440084436210485;
std::cout << "l double:  " << std::setprecision(32) …