運行結果為什么出現NAN?
NAN:notanumber等同于#IND:indeterminate(windows) 注意:
1、inf一般是因為得到的數值,超出浮點數的表示范圍(溢出,即階碼部分超過其能表示的最大值);而nan一般是因為對浮點數進行了未定義的操作,如對-1開方。
2、nan==nan結果是0或false,即不能和nan進行比較,和nan進行比較得到的結果總是false或0。所以可以用函數:intisNumber(doubled){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并不是最小的正浮點數,因為可以用可以用非規格化浮點數表示的更小。可以用函數:intisFiniteNumber(doubled){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> 宏的用法(類似于函數原型):intfpclassify(x); intisfinite(x); intisnormal(x); intisnan(x); intisinf(x); 具體用法: 1、intfpclassify(x)用來查看浮點數x的情況,fpclassify可以用任何浮點數表達式作為參數,fpclassify的返回值有以下幾種情況。 FP_NAN:x是一個“notanumber”。 FP_INFINITE:x是正、負無窮。 FP_ZERO:x是0。 FP_SUBNORMAL:x太小,以至于不能用浮點數的規格化形式表示。 FP_NORMAL:x是一個正常的浮點數(不是以上結果中的任何一種)。 2、intisfinite(x)當(fpclassify(x)!=FP_NAN&&fpclassify(x)!=FP_INFINITE)時,此宏得到一個非零值。 3、intisnormal(x)當(fpclassify(x)==FP_NORMAL)時,此宏得到一個非零值。 4、intisnan(x)當(fpclassify(x)==FP_NAN)時,此宏返回一個非零值。 5、intisinf(x)當x是正無窮是返回1,當x是負無窮時返回-1。(有些較早的編譯器版本中,無論是正無窮還是負無窮,都返回非零值,不區分正負無窮)。