为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
江户川乱折腾 2019-06-24 15:35:46
检查C+中的双(或浮点数)是否为NaN有isnan()函数吗?PS:我加入了MinGW(如果这有区别的话)。通过使用isnan()<math.h>,它并不存在于<cmath>,我是#include刚开始的时候。
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

根据ieee标准,nan值具有奇怪的属性,涉及它们的比较是假的。也就是说,对于浮子f来说,f != f会是真的如果f是南。

注意,正如下面的一些注释所指出的,并非所有编译器在优化代码时都尊重这一点。

对于任何声称使用ieee浮点的编译器,此技巧工作。但我不能保证将要在实践中工作


查看完整回答
反对 回复 2019-06-24
?
宝慕林4294392

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+的宏(包括cmathmath.h),什么会引起更多的混乱,开发人员可能会认为这是一种标准行为。

如上文所述,关于VIZE C+的说明没有提供std::isnan两样std::tr1::isnan,但是它提供了一个定义为_isnan()从那时起就有了Visual C+6.0

在XCode上,还有更多的乐趣。如前所述,GCC 4+定义了std::isnan..对于较早版本的编译器和库表单XCode,似乎(这里是相关讨论),还没有机会检查我自己)定义了两个函数,__inline_isnand()关于英特尔和__isnand()在电源PC上。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 1527 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信