我被告知在C++中避免对float/double类型执行equal或not_equal。但也有std::equal_to和std::not_equal_to模板函数
所以我想知道在c++中的float/double上使用std::equal_to和std::not_equal_to是否可靠?
我想知道c++中内置类型float/double的实现,但我找不到它们的源代码。你也可以和我分享他们的源代码吗?
首先,要解决这个问题:
在我所知道的标准库的所有实现中,std::equal_to<float/double>
和std::not_equal_to<float/double>
分别简单地调用==
和!=
。
话虽如此:
你得到的关于避免使用==
和!=
的建议通常是正确的,但有点过于简单化了。对浮点值进行相等或不相等的比较是完全合法的,并且具有非常明确的含义。然而,这很少是正确的做法
这背后有一些技术原因,但其要点是,数学上落在同一数字上的不同运算集往往最终得到不同的浮点值。仅仅改变一系列添加的顺序就可能导致不同的结果。所以像a + b == c + d
这样简单的东西本质上是不可靠的。
如果你想看看把事情搞砸有多容易,编译并运行以下程序:
#include <iostream>
#include <iomanip>
int main() {
std::cout << std::setprecision(17) << 0.1 << "n";
}
最后,按照要求回答您的问题:;实施在哪里">
在现代环境中,在您最有可能为其编译代码的通用cpu上,我们没有可供您参考的实现源代码。浮点运算直接作为cpu级指令完成。如果你在处理一些微控制器、旧架构或其他奇特的计算机,那就另当别论了。