首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >负NaN不是NaN吗?

负NaN不是NaN吗?
EN

Stack Overflow用户
提问于 2010-08-29 21:13:31
回答 5查看 14.7K关注 0票数 34

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

我试过使用std::isnan,但是断言失败了:

代码语言:javascript
复制
Assertion `std::isnan(x)' failed.

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

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

我自己的isNaN函数也被优化了。

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

EN

回答 5

Stack Overflow用户

发布于 2011-09-17 14:29:47

预计isnan()-ffast-math之间存在未定义的行为。

这是我在测试套件中使用的:

代码语言:javascript
复制
#if defined __FAST_MATH__
#   undef isnan
#endif
#if !defined isnan
#   define isnan isnan
#   include <stdint.h>
static inline int isnan(float f)
{
    union { float f; uint32_t x; } u = { f };
    return (u.x << 1) > 0xff000000u;
}
#endif
票数 5
EN

Stack Overflow用户

发布于 2010-08-29 21:26:26

有您应该能够使用的C99 isnan()。

如果在您的实现中,它不能正常工作(这是哪一个?)您可以实现您自己的,通过reinterpret_casting长和做IEEE比特魔术。

票数 1
EN

Stack Overflow用户

发布于 2010-08-29 21:52:58

在我看来,这就像是库的isnan()实现中的一个bug。gcc 4.2.1在雪豹身上工作得很好。不过,试试看呢?

代码语言:javascript
复制
std::isnan(std::abs(yourNanVariable));

显然,我无法测试它,因为std::isnan(-NaN)是我的系统上的true

编辑:使用-ffast-math,不管-O开关如何,gcc 4.2.1在雪豹上认为NAN == NANtrueNAN == -NAN也是。这可能会严重破坏代码。我建议您不要使用-ffast-math,或者至少不要在使用它的构建中测试相同的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3596622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档