计算机中存储小数有两种方式,分别是定点数和浮点数。
1. 定点数
定点数就是小数点的位置固定不变的数,小数点的位置通常有两种约定方式:定点整数和定点小数。
定点整数就是纯整数,因为小数点在最低有效数值位之后。定点小数的小数点在最高有效数值之前。这里对定点数暂时不做详解。
2. 浮点数
2.1 简单概述
计算机中小数采用浮点数方式保存,采用工业标准IEEE754标准。一个浮点数的表现形式如下:
(
−
1
)
S
2
E
(
b
0
b
1
b
2
b
3
.
.
.
b
n
−
1
)
(-1)^S2^E(b_{0}b_{1}b_{2}b_{3}...b_{n-1})
(−1)S2E(b0b1b2b3...bn−1)
其中(-1)^S是浮点数的正负符号,S为0表示正数,S为1表示负数;
E为指数(阶码),用移码表示;
b0b1b2b3…bn-1是尾数,长度为n位,用原码表示。
假设用一个4字节(32bit)表示一个浮点数,每个内容段所占的bit位数如下所示,从左到右bit位是由高到低。
阶符(符号位) | 阶码 | 尾数 |
---|---|---|
1bit | 8bit | 23bit |
2.2 转换案例
这里直接使用实际案例转换进行讲解:
2.2.1 176.1875表示为单精度浮点数(4字节)
- 分别将176.1875的整数部分和小数部分转成二进制
176.1875 − − − > 10110000.0011 176.1875 ---> 10110000.0011 176.1875−−−>10110000.0011
转换之后的数据叫做非规格化的数据
- 将非规格化数据转成规格化数据
10110000.0011 − − − > 1.01100000011 ∗ 2 7 10110000.0011 ---> 1.01100000011 * 2^7 10110000.0011−−−>1.01100000011∗27
规格化的数据就是将数据使用 1.xxxxx * 2^x 的科学计数方式表示出来。
通过得到的规格化的值,已经可以确认精确位为01100000011,尾数为23bit,所以还需要补上其余的0,得到尾数就是01100000011000000000000
- 确定阶码和符号位
由上面可以知道指数为7,即阶码真值为7。要求得阶码,遵循该公式:++阶码 = 阶码真值 + 偏置值++
单精度的浮点数的偏置值是127,双精度的偏置值是1023,至于为什么后面解释。
所以这里的阶码 = 7 + 127 = 134 = 10000110,因为为正数,所以符号位为0。
- 浮点数表示
根据上面的计算可以得到阶码、符号和尾数。只要将对应的数填到对应的位置,即可得到如下值
阶符(符号位) | 阶码 | 尾数 |
---|---|---|
0 | 10000110 | 01100000011 000000000000 |
如果使用整数十六进制方式打印,即为0x43303000 (0100 0011 0011 0000 0011 0000 0000 0000 )
2.2.2 0.1875表示为双精度浮点数(4字节)
同样使用上面的4个步骤:
- 整数和小数部分转为二进制
0.1875
−
−
−
>
0.0011
0.1875 ---> 0.0011
0.1875−−−>0.0011
2. 转为规格化数据
0.0011
−
−
−
>
1.1
∗
2
−
3
0.0011 ---> 1.1 * 2^{-3}
0.0011−−−>1.1∗2−3
可确定尾数为1 0000000000000000000000
- 确定阶码和符号位
阶码 = -3 + 127 = 124 = 01111100,因为是正数,所以符号位为0
使用浮点数表示为:
阶符(符号位1bit) | 阶码(8bit) | 尾数(23bit) |
---|---|---|
0 | 01111100 | 10000000000000000000000 |
十六进制表示就是:0x3e400000
2.3 一些问题
1. 单精度为什么偏置值(bias)是127?双精度偏置为什么是1023?
float中 bias = 2^(k-1) - 1,k为阶码的个数=8 ,所以bias = 127
此时 E = e - bias(e是无符号的原码)
= (0000 0001,1111 1110)- 127
= (1-127,254-127)
= (-126, 127)
如若 bias = 128,则最终E = (-127, 126)
总结:bias = 127时候,E的最大值比bias=128大,此时浮点数表示的最大值就会更加大一些。
参考自 https://blog.csdn.net/weixin_43891234/article/details/114693495
2. IEEE754浮点数阶码为什么需要偏置bias
a) 使指数以无符号形式存储
b) 便于浮点数加减运算时候对阶操作
参考自 https://blog.csdn.net/weixin_43891234/article/details/114692825