3 回答
TA贡献1836条经验 获得超13个赞
根据ieee标准,nan值具有奇怪的属性,涉及它们的比较是总假的。也就是说,对于浮子f来说,f != f
会是真的只如果f是南。
注意,正如下面的一些注释所指出的,并非所有编译器在优化代码时都尊重这一点。
对于任何声称使用ieee浮点的编译器,此技巧应工作。但我不能保证将要在实践中工作
TA贡献2021条经验 获得超8个赞
没有isnan()
函数在当前的C+标准库中可用。它是在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功能,所有这些特性或只有一些特性(VisualC+9.0不提供C99数学函数)。
如果TR1可用,那么cmath
包括C99元素,如isnan()
, isfinite()
等等,但它们被定义为函数,而不是宏,通常在std::tr1::
命名空间,尽管许多实现(即Linux上的GCC 4+或MacOSX10.5+上的XCode)将它们直接注入到std::
,所以std::isnan
定义得很清楚。
此外,C+的一些实现仍然使C99isnan()
可用于C+的宏(包括cmath
或math.h
),什么会引起更多的混乱,开发人员可能会认为这是一种标准行为。
如上文所述,关于VIZE C+的说明没有提供std::isnan
两样std::tr1::isnan
,但是它提供了一个定义为_isnan()
从那时起就有了Visual C+6.0
在XCode上,还有更多的乐趣。如前所述,GCC 4+定义了std::isnan
..对于较早版本的编译器和库表单XCode,似乎(这里是相关讨论),还没有机会检查我自己)定义了两个函数,__inline_isnand()
关于英特尔和__isnand()
在电源PC上。
- 3 回答
- 0 关注
- 1527 浏览
添加回答
举报