本文總結nan和inf在C語言當中的含義、產生和斷定方法。
C語言當中的nan
表示not a number,等同於 #IND:indeterminate (windows)
產生:
對浮點數進行了未定義的操做;html
- 對負數開方,對負數求對數,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){return (d==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宏才被定義;
C語言當中的inf
infinity (linux),等同於 #INF:infinity (windows)
產生:
超出浮點數的表示範圍(溢出,即階碼部分超過其能表示的最大值);node
- 1.0/0.0等於inf,-1.0/0.0等於-inf,0.0+inf=inf;log(0);
- 在C99中,使用宏:float INFINITY對浮點數賦值;
斷定:
庫函數方法:(推薦)
<見後>
自定義函數:
int isFiniteNumber(double d) {return (d<=DBL_MAX&&d>=-DBL_MAX);}
來判斷d是否爲一個finite數(既不是inf,又不是nan(加入d爲nan,則d參加比較就會獲得false(0)值))。
注意:
- +inf大於任何數(除了它本身和nan);-inf小於任何數(除了它本身和nan);
- 獲得inf時就查看是否有溢出或者除以0;
- 頭文件<float.h>中,有定義的常量DBL_MAX,這個常量表示「能表示出來的最大的雙精度浮點型數值」。<float.h>中還有常量DBL_MIN,DBL_MIN表示能夠用規格化表示的最小的正浮點數,但DBL_MIN並非最小的正浮點數,由於能夠用能夠用非規格化浮點數表示的更小;
- 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);
具體用法:
一、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是一個正常的浮點數(不是以上結果中的任何一種)。
二、int isfinite(x)
當(fpclassify(x)!=FP_NAN&&fpclassify(x)!=FP_INFINITE)時,此宏獲得一個非零值。
三、int isnormal(x) 當(fpclassify(x)==FP_NORMAL)時,此宏獲得一個非零值。
四、int isnan(x) 當(fpclassify(x)==FP_NAN)時,此宏返回一個非零值。
五、int isinf(x)
當x是正無窮是返回1,當x是負無窮時返回-1。(有些較早的編譯器版本中,不管是正無窮仍是負無窮,都返回非零值,不區分正負無窮)。
參考資料: