精确判断一个浮点数是否等于0

原创 2006年11月17日 23:06:00

    看到论坛上有人问“精确判断一个浮点数是否等于0,不要用if(data<1e-10)类似的做法。”。其实我们了解下计算机中是怎样存储浮点数的,这个问题的答案就很明了了。


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


    对于计算机中32bit表示的浮点数,表示的术的绝对值的范围约为(1e-38)~(1e+38),即2^(-127)~1.11111111B*(2^128),浮点数的绝对值再怎么小,也不可能小过2^(-127),浮点数中不存在绝对0,所以我们只能取近似值。 

 

float怎么判断是否为0

如果是两个int类型的数据,想要判断他们是否相等,我们可以直接比较。 int a =11; int b=11; if(a==b) 答案是肯定的,BUT 如果是float和double: f...
  • gogoky
  • gogoky
  • 2016年04月09日 16:44
  • 10189

深入理解C++浮点数(float、double)类型数据比较、相等判断

浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基...
  • cbNotes
  • cbNotes
  • 2014年08月29日 10:12
  • 17579

判断两个float变量是否相等以及和 0 值比较方法

float 型: 占 4 字节,7 位有效数字 double 型:占 8 字节,15~16 位有效数字 浮点数的表示是不精确的,float 和 double 都不能保证可以...
  • zy986718042
  • zy986718042
  • 2017年05月24日 22:03
  • 1886

中位数:得到正确的浮点数,需加一个1.0* (size&1)==0,注意有括号。

题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值 ...
  • qq_29108585
  • qq_29108585
  • 2017年03月28日 21:49
  • 140

Java中实现浮点数的精确计算

  • 2009年07月24日 21:49
  • 6KB
  • 下载

判断输入是否为浮点数

  • 2007年06月10日 10:47
  • 11KB
  • 下载

[Java]精确表达浮点数

  • 2015年07月04日 22:57
  • 186KB
  • 下载

精确表达浮点数(详细)

  • 2009年08月14日 18:30
  • 189KB
  • 下载

分类统计1000,0000个浮点数并计时(精确到毫秒)

  • 2013年04月18日 10:29
  • 1KB
  • 下载

每日一题(78) - 精确表达浮点数

题目来自编程之美 题目: 举例: 0.3333(3333) = 1/3 0.285714(285714) = 2/7 0.3(000) = 3/10 0.25 = 1/4 ...
  • insistGoGo
  • insistGoGo
  • 2013年08月20日 22:58
  • 817
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:精确判断一个浮点数是否等于0
举报原因:
原因补充:

(最多只允许输入30个字)