欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[备忘录] C 中的 nan 和 inf

最编程 2024-05-07 22:25:50
...

引言

在数据处理输入输出时,可能遇到数据读入空值(极大、极小)、运算中分母为0或0.0,对0取对数等操作。将产生nan或inf 。

NAN的产生原因

nan:not a number, 表示 “无效数字”

  1. 对负数开方,
  2. 对负数求对数
  3. 0.0*inf
  4. inf/inf
  5. inf-inf

注意:nan是无序的(unordered), 无法对其进行逻辑运算。他不大于,小于或者等于任何数(包括自己),将< > <= >= 作用于nan产生一个exception. 得到nan时就查看是否有非法操作,如果表达式中含有nan, 那么表达式的结果为nan。

INF的产生原因

INF:infinite,表示“无穷大”
超出浮点数的表示范围(溢出)

  1. 1.0/0.0 = inf
  2. -1.0/0.0 = inf
  3. 0.0+inf = inf
  4. log(0)

注意: 得到inf时就看是否有溢出或者除以0。inf在C语言表达式中就表示数学里无限的概念,如: 1.0/inf等于0.0 ,并可以与其它浮点数进行比较(可以参与<= , >+, ==, != 等运算)

nan和inf的判断

#include <math.h>

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 <stdio.h>
#include <math.h>

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 <stdio.h>
#include <math.h>

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

推荐阅读