看到論壇上有人問“精确判斷一個浮點數是否等于0,不要用if(data<1e-10)類似的做法。”。其實我們了解下計算機中是怎樣存儲浮點數的,這個問題的答案就很明了了。
IEEE754标準中,單精度浮點數(4byte)表示法:1bit符号位(S),8bit指數位(E,用階碼表示),23bit小數部分(尾數M)。雙精度浮點數(8byte)表示法:1bit符号位,11bit指數位(用階碼表示),52bit小數部分(尾數)。是以一個規格化的單精度浮點數x的真值為x=((-1)^S)*(1.M)*(2^(E-127));顯然,x永遠也不可能為絕對0。
針對上面的描述,當階碼E為全0且尾數M也全0時,可以認為表示的真值x為計算機中的絕對0值,再結合符号位S,有正0和負0之分;即32bit中除了最高1bit外,其餘31bit全為0時,就是計算機中的絕對0值。
float f=pow((float)2,(float)-127);;
int *ptrToInt=(int*)(void*)&f;
if(!(*ptrToInt&(0x7fffffff)))
{
//計算機中的絕對0值
}
對于計算機中32bit表示的浮點數,表示的術的絕對值的範圍約為(1e-38)~(1e+38),即2^(-127)~1.11111111B*(2^128),浮點數的絕對值再怎麼小,也不可能小過2^(-127),浮點數中不存在絕對0,是以我們隻能取近似值。
本文轉自Silent Void部落格園部落格,原文連結:http://www.cnblogs.com/happyhippy/archive/2006/11/18/601223.html,如需轉載請自行聯系原作者