关于判断浮点数是否为0的细节

看到论坛上有人问“精确判断一个浮点数是否等于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,所以我们只能取近似值

这是高质量c++编程指南一书的截图

关于判断浮点数是否为0的细节

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值