x!=x 是实现 std::isnan() 的合法方式吗

NoS*_*tAl 4 c++ optimization stl visual-c++

尽管 Microsoft 博客声称std::isnan在我的代码中使用其他方式仍然会生成对 c++ 运行时而不是 inlined 的调用ucomiss。现在我用x!=xcheck解决了这个问题(因为在这段代码中性能对我很重要),但这让我想知道......如果x!=x是一种检查 NaNess 的方法,这不是一种简单的实现方法std::isnan吗?

但据我所知,gcc/clang 使用内在函数(并且 msvc 正在尝试)。如果它可以作为正常功能有效实现,他们为什么要打扰?

所以我有点困惑,因为SO 上的一个答案声称这是自我比较可以返回错误的唯一方法。

Bat*_*eba 5

C++ 标准委员会(终于?)在这个问题上听取了数字学家的意见。在 C++11 之前,习语

x != x
Run Code Online (Sandbox Code Playgroud)

确实用于检查 NaN-ness。没有其他类型的浮点数值适用于该习语。但它从来没有坐得特别好。首先,一些 NaN 可以引发异常。它也容易受到错误重构的影响。您还可以假设一些浮点标准,例如常见的 IEEE754。

从 C++11 开始,使用std::isnan是更受欢迎的。