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。(有些較早的編譯器版本中,無論是正無窮還是負無窮,都返回非零值,不區分正負無窮)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章