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标记