内置类型的实现在哪里:C++中的float/double
有人告诉我,避免在 C++ 中对 float/double 类型执行 equal 或 not_equal 。但是有std::equal_to和std::not_equal_to模板函数。
所以我想知道在 C++ 中的 float/double 上使用 std::equal_to 和 std::not_equal_to 是否可靠?
我想知道的执行内置型:浮点/双精度在C ++中,但我无法找到他们的源代码。你能把他们的源代码也分享给我吗?
回答
首先,为了解决这个问题:
在我所知道的,标准库中的所有实现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 级指令完成。如果您正在处理一些微控制器、旧架构或其他奇特的计算机,那将是另一回事。
- @zhishan You'd need to write a function that does specifically this, but that's a very hard function to write correctly without being extremely familiar with the intricacies of floating-point behavior.