IEEE754-2008包含一种“半精度”格式,只有16位宽。故它又被称之为binary16,这种类型的浮点数只适合用于存储那些对精度要求不高的数字,不适合用于进行计算。与单精度浮点数相比,它的优点是只需要一半的存储空间和带宽,但是缺点是精度较低。

半精度的格式与单精度的格式类似,最左边的一位仍是符号位,指数有5位宽且以余-16(excess-16)的形式存储,尾数有10位宽,但具有隐含1。

     

半精度浮点 python 16进制 半精度浮点数范围_浮点数

如图所示,sign为符号位,0表示这个浮点数为正,1表示这个浮点数为负

先介绍尾数,再说指数,fraction为尾数,有10位长,但是有隐含1,尾数可以理解为是一个浮点数小数点后的数,如1.11,尾数就为1100000000(1),最后的隐含1主要用于计算时,隐含1可能存在可以进位的情况。

exponent为指数位,有5位长,具体表示的值有以下几种情况:

  1. 当指数位全为0 ,尾数位也全为0的时,表示的就是0
  2. 当指数位全为0,尾数位不全为0时,表示为subnormal value,非规格化浮点数,是一个非常小的数
  3. 当指数位全为1,尾数位全为0时,表示的是无穷大,此时如果符号位为0,表示正无穷,符号位为1,表示负无穷
  4. 当指数位全为1,尾数位不全为0时,表示的不是一个数
  5. 其余情况下,指数位的值减去15就是其表示的指数,如11110表示的就是30-15=15

所以我们可以得到,半精度浮点数的值得计算方式为(-1)^sign×2^(指数位的值)×(1+0.尾数位) 

备注:这里0.尾数位,表示如尾数位为0001110001,则0.尾数位为0.0001110001

举几个例子:

  1. 半精度可以表示的最大值:0 11110 1111111111 计算方法为:(-1)^0×2^(30-15)×1.1111111111 = 1.1111111111×2^15,即十进制的65504
  2. 半精度可以表示的最小值(除了subnormal  value):0 00001 0000000000 计算方法为:(-1)^(-1)×2(1-15)=2^(-14),约等于十进制的6.104×10^(-5)
  3. 再举一个平常的数,这次反过来,如-1.5625×10^(-1) ,即-0.15625 = -0.00101(十进制转二进制)=  -1.01×2^(-3),所以符号位为1,指数为-3+15=12,所以指数位为01100,尾数位为0100000000。所以-1.5625×10^(-1)用半精度浮点数表示就为1 01100 0100000000