本文總結nan和inf在c語言當中的含義、產生和判定方法。
表示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對浮點數賦值;
《見後》
int isnumber(double d)來判斷d是否為nan,若d是nan則返回0,否則返回非零值。
nan是無序的(unordered),它不大於、小於或等於任何數(包括它自己),所以,nan==nan 結果是0或false;另外將<,>,<=,和》=作用於nan產生乙個exception;
得到nan時就檢視是否有非法操作;
如果表示式中含有nan,那麼表示式的結果為nan;
對於nan的實現有兩種方式:signaling nan 和 quiet nan。signaling nan就是丟擲異常的方式,因此它不需要定義nan巨集。quiet nan就是即使在計算出現異常的情況下也不丟擲異常從而中斷程式的執行、而是將結果表示為乙個特殊的值, 因此只有在這種情況下nan巨集才被定義;
infinity (linux),等同於 #inf:infinity (windows)
超出浮點數的表示範圍(溢位,即階碼部分超過其能表示的最大值);
1.0/0.0等於inf,-1.0/0.0等於-inf,0.0+inf=inf;log(0);
在c99中,使用巨集:float infinity對浮點數賦值;
《見後》
int isfinitenumber(double d)
來判斷d是否為乙個finite數(既不是inf,又不是nan(加入d為nan,則d參加比較就會得到false(0)值))。
+inf大於任何數(除了它自己和nan);-inf小於任何數(除了它自己和nan);
得到inf時就檢視是否有溢位或者除以0;
標頭檔案中,有定義的常量dbl_max,這個常量表示「能表示出來的最大的雙精度浮點型數值」。中還有常量dbl_min,dbl_min表示可以用規格化表示的最小的正浮點數,但dbl_min並不是最小的正浮點數,因為可以用可以用非規格化浮點數表示的更小;
inf在c語言表示式中就表示數學裡無限的概念,如1.0/inf等於0.0,並可以與其他浮點數進行比較的(可以參與<=、>+、==、!=等運算);
下面這幾個巨集(用巨集實現的,使用時跟函式的形式基本相同)是判斷乙個表示式的結果是否為inf、nan或其他:
標頭檔案:include
巨集的用法(類似於函式原型):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語言中的inf和nan
計算calcdistancetohead的距離時,發現有輸出 nan的列印。跟蹤列印資料後,發現有sqrt資料異常的嫌疑。首先,解釋一下它們的意思 inf表示 無窮大 是infinite的縮寫。nan表示 無效數字 是not a number的縮寫。其次,這兩個是值會在浮點運算結果未定義或者無法表示...
C語言中nan的使用
含義 表示 not a number 產生 對浮點數產生了未定義的操作 1.對負數開方,對負數求對數,0.0 0.0,0.0 inf inf inf inf inf這些操作都會得到nan。0 0會產生操作異常 0.0 0.0不會產生操作異常,而是會得到nan 2.在gnu中,使用巨集 float n...
lua數學計算的inf和nan
今天,我來講述乙個lua關於對數學世界的恐懼之一,極大值和極小值。inf nan 在某次偶然的log除錯裡,我注意到控制台輸出了這麼兩個以前沒有見過的東西。雖然我的程式 裡只有非常簡單的數學計算,還是出現這樣高階 未知 的東西。對數學的敬畏由此展開.這個知識點很簡單,也許是初中或者小學時代的數學裡有...