Java中float的取值范围为什么是那么大?
来源:互联网 发布:hugo这家淘宝店正吗 编辑:程序博客网 时间:2024/04/26 10:53
float占用4个字节,和int是一样,也就是32bit.
第1个bit表示符号,0表示正数,1表示负数,这个很好理解,不用多管.
第2-9个bit表示指数,一共8为(可以表示0-255),这里的底数是2,为了同时表示正数和负数,这里要减去127的偏移量.这样的话范围就是(-127到128),另外全0和全1作为特殊处理,所以直接表示-126到127.
剩下的23位表示小数部分,这里23位表示了24位的数字,因为有一个默认的前导1(只有二进制才有这个特性).
最后结果是:(-1)^(sign) * 1.f * 2^(exponent)
这里:sign是符号位,f是23bit的小数部分,exponent是指数部分,最后表示范围是(因为正负数是对称的,这里只关心正数)
2^(-126) ~~ 2(1-2^(-24)) * 2^127
这个还不是float的取值范围,因为标准中还规定了非规格化表示法,另外还有一些特殊规定.
非规格化表示:
当指数部分全0而且小数部分不全0时表示的是非规格化的浮点数,因为这里默认没有前导1,而是0.
取值位0.f * 2^(-126),表示范围位 2^(-149)~~ (1-2^(-23)) * 2^(-126) 这里没有考虑符号.这里为什么是-126而不是-127? 如果是-127的话,那么最大表示为
2^(-127)-2^(-149),很显然2^(-127) ~~2^(-126) 就没法表示了.
其他特殊表示
1.当指数部分和小数部分全为0时,表示0值,有+0和-0之分(符号位决定),0×00000000表示正0,0×80000000表示负0.
2.指数部分全1,小数部分全0时,表示无穷大,有正无穷和负无穷,0x7f800000表示正无穷,0xff800000表示负无穷.
3.指数部分全1,小数部分不全0时,表示NaN,分为QNaN和SNaN,Java中都是NaN.
结论:
可以看出浮点数的取值范围是:2^(-149)~~(2-2^(-23))*2^127,也就是Float.MIN_VALUE和Float.MAX_VALUE.
转载自:http://www.mianwww.com/html/2009/11/5914.html
- Java中float的取值范围为什么是那么大?
- double的取值范围为什么那么大?
- Java中float的取值范围
- Java 中 float 的取值范围
- Java中float的取值范围
- Java中float的取值范围
- java中float的取值范围
- 为什么JAVA的float取值范围是-3.4*10^38 ~ -3.4*10^38
- 为什么java中Byte类型的取值范围是-128~127
- 为什么Java中byte类型的取值范围是-128~127
- java中为什么byte的取值范围是-128到+127
- Java中byte类型的取值范围为什么是-128~127
- java中为什么byte的取值范围是-128到+127
- Java中float/double取值范围与精度
- java中short、int、long、float、double取值范围
- java中short、int、long、float、double取值范围
- java中short、int、long、float、double取值范围
- java中short、int、long、float、double取值范围
- 2016年新鲜出炉的20款网页开发工具推荐
- golang语法总结(十):关于++和--
- iOS UIImage渲染模式 imageWithRenderingMode:
- 重用convertView时防止图片不断刷新
- TextView跑马灯效果-自定义控件
- Java中float的取值范围为什么是那么大?
- 抽象类的概述和讲解
- 向量叉积的几何意义
- File空格的处理方法
- Android HOOK工具Cydia Substrate使用详解
- 读一读Android系统源代码 一:下载源码、编译framework模块
- Rabbit实例代码
- iScroll4 滚动到底部检测
- UISnapBehavior的简单使用