在C++中检查double(或float)是否为NaN

417

有isnan()函数吗?

PS.:我在使用MinGW(如果有区别的话)。

我通过使用<math.h>中的isnan()解决了这个问题,但是在一开始我使用的<cmath>中并不存在该函数。


2
我不纯净,但你可以以可移植的方式完成它。谁说C++需要IEEE754? - David Heffernan
3
只是提醒一下,预防胜于治疗。换句话说,防止 0.f/0.f 的执行要比事后检查代码中的 nan 要好得多。如果允许 nan 不断蔓延,它会给你的程序带来严重破坏,并可能引入难以找到的 bug。这是因为 nan 是有毒的,(5*nan=nan), nan 不等于任何东西 (nan != nan),nan 不大于任何东西 (nan !> 0),nan 不小于任何东西 (nan !< 0)。 - bobobobo
1
@bobobobo:这是一项功能,允许集中式错误检查。就像异常与返回值一样。 - Ben Voigt
2
为什么<cmath>没有isnan()函数?它在std::中。 - frankliuao
21个回答

-3

通过检查它是否在double极限范围内,可以在Visual Studio中检测无穷大和NaN:

//#include <float.h>
double x, y = -1.1; x = sqrt(y);
if (x >= DBL_MIN && x <= DBL_MAX )
    cout << "DETECTOR-2 of errors FAILS" << endl;
else
    cout << "DETECTOR-2 of errors OK" << endl;

请仔细检查FLT_MINDBL_MINLDBL_MIN的定义。它们被定义为每种类型的最小规范化值。例如,单精度有超过800万个合法的非规范化值,它们大于零且小于FLT_MIN(并且不是NaN)。 - Steve Hollasch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接