一、什么是NaN?
NaN(Not a Number)是一个特殊的数值,它用于表示一个本来要返回数值的操作数但未返回数值的情况。
二、NaN的产生
先看下面这张截图,截图中包括产生的代码和类型的打印。
从上图不难看出,之所以会出现NaN是因为对float数进行了不正当操作。
产生场景:对浮点数(float)进行了未定义的操作:
①对负数开方,对负数求对数,0.0/0.0,0.0*inf、inf/inf、inf-inf这些操作都会得到NaN;
②在GNU中,使用宏:float NAN对浮点数赋值。
三、判定方法
使用系统提供的判定的方法:isnan(x)
四、注意
1.nan是无序的(unordered),它不大于、小于或等于任何数(包括它自己),所以,nan==nan 结果是0或false;另外将<,>,<=,和>=作用于nan产生一个exception;
2.得到nan时就查看是否有非法操作;
3.如果表达式中含有nan,那么表达式的结果为nan;
4.对于NaN的实现有两种方式:signaling NaN 和 quiet NaN。signaling NaN就是抛出异常的方式,因此它不需要定义NaN宏。quiet NaN就是即使在计算出现异常的情况下也不抛出异常从而中断程序的执行、而是将结果表示为一个特殊的值, 因此只有在这种情况下NaN宏才被定义。
五、什么是Inf
infinity (linux),等同于 #INF:infinity (windows)
六、产生(可参考NaN产生情况中的图)
超出浮点数的表示范围(溢出,即阶码部分超过其能表示的最大值);
①1.0/0.0等于inf,-1.0/0.0等于-inf,0.0+inf=inf;log(0);
②在C99中,使用宏:float INFINITY对浮点数赋值;
七、判定方法
使用系统提供的判定的方法:isinf(x)
八、注意点
1.+inf大于任何数(除了它自己和nan);-inf小于任何数(除了它自己和nan);
2.得到inf时就查看是否有溢出或者除以0;
3.头文件<float.h>中,有定义的常量DBL_MAX,这个常量表示“能表示出来的最大的双精度浮点型数值”。<float.h>中还有常量DBL_MIN,DBL_MIN表示可以用规格化表示的最小的正浮点数,但DBL_MIN并不是最小的正浮点数,因为可以用可以用非规格化浮点数表示的更小;
4.inf在C语言表达式中就表示数学里无限的概念,如1.0/inf等于0.0,并可以与其他浮点数进行比较的(可以参与<=、>+、==、!=等运算);