c语言判断nan
1. c语言中INF和NAN是什么意思
inf :infinity (linux) 等同于 #INF:infinity
(windows)
nan :not a
number 等同于
#IND:indeterminate (windows)
注意:1、inf一般是因为得到的数值,超出浮点数的表示范围(溢出,即阶码部分超过其能表示的最大值);而nan一般是因为对浮点数进行了未定义的操作,如对-1开方。
2、nan==nan
结果是0或false,即不能和nan进行比较,和nan进行比较得到的结果总是false或0。所以可以用函数: int
isNumber(double d){return (d==d);}来判断d是否为nan,若d是nan则返回0,否则返回非零值。
3、1.0/0.0等于inf,-1.0/0.0等于-inf,0.0+inf=inf;
4、对负数开方sqrt(-1.0)、对负数求对数(log(-1.0))、0.0/0.0、0.0*inf、inf/inf、inf-inf这些操作都会得到nan。(0/0会产生操作异常;0.0/0.0不会产生操作异常,而是会得到nan)
5、得到inf时就查看是否有溢出或者除以0,得到nan时就查看是否有非法操作。
6、C语言的头文件<float.h>中,有定义的常量DBL_MAX,这个常量表示“能表示出来的最大的双精度浮点型数值”。<float.h>中还有常量DBL_MIN,DBL_MIN表示可以用规格化表示的最小的正浮点数,但DBL_MIN并不是最小的正浮点数,因为可以用可以用非规格化浮点数表示的更小。可以用函数:int
isFiniteNumber(double d){return
(d<=DBL_MAX&&d>=-DBL_MAX);}来判断d是否为一个finite数(既不是inf,又不是nan(加入d为nan,则d参加比较就会得到false(0)值))。
7、1.0/inf等于0.0。
8、inf是可以与其他浮点数进行比较的,即可以参与<=、>+、==、!=等运算。下面这几个宏(用宏实现的,使用时跟函数的形式基本相同)是判断一个表达式的结果是否为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。(有些较早的编译器版本中,无论是正无穷还是负无穷,都返回非零值,不区分正负无穷)。
2. C语言中INF和NAN是什么意思
在C语言中,INF和NAN是两个特殊的浮点数概念。INF代表无穷大,当计算结果超出浮点数表示范围时,通常表示为正无穷(在Linux中)或#INF:infinity(在Windows中)。NAN则是“非数字”,表示浮点数运算中的未定义状态,如开平方根或对负数求对数等操作的结果,其在Windows中表现为#IND:indeterminate。
当遇到INF,通常意味着发生了数值溢出或除以零的情况。NAN与NAN的比较总是返回false或0,因此不能直接比较。为了检测NAN,可以使用函数isNumber(double),如果输入为NAN,则返回0,否则返回非零值。
在C语言的头文件中,提供了几个宏来判断浮点数的类型,如fpclassify、isfinite、isnormal、isnan和isinf。fpclassify用于识别NAN、无穷大、零、非规格化和正常数,isfinite仅返回非无穷非NAN的结果,isnormal表示正常的浮点数,isnan检测NAN,而isinf则区分正负无穷大。
例如,1.0/0.0会得到正无穷(inf),而sqrt(-1.0)或0.0/0.0会得到NAN。在进行比较或运算时,如1.0/inf,结果会是0.0。通过这些宏,程序员可以准确地处理这些特殊浮点数情况,确保程序的正确性和稳定性。
3. c语言的问题,为什么输出是nan
NaN 的意思是 “Not a Number”, 不是一个数值,或无法表示的数值,例如溢出了, 负数求对数了,分母为0了。
用户可以加入一些打印语句,检查数据是否有错。
再有 A/a 这种运算是整除运算,不能算做是浮点运算。
(3)c语言判断nan扩展阅读:
C语言函数
C语言log()函数:返回x的自然对数(以e为底的对数)
C语言ldiv()函数:求两个数的商和余数(针对long类型)
C语言ceil()函数:求不小于x的最小整数(向上取整)
C语言floor()函数:求不大于x的最大整数(向下取整)
intiscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)
double cabs(struct complex znum) 返回复数znum的绝对值
4. C语言中出现nan(ind)什么意思
nan 是 "not a number" 的缩写, 即计算结果 不是个 数。
例如: 32 位 数 实际指数 128 ,数符 1 或 0,指数域 二进制 1111 1111。尾数域 等于非零。
ind 是 indeterminate 的缩写,即无法确定 是什么。
对负数开平方,对负数取对数,0.0除以0.0,0.0乘无穷大∞, 无穷大∞除以无穷大∞ 等错误都会 得 到 它。