【发布时间】:2011-04-05 12:39:40
【问题描述】:
在编写一些测试用例时,一些测试会检查 NaN 的结果。
我尝试使用std::isnan,但断言失败:
Assertion `std::isnan(x)' failed.
打印x 的值后,结果发现它是负NaN (-nan),这在我的情况下是完全可以接受的。
在尝试使用NaN != NaN 和assert(x == x) 之后,编译器帮了我一个忙,并优化了断言。
我自己的 isNaN 函数也正在优化中。
如何检查 NaN 和 -NaN 的相等性?
【问题讨论】:
-
o_O?负数 NaN 是 NaN。
-
您能否展示您如何编写自己的
isNaN,或者如果您有编译器中的内置函数?测试 a NaN 的一种方法(如您所见,有几种)是测试 en.wikipedia.org/wiki/NaN 的位模式(指数为 11..11)。 -
@KennyTM 来自 Wikipedia:“因为在实践中,编码的 NaN 既有符号,也有可选的‘诊断信息’(有时称为有效负载),这些通常也可以在 NaN 的字符串表示中找到,例如:-NaN"。有一个 NaN 或很多 NaN,具体取决于您如何看待它,这个编译器打印它的方式可能比有用更令人困惑。
-
对我来说,这听起来像是您的标准库的
std::isnan实现中的一个错误。 -
考虑到我已经听说过的一些恐怖故事,即使在 glibc 中我也不觉得有这样的错误的想法令人惊讶。这是善意的,不要误会我的意思,但编译器作者长期以来一直犯错浮点数。