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乘無窮大∞, 無窮大∞除以無窮大∞ 等錯誤都會 得 到 它。