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] 为尾数位。
img

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.1001100111001 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