浮点数NaN和INF(#IND, #INF)

参考:

http://www.cplusplus.com/reference/cmath/isnan/

http://technet.microsoft.com/zh-cn/tzthab44(v=vs.95)

http://blog.163.com/chen_dawn/blog/static/112506320125494852135/

http://blog.csdn.net/zhang11wu4/article/details/7781099

http://baike.baidu.com/view/1634738.htm?fr=aladdin

http://bbs.csdn.net/topics/110121822

http://blog.csdn.net/sunmenggmail/article/details/7853081

http://stackoverflow.com/questions/570669/checking-if-a-double-or-float-is-nan-in-c

NaN&INF定义

在一些情况会出现无效的浮点数,例如除0,例如负数求平方根等,像这类情况,获取到的浮点数的值是无效的。

NaN 即 Not a Number         非数字

INF  即 Infinite            无穷大

通常无效浮点数的内存表示方法是:

根据IEEE 754标准:

阶码全1,尾数全0表示无穷大INF。例如1.0/0.0

阶码全1,尾数非全0的表示无效数NaN。例如:求负数的平方根,例如0.0/0.0。

(注意: int型时除0是非法的,产生运行异常。Remember,integer
division by 0 causes a runtime exception
.)

INF无穷大:在doulbe/float时的取值

float f = 0; (4字节 1位符号位,8位指数,23位小数,指数偏移127)

*(UINT*)&f = 0x7F800000L;//正无穷(二进制 [0111 1111] [1000 0000] [0000 0000] [0000 0000])

*(UINT*)&f = 0xFF800000L;//负无穷(二进制 [1111 1111] [1000 0000] [0000 0000] [0000 0000])

double var = 0; (8字节 1位符号位,11位指数,52位小数,指数偏移1023)

// 因为通常是little endian,所以通常修改其前后4个字节

UINT* pVar = ((UINT*)&var) + 1;

*(pVar) = 0x7FF00000L;//正无穷

*(pVar) = 0xFFF00000L;//负无穷

常用的浮点数INF&NaN判断方法:

1.    
Windows中,使用_isnan判断NaN情况;使用!_isnan && !_finite判断INF情况;使用!_finite判断NaN和INF两种情况

_isnan 
//it returns a nonzero value if the argument x is a NaN;

_finite //It returns 0 if the argument is infinite or a NaN.

2.Linux中,使用insnan和isinf两个函数分别判别两种情况:

isNan

isInf

3.也可自己来写:

int isNaN(double x) {return
x != x; }

#define _INF_DEFINE 1.0/0.0

int isInf(double n)

{

static double pinf = 0.0;

static double ninf = 0.0;

if (pinf == 0.0) {

pinf = _INF_DEFINE;

ninf = -pinf;

}

return memcmp(&n, &pinf, sizeof(n)) == 0

|| memcmp(&n, &ninf, sizeof(n)) == 0;

}

依据:

1.   NaN是唯一与自身不等的浮点数类型,所以IsNan可以用 x != x来判断。Anything compared with NAN is false, so NAN == NAN is false.

2.   INF阶码全1,尾数全0

还有一种借用isNan定义INF的方法

int isInf(double x) {return !isNaN(x) && isnan(x-x);}

依据:

1.   Inf – Inf得到的为NaN

附一段测试代码

#include "stdio.h"

void ViewHex(double x)
{
	unsigned int* pUInt = ((unsigned int*)(&x));
	printf("0x%08X  ", *pUInt);
	pUInt++;
	printf("0x%08X\n", *pUInt);
}
int main()
{
	double a = 1.0/0.0;
	double b = 0.0/0.0;
	double c = a-a;
	printf("%f\n%f\n%f\n", a, b, c);
	printf("%f\n%f\n%f\n", -a, -b, -c);
	ViewHex(a);
	ViewHex(b);
	ViewHex(c);
	ViewHex(-a);
	ViewHex(-b);
	ViewHex(-c);
	getchar();
        return 0;
}

// 测试输出(运行环境: window 编译程序:mingw/gcc)

inf

nan

nan

-inf

nan

nan

0x00000000 0x7FF00000

0x00000000 0xFFF80000

0x00000000 0xFFF80000

0x00000000 0xFFF00000

0x00000000 0x7FF80000

0x00000000 0x7FF80000

时间: 2024-10-05 23:00:09

浮点数NaN和INF(#IND, #INF)的相关文章

C语言中的nan和inf使用

本文总结nan和inf在C语言当中的含义.产生和判定方法. C语言当中的nan 表示not a number,等同于 #IND:indeterminate (windows) 产生: 对浮点数进行了未定义的操作: 对负数开方,对负数求对数,0.0/0.0,0.0*inf.inf/inf.inf-inf这些操作都会得到nan.(0/0会产生操作异常:0.0/0.0不会产生操作异常,而是会得到nan): 在GNU中,使用宏:float NAN对浮点数赋值: 判定: 库函数方法:(推荐) <见后>

inf&amp;nan(摘录自百度)

摘录自百度(http://zhidao.baidu.com/link?url=Vv8vThjOgVIl1WV_WF_9yJcGVwt_2RkwdK3nyNuRZJa_tKOf0hSDUpratetydnXnb6FsBaUbJF3xtCsVEfULga) inf :infinity (linux) 等同于 #INF:infinity (windows) nan :not a number 等同于 #IND:indeterminate (windows) 注意:1.inf一般是因为得到的数值,超出浮

inf -inf nam

http://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html 20.5.2 Infinity and NaN IEEE 754 floating point numbers can represent positive or negative infinity, and NaN (not a number). These three values arise from calculations whose resu

OCX调用dll打成cab包时候inf文件编写

动态库:kdm_dll.dll ocx控件:UnionKdm.ocx inf文件:UnionKdm.inf 其中inf文件编写方式格式如下: [version] signature="$CHICAGO$" AdvancedINF=2.0 [DefaultInstall] CopyFiles=InstallFilesSection,InstallInfSection RegisterOCXs=RegisterOCXSection [DefaultUninstall] cleanup=1

Windows驱动 INF文件

参考一:百度百科 参考二:INF文件的节 参考三:wikipedia 参考四:MSDN: INF File INF文件的节 INF文件是一个文本文件,由许多按层次结构排列的节组成,他们以方括号中的节名称开始,如[Version].[Manufacturer]等,后面是改接所含有的各个项,如Signature.DriverVer等.节中各项的基本定义格式为 entry=value[,value…] 其中,“entry”标示项名称,“value”标示该想的取值.节名和项名称都不区分大小写,且对于Wi

INF文件

百科:http://baike.baidu.com/view/637107.htm?fr=ala0_1_1 INF简介 INF是Device INFormation File的英文缩写,是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,是Windows操作系统下用来描述设备或文件等数据 信息的文件.INF文件是由标准的ASCII码组成,您可以用任何一款文字编辑器查看修改其中的内容.一般我们总是认为INF文件是系统设备的驱动程序, 其实这是错误的认识,Windows之所以在

n 个数 最大数 最小数 INF的使用

输入n n 个数    最大数    最小数 Input 5 1 5 2 3 6 Output 1  6 #include<iostream> #include<algorithm> using namespace std; int main() { int n, i, a[1000]; while(cin>>n) { for(i=0; i<n;i++) cin>>a[i]; sort(a,a+n); cout<<a[0]<<&

Java Math 类中的新功能--浮点数

Java™语言规范第 5 版向 java.lang.Math和 java.lang.StrictMath添加了 10 种新方法,Java 6 又添加了 10 种.这个共两部分的系列文章的 第 1 部分介绍了很有意义的新的数学方法.它提供了在还未出现计算机的时代中数学家比较熟悉的函数.在第 2 部分中,我主要关注这样一些函数,它们的目的是操作浮点数,而不是抽象实数. 就像我在 第 1 部分中提到的一样,实数(比如 e或 0.2)和它的计算机表示(比如 Java double)之间的区别是非常重要的

平方根的C语言实现(一) —— 浮点数的存储

曾经做一个硬件成本极度控制的项目,因为硬件成本极低,并且还需要实现较高的精度测量,过程中也自己用C语言实现了正弦.余弦.反正切.平方根等函数. 以下,无论是在我的实际项目中还是本地的计算机系统,int都是4个字节且机器为小端,除非特别提及,否则都如此默认.按理float的存储没有大小端之分,可是的确在powerpc大端上浮点数的存储也一样是和X86/ARM这样的小端机相反.不过因为正好因大小端而决定浮点数的存储顺序,那么本系列贴子里所有的C语言程序至少在powerpc大端上也是效果相同的. 尽管