java中,基本数据float 和double的包装类float和double都是浮点类型
所以对于浮点数在计算机中的表示方法需要有一个基本了解,否则很难了解清楚float和double的实现原理
本文对计算机中的浮点数表示ieee754标准,进行了简单介绍
标准规定
指数偏移值为 2(e−1) -1 e为指数的位数
|
单精度 指数偏移值为127 对于双精度 指数偏移值为1023 |
指数无符号数表示的范围
单精度8位 0~255
双精度11位 0~2047
|
指数真值也就是实际的值 单精度 -127 ~ 128
双精度 -1022 ~ 1023
|
不过头尾 被保留, 会另做他用 ,下面会继续说明 所以实际的值要去掉头尾,也就是 单精度 -126 ~ 127
双精度 -1022 ~ 1023
|
综上,一个实数在计算机中表示形式为: sign s 符号位 exponent 指数部分 fraction 尾数部分 |
按照我们上面讲的,指数真值也就是实际的值
单精度 -127 ~ 128
双精度 -1022 ~ 1023
也就是不包括头尾, 也就是指数部分不包括 指数全是0 (0) 或者全是1(255)的情况
这就是规范化形式,对于规范化形式,表示的数值如下
s = 符号位
m=1.f
e=指数值-指数偏移值
|
表示的数值为: |
这是浮点数的规范化表示形式 s表示符号位 尾数部分前隐含一个小数点,小数点前隐含一个1 指数的真值e 也就是 指数部分表示的无符号数减掉指数偏移值 |
单精度指数的范围(指数 - 指数偏移值之后的值 ) 为: -126 ~ 127 |
正数最大值 指数为正数的最大值 127 尾数 也为最大值 全部都是1 也就是23个1 (-1)0 × 1.11111...(23个1) × 2127 也就是 (2−2−23)×2127 |
1.11111...(23个1) = 20 +2-1 +2-2 + ....2-23
公比 q= 1/2 a1 = 20
代入公式
|
正数最小值
指数为负数的最小值 -126
尾数 也为最小值, 全部都是0 也就是23个0
1.0 × 2-126
|
双精度指数的范围(指数 - 指数偏移值之后的值 ) 为:
-1022 ~ 1023
|
正数最大值
指数为正数的最大值 1023
尾数 也为最大值 全部都是1 也就是52个1
(-1)0 * 1.11111...(52个1) * 21023
也就是
(2−2−52)×21023 (还是等比数列求和)
|
正数最小值
指数为负数的最小值 -1022
尾数 也为最小值, 全部都是0 也就是52个0
1.0 × 2-1022
|
在非标准化情况下,尾数部分之前有隐含的小数点, 但是小数点之前,隐含的不在是1 而是0 |
对于指数的真值,不再是指数部分表示的无符号数减掉指数偏移量
一旦指数部分为0 (也就是所有的比特位都是0),这就是一个标记符号了,不再有指数大小的含义
这种情况下
指数的真值为 1 - 指数偏移量
单精度为 1-127= -126
双精度为 1-1023 = -1022
|
单精度 (−1)s × (0.f) × 2-126 双精度 (−1)s × (0.f) × 2-1022 |
单精度 | 0.0000...1(23位,最后一位为1) × 2-126 = 2-23 × 2-126 = 2-149 |
双精度 | 0.0000...1(52位,最后一位为1) × 2-1022 = 2-52 × 2-1022 = 2-1074 |
当指数部分中所有bit的值全是1,f中所有bit的值全是0,表示无穷大
根据符号位来区分正无穷和负无穷
|
当指数部分中所有bit的值全是1,f中所有bit的值不全是0 表示nan(not a number) |
如果 指数 是0 并且 小数部分 是0, 这个数是0 根据符号位区分+0 和 -0 |
如对本文有疑问, 点击进行留言回复!!
SpringBoot引用阿里easyexcel,Excel导出返回浏览器下载
HashMap、Hashtable、ConcurrentHashMap三者间的异同
解决RecycleView 中Item包含Edittext时,滑动view复用导致数据错乱的问题
多线程、同步工作原理、死锁案例、Lock接口、线程的生命周期的讲解及实现
网友评论