IEEE754协议使用一个固定长度的数据结构来表示实数的近似值。数据结构有三部分:1位符号s、k位阶码编码 e=ek−1ek−2...e0和n位尾数编码 f=fn−1fn−2...f0。
s、e和f三部分依次表示符号S、阶码E和尾数M,对应的实数值是 V=S∗M∗2^E。 符号的编码比较简单,即 S=(−1)^s 。阶码E和尾数M的编码稍微复杂一些。如果e不等于0且不等于 2^k−1 ,此时E = e-Bias,M = 1+0.fn−1...f0 。其中Bias= 2^k−1−1 叫做偏置量。注意这里的小数 1+0.fn−1...f0 是一个二进制小数。这样的浮点数叫做规格化浮点数。规格化浮点数用于表示距离0比较远的,比较大的实数。如果e等于0,此时E = 1-Bias,M= fn−1...f0 。这样的浮点数叫做非规格化的,用于表示接近于0的小数。当e= 2k−1 且f等于0时浮点数表示无穷大,当e = 2^k−1且f不等于0时,浮点数表示非数值。
上面介绍的是IEEE754浮点数的一般格式。按照一般格式,阶码长度k和尾数长度n共同决定一种IEEE754浮点数。IEEE754定义了3种浮点数类型,分别是单精度浮点数、双精度浮点数、扩展双精度浮点数。
单精度浮点数 | 双精度浮点数 | 扩展双精度浮点数 | |
---|---|---|---|
指数位数 | 8 | 11 | 至少15 |
尾数位数 | 23 | 52 | 至少64 |
总位数 | 32 | 64 | 至少79(通常80) |
随着神经网络的发展,为了加速浮点数运算,又出现了半精度浮点数(FP16)和FP8。
类型 | 半精度浮点数FP16 | FP8(E5M2) | FP8(E4M3) |
---|---|---|---|
指数位数 | 5 | 5 | 4 |
尾数位数 | 10 | 2 | 3 |
总位数 | 16 | 8 | 8 |