你的位置:首页 > ASP.net教程

[ASP.net教程]关于浮点数与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标记