float类型表示方式及范围深度解析 | 您所在的位置:网站首页 › float最小 › float类型表示方式及范围深度解析 |
float类型的值以4个字节表示,共32bit,根据IEEE754标准,float类型使用1位做符号位,8位做指数位,23位做尾数位,格式如下: 下面将三个部分分别进行介绍 符号位:0表示正,1表示负 指数部分:指数位用8位移码表示。8bit可表示256个数,用移码可表示的十进制范围为-127~128,将指数位的移码为0表示浮点数的指数为负无穷,整个浮点数为0;当指数的移码为255时表示指数为正无穷,浮点数为最大值。所以实际用来表示的移码范围为 1 ~ 254 ,转换成十进制原码为 -126 ~ 127,也就是整个指数部分(注意:只算指数部分)所能表示的最小的正数值为
2
−
126
2^{-126}
2−126,最大的值为
2
127
2^{127}
2127。如图所示: 尾数部分部分共23位,表示范围为0 ~
2
23
−
1
2^{23}-1
223−1。在规约式浮点数的尾数部分中小数点前还隐藏着一个固定的整数值整数1,尾数部分的23位只用来表示小数点后的值,这种方式可保证浮点数有唯一的表示形式。规约式浮点数尾数部分如图所示: 对于规约式浮点数可表示的最小的正数为 2 − 126 2^{-126} 2−126,我们可用代码来验证: public static void main(final String[] args) throws InterruptedException { BigDecimal b1 = new BigDecimal("0.5"); System.out.println(b1.pow(126).floatValue()); //2的-126次方的浮点数值 System.out.println(Float.MIN_NORMAL);//浮点数的最小规格化正数 }输出结果表明float的最小规约化正数为
2
−
126
2^{-126}
2−126: 运行截图: 当采用了渐进式下溢出,float类型所能表示的绝对值最小的数便为: 2 − 149 2^{-149} 2−149,可用代码验证: public static void main(final String[] args) throws InterruptedException { BigDecimal b1 = new BigDecimal("0.5"); System.out.println(b1.pow(149).floatValue()); System.out.println(Float.MIN_VALUE); }运行结果为: 运行结果为: 最大绝对值就比较简单了,当尾数全为1,指数为127时为最大,也就是 ( 2 − 2 − 23 ) × 2 127 (2-2^{-23}) \times 2^{127} (2−2−23)×2127 使用代码来验证下: public static void main(final String[] args) throws InterruptedException { BigDecimal b1 = new BigDecimal("2"); System.out.println(b1.pow(128).subtract(b1.pow(104)).floatValue()); System.out.println(Float.MAX_VALUE); }运行结果如下: 运行结果为: 参考文献: https://baike.baidu.com/item/IEEE%20754/3869922?fr=aladdin |
CopyRight 2018-2019 实验室设备网 版权所有 |