IEEE754浮点数存储
本文主要阐述在 IEEE754 标准下,单精度浮点数的存储,以及解释精度会丢失的问题
十进制如何转成二进制
如:把 10.5
转成二进制,主要分成两步:第一步把整数转成二进制,第二步把小数部分转成二进制,最后将结果结合起来
整数部分(10)转成二进制
思路: 使用除 2 取余倒序法
,用整数除以 2 得到商,并记录余数,再使用商除以 2,一直到商为 0 时,倒序排列余数就是该整数的二进制数步骤 十进制整数 操作 商 余数 备注 1 10 10÷2 5 0 2 5 5÷2 2 1 3 2 2÷2 1 0 4 1 1÷2 0 1 商为0,结束转换 所以得到
10
的二进制是1010
小数部分(0.5) 转成二进制
思路:使用乘 2 取整数法
,用小数部分乘以 2,将结果的小数部分作为二进制位,取结果的小数部分重复前面的步骤,直到小数部分为 0,排列整个二进制位,就是该小数的二进制数。步骤 十进制小数 操作 乘以2后的结果 整数部分(二进制位) 小数部分 备注 1 0.5 0.5×2 1.0 1 0.0 小数部分为0,结束转换 所以得到
0.5
的二进制是.1
,最后得到10.5
的二进制是1010.1
IEE754 的存储构成
在 IEEE754 单精度浮点数采用是 32 个二进制位,其中 31 位为符号位,[30, 23] 为指数位,[22,0] 为尾数位。
IEE754 构造过程
- 表示成二进制
如: 0.1 转成二进制是0.0001100110011...(无限循环)
步骤 十进制小数 操作 乘以2后的结果 整数部分(二进制位) 小数部分 备注 1 0.1 0.1×2 0.2 0 0.2 2 0.2 0.2×2 0.4 0 0.4 3 0.4 0.4×2 0.8 0 0.8 4 0.8 0.8×2 1.6 1 0.6 整数部分记为二进制位1 5 0.6 0.6×2 1.2 1 0.2 整数部分记为二进制位1 6 0.2 … … … … 循环出现,表示重复过程 - 标准化
将上述的二进制数转换成科学计数法,即使成为一个形式为1.xxx... * 2^n
的数,
其中n
位小数点偏移量,如0.0001100110011
即表示为1.100110011 * 2^-4
,偏移量为-4
,尾数为1.100110011
- 计算指数
IEEE754 单精度浮点数指数偏移量为127
,使用上述的偏移量 + 指数偏移量 = 123 其二进制为0111 1011
- 计算尾数
如果高位为 1 即可省略,如上述1.100110011
即1001 1001 1001 1001 1001 100
,如果不足需要在后续补零,因为这里是尾数是一个无限循环情况不需要补零 - 构造 IEEE 754 格式
符号位:0
(正数为 0 负数为 1)
指数位:0111 1011
尾数位:1001 1001 1001 1001 1001 100
完整表示:0 01111011 1001 1001 1001 1001 1001 100