程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 關於浮點數與0相等比較方法,浮點數0相等

關於浮點數與0相等比較方法,浮點數0相等

編輯:C#入門知識

關於浮點數與0相等比較方法,浮點數0相等


  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標記

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved