阅读: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。
result = -nan(ind)
在 GCC 下的运行结果:
result = -nan
在 Xcode 下的运行结果:
result = nan
可以发现,不同的编译器输出结果不一样。这是因为,如何输出 NaN,或者说如何具体展示出 NaN,是由 <math.h> 头文件下的 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 宏决定的,不同的编译器对该宏的实现不一样,所以就导致了不同的编译器有不同的输出结果。