引言
在数据处理输入输出时,可能遇到数据读入空值(极大、极小)、运算中分母为0或0.0,对0取对数等操作。将产生nan或inf 。
NAN的产生原因
nan:not a number, 表示 “无效数字”
对负数开方,
对负数求对数
0.0*inf
inf/inf
inf-inf
注意:nan是无序的(unordered), 无法对其进行逻辑运算。他不大于,小于或者等于任何数(包括自己),将< > <= >= 作用于nan产生一个exception. 得到nan时就查看是否有非法操作,如果表达式中含有nan, 那么表达式的结果为nan。
INF的产生原因
INF:infinite,表示“无穷大”
超出浮点数的表示范围(溢出)
1.0/0.0 = inf
-1.0/0.0 = inf
0.0+inf = inf
log(0)
注意: 得到inf时就看是否有溢出或者除以0。inf在C语言表达式中就表示数学里无限的概念,如: 1.0/inf等于0.0 ,并可以与其它浮点数进行比较(可以参与<= , >+, ==, != 等运算)
nan和inf的判断
#include
int isfinite(x); // 判断x是否有限,是返回1, 其他返回0;
int isnormal(x); // 判断x是否为一个数(非inf或nan)是返回1, 其他返回0;
int isnan(x); // 当x为nan时返回1,其他返回0;
int isinf(x); // 当x是正无穷时返回1,负无穷时返回-1,其他返回0
例子 nan
#include
#include
int main()
{
printf("isnan(0.0) : %d\n", isnan(0.0));
printf("isnan(1.0/0.0) : %d\n", isnan(1.0/0.0));
printf("isnan(-1.0/0.0) : %d\n", isnan(1.0/0.0));
printf("isnan(sqrt(-1.0)) : %d\n", isnan(sqrt(-1.0)) );
return 0;
}
输出:
isnan(0.0) : 0
isnan(1.0/0.0) : 0
isnan(-1.0/0.0) : 0
isnan(sqrt(-1.0)) : 1
例子 inf
#include
#include
int main()
{
printf("isinf(0.0) : %d\n", isinf(0.0));
printf("isinf(1.0/0.0) : %d\n", isinf(1.0/0.0));
printf("isinf(-1.0/0.0) : %d\n", isinf(1.0/0.0));
printf("isinf(sqrt(-1.0)) : %d\n", isinf(sqrt(-1.0)) );
return 0;
}
输出:
isinf(0.0) : 0
isinf(1.0/0.0) : 1
isinf(-1.0/0.0) : 1
isinf(sqrt(-1.0)) : 0