【问题标题】:Is x!=x legal way to implement std::isnan()x!=x 是实现 std::isnan() 的合法方式吗
【发布时间】:2021-01-14 17:28:14
【问题描述】:

虽然 Microsoft 博客 claim 否则在我的代码中使用 std::isnan 仍然会生成对 c++ 运行时的调用,而不是内联 ucomiss。 现在我用x!=x检查解决了这个问题(因为在这段代码中性能对我很重要),但这让我想知道......如果x!=x是一种检查NaNess的方法,那不是一个简单的方法实现std::isnan

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

所以我有点困惑,因为 SO 上的 answers 之一声称这是 selfcomparison 可以返回 false 的唯一方法。

【问题讨论】:

  • 比较时信号 NaN 不会提高吗?
  • 我认为它是作为内在实现的:godbolt.org/z/7M6cK5
  • @AlexGuteniev 在某些情况下有效,在某些情况下无效...我无法将我的真实示例简化为在 Godbolt 上无效的内容...

标签: c++ optimization visual-c++ stl


【解决方案1】:

C++ 标准委员会(终于?)听取了数字专家的意见。在 C++11 之前,成语

x != x

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

从 C++11 开始,使用std::isnan 是首选。

【讨论】:

  • 如果我在我的代码库中看到 x != x,我会将其更改为 false,这样它就会中断并且作者吸取教训并使用更清晰的结构,例如 isnan
  • @Jeffrey:过去我坚持认为它是用函数编写的。我从来没有遇到过优化表达式的编译器 - 那将是一个编译器错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2016-07-19
相关资源
最近更新 更多