阅读:0       作者:严长生

NaN(Not a Number),表示一个无效数字

NaN(Not a Number)表示一个无效的数字,或者该数字未经初始化。NaN 是针对浮点数而言的,不适用于整数。

将浮点数的某些位(Bit)设置为特定的值,就表示该浮点数是一个 NaN,具体请猛击《小数在内存中是如何存储的,揭秘诺贝尔奖级别的设计(长篇神文)》。换句话说,NaN 是可以在内存中表示出来的。

你可以使用 isnan() 函数(其实是一个宏)来检测一个浮点数的值是否是 NaN,你也可以使用 nan()、nanf()、nanl() 来创建一个 NaN 值。

在 <math.h> 头文件中,很多函数的返回值是浮点类型,并且这些函数对参数的取值范围也有要求,如果参数的值不在取值范围之内,函数就会发生域错误;当发生域错误时,这些函数就会将返回值设置为 NaN,表示返回值无效。想进一步了解域错误,请猛击《域错误(domain error)》。

例如,sqrt() 函数仅能对非负数求平方根,如果我们给它传递一个负数,那么就会发生域错误,此时的返回值就是 NaN。

输出 NaN

在C语言中,可以使用 printf() 来输出一个 NaN 值,请看下面的例子:
#include <stdio.h> /* printf */
#include <math.h> /* sqrt */
int main()
{
    double result = sqrt(-100);
    printf("result = %lf\n", result);
    return 0;
}
在 VS2015 下的运行结果:
result = -nan(ind)

在 GCC 下的运行结果:
result = -nan

在 Xcode 下的运行结果:
result = nan

可以发现,不同的编译器输出结果不一样。这是因为,如何输出 NaN,或者说如何具体展示出 NaN,是由 <math.h> 头文件下的 NAN 宏决定的,不同的编译器对该宏的实现不一样,所以就导致了不同的编译器有不同的输出结果。