关于浮点数与0相等比较方法_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 关于浮点数与0相等比较方法

关于浮点数与0相等比较方法

 2015/4/2 12:10:06  johnvwan  程序员俱乐部  我要评论(0)
  • 摘要:C#中判断浮点数是否为0,不可以将变量同0使用“==”或“!=”进行比较,那这样在进行是否为0的时候是不是就没有办法了呢?下面展示了两个判断思路:近似比较采取折中的方式,设法将直接相等比较转换为“>=”、“<=”的比较形式,达到近似的判断效果constfloatPRECISION=0.000001f;floatx;if(Math.Abs(x)<=PRECISION)
  • 标签:方法

  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值。

double f=pow((double)2,(double)-127);;
int *ptrToInt=(int*)(void*)&f;
if(!(*ptrToInt&(0x7fffffff)))
{
//计算机中的绝对0值
}

  这段代码需要开启unsafe标记

 

上一篇: wpf知识分享 下一篇: 没有下一篇了!
发表评论
用户名: 匿名