你的float用对了吗
介绍
很多人都知道float是浮点类型,它不能表示数据范围内的所有数值。但是,实际使用或编码时,你又是否记得这句话呢?下面是stackoverflow中的一个问题:
why does a float variable stop incrementing at 16777216
下面是待执行的代码:
float a = ;
while (true)
{
a++;
if (a > )
break; // Will never break... a stops at 16777216
}
导致上面break不会跳出的原因就是:a是加不到16777217的,因为float真的无法表示16777217。
解释
16777216就是224,按照下面的方式来表示32个bit位
- 符号位:0(正数)
 - 指数位:24(存储时按24+127的bit来存)(24+127=151=10010111)
 - 尾数:0
 - 所以16777216的二进制就是0 10010111 00000000000000000000000
 - 所以16777216=(+)1*224*(1.0+0.0)=224=16777216
 
下面这张图显示了16777216的二进制表示

现在,让我们看看float是如何表示16777217(224+1)的。
- 符号位和指数位相同
 - 尾数需要是2-24,才能得到16777217,即1*224*(1.0+2-24)=224+1
 - 问题来了,尾数部分不能是2-24,因为float的尾数位数只有23个bit。
 - 所以,32位float类型不能精确地表示16777217
 
float能表示的下一个数值是16777218=1*224*(1+2-23)=224+2

参考
https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
http://floating-point-gui.de/basic/
你的float用对了吗的更多相关文章
- js实现省市区联动
		
先来看看效果图吧,嘻嘻~~~~~~~~~~~~~~~~~~~· 代码在下面: 示例一: html: <!DOCTYPE html> <html> <head> &l ...
 - CSS float 浮动属性
		
本篇主要介绍float属性:定义元素朝哪个方向浮动. 目录: 1. 页面布局方式:介绍文档流.浮动层以及float属性. 2. float:left :介绍float为 left 时的布局方式. 3. ...
 - 在树莓派Raspbian下安装支持Hard Float的.NET环境
		
[题外话] 最近入了个树莓派玩,系统装的官方推荐的Hard Float的Raspbian,由于衍生自Debian,所以Mono什么的非常好装.但是官方源中的Mono在Hard Float的Raspbi ...
 - 对CSS中的Position、Float属性的一些深入探讨
		
对CSS中的Position.Float属性的一些深入探讨 对于Position.Float我们在平时使用上可以说是使用频率非常高的两个CSS属性,对于这两个属性的使用上面可能大多数人存在一些模糊与不 ...
 - CSS  float 定位和缩放问题
		
今天调试一个看起来很简单的前端问题,但却花了太多的时间,示例代码: <!DOCTYPE html> <html> <head> <title></ ...
 - chrome中不可见字符引发的float问题
		
起因是刷知乎时碰到这么个问题:https://www.zhihu.com/question/41400503 问题代码如下: <!DOCTYPE html> <html lang=& ...
 - c#  float显示时保存一位小数
		
UI显示时候,需求保留一位小数 //保留一位小数 参考: http://blog.sina.com.cn/s/blog_620531730100kfz6.html float ff = 1.01f; ...
 - 前端之float的几种清除浮动方式
		
前端之float的几种清除浮动方式 本节内容 1.float清除方式1 2.float清除方式2 3.float清除方式3 4.float清除方式4 1.float清除方式1 <!DOCTYPE ...
 - 格式化 float 类型,保留小数点后1位
		
""" 练习 : 小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点, 并用字符串格式化显示出'xx.x%',只保留小数点后1位: &qu ...
 - CSS清除浮动float方法总结
		
使用浮动造成的BUG: 使用浮动前:(子节点是将父节点撑开了) 代码如下 <div class="box"> <div class="d1"& ...
 
随机推荐
- static静态初始化块
			
Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意: ...
 - Storm官方文档翻译之设置开发环境
			
本文将介绍如何设置Storm的开发环境.下面是大纲: 1.下载Storm发布包,解压,将解压的 bin目录放到你电脑的PATH中. 2.为了能够在远程集群中启动或者停止Topology,请将集群信息放 ...
 - HDU1073:Online Judge
			
Problem Description Ignatius is building an Online Judge, now he has worked out all the problems exc ...
 - CentOS + EPEL YUM源地址
			
[bizosv] name=bizsov-centos-$releasever - centos baseurl=http://yikat:yikat@download.bizsov.com/ gpg ...
 - nginx配置错误
			
重启nginx:sudo /usr/local/nginx/sbin/nginx -s reload 出现错误提示:nginx: [emerg] unknown directive "if& ...
 - iOS应用程序内存查看工具
			
我要找的是一个可以检查应用程序中哪一个数组存贮的什么内容的工具. 网上搜到的工具名称是Allocations Instrument,后来一试发现不是我想要的.这还是一个后期调试阶段的内存检查工具. h ...
 - shell脚本一键同步集群时间
			
shell脚本一键同步集群时间 弋嘤捕大 椿澄辄 ψ壤 茇徜燕 ㄢ交涔沔 阚龇棚绍 テ趼蜱棣 灵打了个寒颤也没有去甩脱愣是拖着 喇吉辔 秋北酏崖 琮淄脸酷 茇呶剑 莲夤罱 陕遇骸淫  ...
 - 8.2 sikuli 集成进eclipse 报错:Getting the VisionProxy.dll: Can not find dependent libraries...
			
如果在执行脚本的时候出现以下错误: Getting the VisionProxy.dll: Can not find dependent libraries... 把Sikuli X 的libs目录 ...
 - java设计模式案例详解:工厂模式
			
1.简单工厂模式 在不考虑扩展的情况下还是很好用的,其实我们写代码也很经常用到,其主要理解在于传入不同参数则构建不同对象,只有一个工厂,如需添加产品涉及到扩展需要修改比较多的东西,不符合开闭原则,如下 ...
 - 解决oracle数据库连接不上的问题
			
今天打开部署好的java开发的网站系统,反应好慢,第一反应就是后台有问题. 查看tomcat一堆的报错信息,重启还是存在. 使用plSql连接数据库看看,登录提示如下:ORA-12514:TNS:监听 ...