负NaN不是NaN吗?

新手上路,请多包涵

在编写一些测试用例时,一些测试会检查 NaN 的结果。

我尝试使用 std::isnan 但断言失败:

 Assertion `std::isnan(x)' failed.

打印 x 的值后,结果是负 NaN ( -nan ),这在我的情况下是完全可以接受的。

在尝试使用 NaN != NaN 并使用 assert(x == x) 的事实后,编译器帮了我一个忙并优化了断言。

制作我自己的 isNaN 函数也在优化中。

如何检查 NaN -NaN 的相等性?

原文由 LiraNuna 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 557
2 个回答

这很尴尬。

编译器(在本例中为 GCC)优化比较并且 isnan 返回 false 的原因是因为我的团队中有人打开了 -ffast-math

从文档:

-ffast-数学
    设置 -fno-math-errno、-funsafe-math-optimizations、-fno-trapping-math、
    -ffinite-math-only、-fno-rounding-math、-fno-signaling-nans 和
    fcx-有限范围。

    此选项导致定义预处理器宏 __FAST_MATH__。

    任何 -O 选项都不应打开此选项,因为它可能导致
    依赖于 IEEE 的精确实现的程序的错误输出
    或数学函数的 ISO 规则/规范。

注意结尾句 -ffast-math 是不安全的。

原文由 LiraNuna 发布,翻译遵循 CC BY-SA 4.0 许可协议

您应该可以使用 C99 isnan()。

如果在您的实现中它不能正常工作(那是哪一个?)您可以通过 reinterpret_casting 到 long 并执行 IEEE 位魔术来实现自己的。

原文由 Pavel Radzivilovsky 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题