检查C ++中的双精度(或浮点数)是否为NaN

是否有一个isnan()函数?

PS:我在MinGW(如果这有所作为)。

我通过使用<math.h> isnan()解决了这个问题,该解决方案不存在于<cmath> ,我首先是#include


根据IEEE标准,NaN值具有奇怪的特性,即涉及它们的比较总是错误的。 也就是说,对于浮点数f,只有当f是NaN时, f != f才会成立。

请注意,正如下面的一些评论所指出的那样,并不是所有编译器在优化代码时都会尊重这一点。

对于声称使用IEEE浮点的任何编译器来说,这个技巧应该可行。 但我不能保证它会在实践中发挥作用。 如果有疑问,请咨询您的编译器。


当前的C ++标准库中没有可用的isnan()函数。 它是在C99中引入的,并且被定义为一个宏而不是函数。 由C99定义的标准库的元素不是当前C ++标准ISO / IEC 14882:1998的一部分,也不是其更新ISO / IEC 14882:2003的一部分。

在2005年提出技术报告1。 TR1将C99与C ++兼容。 尽管事实上它从未被正式采用成为C ++标准,但许多(GCC 4.0+或Visual C ++ 9.0+ C ++实现都提供了TR1功能,所有这些功能或只有一些功能(Visual C ++ 9.0不提供C99数学功能) 。

如果TR1可用,那么cmath包含像isnan()isfinite()等C99元素,但它们被定义为函数,而不是宏,通常在std::tr1:: namespace中,尽管许多实现(即GCC 4+ Linux或Mac OS X 10.5+的XCode)将它们直接注入到std:: ,所以std::isnan已经定义好了。

此外,C ++的某些实现仍然使得C99 isnan()宏可用于C ++(通过cmathmath.h包含),可能会导致更多混淆,开发人员可能会认为这是一种标准行为。

关于Viusal C ++的说明,如上所述,它不提供std::isnan既不是std::tr1::isnan ,但它提供了一个定义为_isnan()的扩展函数,自从Visual C ++ 6.0

在XCode上,还有更多的乐趣。 如前所述,GCC 4+定义了std::isnan 。 对于老版本的编译器和库形式XCode,似乎(这里是相关讨论),没有机会检查自己)定义了两个函数,Intel上的__inline_isnand()和Power PC上的__isnand()


第一个解决方案:如果你使用C ++ 11

由于这个问题有一些新的发展:知道std::isnan()是C ++ 11的一部分是很重要的

概要

在标题<cmath>定义

bool isnan( float arg ); (since C++11)
bool isnan( double arg ); (since C++11)
bool isnan( long double arg ); (since C++11)

确定给定浮点数arg是否不是数字( NaN )。

参数

arg :浮点值

返回值

true如果arg是NaNfalse ,否则

参考

http://en.cppreference.com/w/cpp/numeric/math/isnan

请注意,如果您使用g ++,这与-fast-math不兼容,请参阅下面的其他建议。


其他解决方案:如果您使用非C ++ 11兼容工具

对于C99,在C中,这是作为返回int值的宏isnan(c)实现的。 x的类型应为float,double或long double。

各种供应商可能会或可能不会包含或不包含isnan()函数。

假定便携式方法检查NaN是使用NaN不等于自身的IEEE 754属性:即x == x将为false,因为xNaN

然而,最后一个选项可能不适用于每个编译器和某些设置(特别是优化设置),因此,在最后的手段中,您始终可以检查位模式...

链接地址: http://www.djcxy.com/p/73349.html

上一篇: Checking if a double (or float) is NaN in C++

下一篇: When do Iterators in the following cases become invalidated