1. 程式人生 > >C++ NAN 異常處理

C++ NAN 異常處理


當浮點數的除第一位外的其他位均為1時,該浮點數成為NaN。比如,記憶體表示為0xFFFFFFFFFFFFFFFF的double型數為NaN。
當兩個超出範圍的浮點數(即INF)進行運算時,運算結果會成為NaN。 
NaN,是Not a Number的縮寫。   
NaN 用於處理計算中出現的錯誤情況,比如 0.0 除以 0.0 或者求負數的平方根。由上面的表中可以看出,對於單精度浮點數,NaN 表示為指數為 emax + 1 = 128(指數域全為 1),且尾數域不等於零的浮點數。IEEE 標準沒有要求具體的尾數域,所以 NaN 實際上不是一個,而是一族。不同的實現可以自由選擇尾 數域的值來表達 NaN,比如 Java 中的常量 Float.NaN 的浮點數可能表達為01111111110000000000000000000000,其中尾數域的第一位為 1,其餘均為 0(不計隱藏的一位),但這取決系統的硬體架構。Java 中甚至允許程式設計師自己構造具有特定位模式的 NaN 值(通過 Float.intBitsToFloat() 方法)。比如,程式設計師可以利用這種定製的 NaN 值中的特定位模式來表達某些診斷資訊。

NAN是指not a number。

浮點數在進行除零操作之後,就會變成NAN(INF)。

可以使用下列函式來判斷該值是否為NAN(INF)。

庫函式:int isnan(double);  

    int _finite(double);//vc下使用該函式

//若傳入的double值無效,函式返回0. 需要包含庫檔案<float.h>

也可寫自定義函式來進行判斷(vc下不行)

1 bool is_nan(double dVal)
2 {
3 if (dVal==dVal)
4 returnfalse;
5 6 returntrue;
7 }


isnan() — Test for NaN
ROOT 中是 Int_t TMath::IsNaN(Double_t x)



==============================================
==============================================

當表示一個double型數值不為數字時,在.net可以這樣表示

double d = double.NaN;

double.NaN的原型如下:

//
// Summary:
//     Represents a value that is not a number (NaN). This field is constant.
public const double NaN = 0.0 / 0.0;

在Native C++,如果想表示一個不為數字的double,可以使用下面的函式。

double GenerateNaN()
{
    unsigned long nan[2]={0xffffffff, 0x7fffffff};    // code representing a NaN
    return *( double* )nan;    
}

判斷double型別是不是NaN,可以使用  _isnan() 函式:

double d = GenerateNaN();
if(_isnan(d))
{
    printf("d is NaN.");
}