在编写一些测试用例时,一些测试检查NaN的结果。
我试过使用std::isnan,但是断言失败了:
Assertion `std::isnan(x)' failed.打印出x的值后,结果是负NaN (-nan),这在我的情况下是完全可以接受的。
在试图使用NaN != NaN和assert(x == x)这一事实之后,编译器帮了我一个忙,并优化了断言。
我自己的isNaN函数也被优化了。
如何检查NaN和-NaN的相等性?
发布于 2011-09-17 14:29:47
预计isnan()与-ffast-math之间存在未定义的行为。
这是我在测试套件中使用的:
#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发布于 2010-08-29 21:26:26
有您应该能够使用的C99 isnan()。
如果在您的实现中,它不能正常工作(这是哪一个?)您可以实现您自己的,通过reinterpret_casting长和做IEEE比特魔术。
发布于 2010-08-29 21:52:58
在我看来,这就像是库的isnan()实现中的一个bug。gcc 4.2.1在雪豹身上工作得很好。不过,试试看呢?
std::isnan(std::abs(yourNanVariable));显然,我无法测试它,因为std::isnan(-NaN)是我的系统上的true。
编辑:使用-ffast-math,不管-O开关如何,gcc 4.2.1在雪豹上认为NAN == NAN是true,NAN == -NAN也是。这可能会严重破坏代码。我建议您不要使用-ffast-math,或者至少不要在使用它的构建中测试相同的结果。
https://stackoverflow.com/questions/3596622
复制相似问题