C#中判斷浮點數是否為0,不可以將變量同0使用“==”或“!=”進行比較,那這樣在進行是否為0的時候是不是就沒有辦法了呢?下面展示了兩個判斷思路:
采取折中的方式,設法將直接相等比較轉換為“>=”、“<=”的比較形式,達到近似的判斷效果
const float PRECISION = 0.000001f; float x ; if (Math.Abs(x) <= PRECISION) { //浮點數x值為0 } else { //浮點數x值不為0 }
或者不使用Math函數
const float PRECISION = 0.000001f; float x ; if (x <= PRECISION && x >= -PRECISION) { //浮點數x值為0 } else { //浮點數x值不為0 }
有的時候,近似比較已經不能滿足要求,需要精確比較,那該怎麼辦呢?辦法還是有的。
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值 }
這段代碼需要開啟unsafe標記