半精度(FP16),单精度(FP32),双精度(FP64)

半精度(FP16),单精度(FP32),双精度(FP64)_第1张图片

1.分析

在单精度32位格式中,1位用于指示数字为正数还是负数。指数保留了8位,这是因为它为二进制,将2进到高位,其余23位用于表示组成该数字的数字,称为有效数字。

而在双精度下,指数保留11位,有效位数为52位,从而极大地扩展了它可以表示的数字范围和大小。半精度则是表示范围更小,其指数只有5位,有效位数只有10位。

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

     

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

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

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

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

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

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

2.举例

半精度可以表示的最大值

0 11110 1111111111 计算方法为:

(-1)^0×2^(30-15)×1.1111111111 = 1.1111111111(b)×2^15 = 1.9990234375(d)×2^15 = 65504
半精度可以表示的最小值(除了subnormal  value):

0 00001 0000000000 计算方法为:(-1)^(-1)×2(1-15)=2^(-14),约等于十进制的6.104×10^(-5)


再举一个平常的数,这次反过来,如-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

你可能感兴趣的:(数据结构)