本文总结nan和inf在C语言当中的含义、产生和判定方法。

C语言当中的nan

表示not a number,等同于 #IND:indeterminate (windows)

产生:

对浮点数进行了未定义的操作;

  1. 对负数开方,对负数求对数,0.0/0.0,0.0*inf、inf/inf、inf-inf这些操作都会得到nan。(0/0会产生操作异常;0.0/0.0不会产生操作异常,而是会得到nan);
  2. 在GNU中,使用宏:float NAN对浮点数赋值;

判定:

库函数方法:(推荐)

<见后>

自定义函数:

 int isNumber(double d){return (d==d);}来判断d是否为nan,若d是nan则返回0,否则返回非零值。

注意:

  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宏才被定义;

C语言当中的inf

infinity (linux),等同于 #INF:infinity (windows)

产生:

超出浮点数的表示范围(溢出,即阶码部分超过其能表示的最大值);

  1. 1.0/0.0等于inf,-1.0/0.0等于-inf,0.0+inf=inf;log(0);
  2. 在C99中,使用宏:float INFINITY对浮点数赋值;

判定:

库函数方法:(推荐)

<见后>

自定义函数:

int isFiniteNumber(double d) {return (d<=DBL_MAX&&d>=-DBL_MAX);}
来判断d是否为一个finite数(既不是inf,又不是nan(加入d为nan,则d参加比较就会得到false(0)值))。

注意:

  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,并可以与其他浮点数进行比较的(可以参与<=、>+、==、!=等运算);

库函数方法判定inf和nan

下面这几个宏(用宏实现的,使用时跟函数的形式基本相同)是判断一个表达式的结果是否为inf、nan或其他:
 
     头文件:include<math.h>
     宏的用法(类似于函数原型):int fpclassify(x);
                                 int isfinite(x);
                                 int isnormal(x);
                                 int isnan(x);
                                 int isinf(x);
     具体用法:
          1、int fpclassify(x)
    用来查看浮点数x的情况,fpclassify可以用任何浮点数表达式作为参数,fpclassify的返回值有以下几种情况。
                  FP_NAN:x是一个“not a number”。
                  FP_INFINITE: x是正、负无穷。
                  FP_ZERO: x是0。
                  FP_SUBNORMAL: x太小,以至于不能用浮点数的规格化形式表示。
                  FP_NORMAL: x是一个正常的浮点数(不是以上结果中的任何一种)。
          2、int isfinite(x)  
    当(fpclassify(x)!=FP_NAN&&fpclassify(x)!=FP_INFINITE)时,此宏得到一个非零值。
          3、int isnormal(x)  当(fpclassify(x)==FP_NORMAL)时,此宏得到一个非零值。
          4、int isnan(x)   当(fpclassify(x)==FP_NAN)时,此宏返回一个非零值。
          5、int isinf(x)   
    当x是正无穷是返回1,当x是负无穷时返回-1。(有些较早的编译器版本中,无论是正无穷还是负无穷,都返回非零值,不区分正负无穷)。

参考资料:

C语言中的nan和inf使用的更多相关文章

  1. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  2. C 语言中 setjmp 和 longjmp

    在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

  3. c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  4. C语言中do...while(0)的妙用(转载)

    转载来自:C语言中do...while(0)的妙用,感谢分享. 在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语 ...

  5. C语言中,定义的含义?声明的含义?它们之间的区别是什么?

    在C语言中,对于定义和声明,也许我们非常的熟悉,但不一定真正的了解! 定义的含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名 ...

  6. C++中函数的默认参数和C语言中volatile的学习

    1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

  7. C语言中qsort函数用法

    C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

  8. c语言中time相关函数

    工作中遇到的函数: int seed = time(NULL); srand(seed); signal(SIGINT, stop); signal(SIGUSR1, sig_usr1); 搜time ...

  9. C语言中的static 详细分析

    转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...

随机推荐

  1. cratedb json 数据导入

    基本环境的搭建,可以参考相关文档,或者直接使用docker 安装 docker run -d -p 4200:4200 crate 导出mongodb数据(可选,同时使用工具进行数据类型转换) mon ...

  2. graphql 文档 docker 镜像

    因为一些原因 graphql 的官方文档无法查看,后者查看不能是方便,所以在官方github 的文档基础上添加了容器构建, 方便进行查看,对于公司内部使用学习会比较好 原理 很简单,openresty ...

  3. NET简单的一个画图程序

    using System; using System.Drawing; //HttpUtility.UrlEncode /// <summary> ///Curve 的摘要说明 /// & ...

  4. 949. Largest Time for Given Digits

    Given an array of 4 digits, return the largest 24 hour time that can be made. The smallest 24 hour t ...

  5. Android UiAutomator环境搭建及使用(QQ交流群:490451176)

    Android自动化框架常用的有很多,本身也提供了很多自动化测试框架,每个都有其优势和不足 .当然对于我们做UI自动化测试来说,简单易用即可. UiAutomator也是Android提供的自动化测试 ...

  6. SpringCloud初体验:四、API GateWay 服务网关

    网关服务很多,比如:Zuul.Kong.spring cloud gateway ……, 这里不纠结哪种性能好,本次体验是用的 spring cloud gateway 更多网关比较可以了解这篇文章: ...

  7. C++11新特性介绍 01

    阅读目录 1. 概述 2. long long 类型 3. 列表初始化 4. nullptr 空指针 5. constexpr变量 6. constexpr函数 7. using类型别名 8. aut ...

  8. sql 备忘

    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; select dbms_metadata.get_ddl('TABLE','TAB ...

  9. 关于eclipse open call hierarchy功能的一个细节

    这个功能对应的快捷键是ctrl alt H,大家应该都很熟悉了.默认是查找这个方法的被调用堆栈.90%的人应该也是习惯这个默认的功能的,也基本无视它的另一个功能. 昨天重启eclipe之后,我的ecl ...

  10. FoxPro 常用内部函数

    1.数学函数(数值函数) 求绝对值函数ABS 格式:ABS( expN) 求整函数INT 格式:INT( expN) 四舍五入函数ROUND 格式:ROUND( expN,〈保留小数位〉) 功能:按保 ...