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

4
尽管微软博客声称使用std::isnan在我的代码中仍会生成对c++运行时的调用,而不是内联的ucomiss。现在我通过x!= x检查(因为在这段代码中我的性能很重要)解决了这个问题,但这让我想知道...如果x!= x是一种检查NaN的方法,那么实现std::isnan不就容易了吗?
但据我所知,gcc/clang使用内置函数(而msvc正在尝试)。如果可以将其作为普通函数有效地实现,他们为什么要费心呢?
所以我有点困惑,因为SO上的答案之一声称这是自我比较可以返回false的唯一方式。

当进行比较时,信号NaN会引发吗? - StoryTeller - Unslander Monica
我认为它被实现为内部函数:https://godbolt.org/z/7M6cK5 - Alex Guteniev
@AlexGuteniev 在某些情况下它可以工作,在某些情况下它不能... 我无法将我的真实示例缩小到在godbolt上无法工作的程度... - NoSenseEtAl
1个回答

5

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

x != x

确实使用了检查NaN的方式。对于浮点数没有其他类别的值适用这种方法,但它并不是特别好。首先,一些NaN会引发异常。它也容易受到错误的重构影响。您还可能假定某些浮点标准,例如常见的IEEE754。

从C ++ 11开始,最好使用std::isnan


如果我在代码库中看到 x != x,我会将其改为false,以便它出现错误并且作者学会使用更清晰的构造,比如 isnan - Jeffrey
@Jeffrey:在过去,我坚持要将其写成一个函数。但我从未遇到过编译器会优化掉该表达式的情况——那将是编译器的一个错误。 - Bathsheba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接