非原創!
原文地址:
http://blog.163.com/chen_dawn/blog/static/112506320125494852135/
1, NaN即Not a Num,只對於浮點數出現。
當浮點數的除第一位外的其他位均為1時,該浮點數成為NaN。比如,內存表示為0xFFFFFFFFFFFFFFFF的double型數為NaN。
當兩個超出范圍的浮點數(即INF)進行運算時,運算結果會成為NaN。
2,NaN錯誤
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 return false;
5
6 return true;
7 }
4. The include file
isnan() — Test for NaN
ROOT 中是 Int_t TMath::IsNaN(Double_t x)
==============================================
==============================================
5,Native C++ _isnan()函數的應用
當表示一個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.");
}