看到論壇上有人問「精確判斷乙個浮點數是否等於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)))
對於計算機中32bit表示的浮點數,表示的術的絕對值的範圍約為(1e-38)~(1e+38),即2^(-127)~1.11111111b*(2^128),浮點數的絕對值再怎麼小,也不可能小過2^(-127),浮點數中不存在絕對0,所以我們只能取近似值。
精確判斷乙個浮點數是否等於0
看到論壇上有人問 精確判斷乙個浮點數是否等於0,不要用if data 1e 10 類似的做法。其實我們了解下計算機中是怎樣儲存浮點數的,這個問題的答案就很明了了。ieee754標準中,單精度浮點數 4byte 表示法 1bit符號位 s 8bit指數字 e,用階碼表示 23bit小數部分 尾數m 雙...
「精確」判斷乙個浮點數是否等於0
看到論壇上有人問 精確判斷乙個浮點數是否等於0,不要用if data 1e 10 類似的做法。其實我們了解下計算機中是怎樣儲存浮點數的,這個問題的答案就很明了了。ieee754標準中,單精度浮點數 4byte 表示法 1bit符號位 s 8bit指數字 e,用階碼表示 23bit小數部分 尾數m 雙...
「精確」判斷乙個浮點數是否等於0
看到論壇上有人問 精確判斷乙個浮點數是否等於0,不要用if data 1e 10 類似的做法。其實我們了解下計算機中是怎樣儲存浮點數的,這個問題的答案就很明了了。ieee754標準中,單精度浮點數 4byte 表示法 1bit符號位 s 8bit指數字 e,用階碼表示 23bit小數部分 尾數m 雙...