检查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 ++(通过cmath
或math.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是NaN
, false
,否则
参考
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,因为x
是NaN
。
然而,最后一个选项可能不适用于每个编译器和某些设置(特别是优化设置),因此,在最后的手段中,您始终可以检查位模式...
链接地址: 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