Skip to content

主要以FP16为例。

概述

FP16指有16个2进制数,其中包含1位符号位数(sign),5位作指数(exponent),10位表小数(fraction)。而对于FP32则是1位表符号,8位表指数,23位表小数。
根据IEEE574规定,浮点数包含三个状态:

  • 规格数(Normal): 指数位不全为0或1
  • 非规格数(Subnormal): 指数全0
  • 特殊数(Non-number): 指数全1

规格数

  • 符号位:为0或者1,其中0表示正数,1表示负数
  • 指数:中间5位,00000~11111,但注意到,当全0或全1时不再为规格数,故取值范围在00001~11110,转化为十进制数1~30。为了表示负指数,设置偏置(bias),并令e=eb。根据IEEE754标准,设置偏置(bias)为2e11(FP16偏置为15),故最终指数范围$-$14~15。
  • 小数: 10位,默认省略前置位1,表示范围在[1,10231024]
  • 表达公式: (1)s2eb(1+f210)
  • 最大值: 0111101111111111 = (1)0×2(3015)×(1+10231024) = 65504
  • 最小正值:0000010000000000 = (1)0×214=214

非规格数

从规格数可以看出,对于接近0的数,规格数是无法表达的。例如,在规格数的定义下,即使取出 0000000000000000 = 215,在(0,215)之间的数无法被表达。为了解决这个问题,引入非规格数。非规格数下,将小数部分默认隐藏的1进位给指数。
此时,表达式变更为(1)s×2e+1b×f210
则对应的

  • 小数部分全0: 表示数字0
  • 最小正值: 0000000000000001 = (1)0×20+115×1210=224

特殊数

  • 指数: 此时,指数部分全1
  • 若小数部分全0
    • 符号位为1,则表示负无穷
    • 符号为为0,则表示正无穷
  • 若小数不全为0: 表示NAN