浮点数
IEEE754浮点数是一种在计算机中表示和记录实数近似值的方法。我们首先观察如何使用二进制和科学计数法来表达一个实数,例如
\(0.125_{(十进制)} = 1 \times 1_{(二进制)} \times 2^{-3}\)
\(1.25_{(十进制)} = 1 \times 1.01_{(二进制)} \times 2^1\)
\(-2.75_{(十进制)} = -1 \times 1.011_{(二进制)} \times 2^2\)
从这些例子可以看出,实数可以用一个三元组(S,E,F)来表达
\(实数=S \times F \times 2^E\)
其中S是1或-1,表示实数的符号。F是一个二进制小数,E是一个整数。IEEE754就是通过将三元组封装成一个定长数据结构,来表示和记录实数近似值的。数据结构有三部分,对应三元组的三个成员,分别叫做符号s、阶码编码e和尾数编码f。符号s固定占用1位,保存在数据结构的最高位中。阶码编码e和尾数编码f各占k位和n位。对于不同精度的浮点数,k和n取不同的值。为了简化表述,我们记
\(e=e_{k-1}e_{k-2}…e_{0}\)
\(f=f_{n-1}f_{n-2}…f_{0}\)
s | \(e_{k-1}\) | … | \(e_{0}\) | \(f_{n-1}\) | … | \(f_{0}\) |
---|
符号的编码比较简单, \(S=-1^{s}\) 。阶码E和尾数F的编码稍微复杂一些。当e的每一位不全是0或1时(即e不等于0且不等于 \(2^{k-1}\) ),此时 \(E = e-Bias\) , \(F =1+0.f_{n-1}…f_{0}\) 。其中 \(Bias=2^{k-1}-1\) 叫做偏置值。这里的小数 \(1+0.f_{n-1}…f_{0}\) 是一个二进制小数。这样的浮点数叫做规格化浮点数。规格化浮点数用于表示距离0比较远的,比较大的实数。当e的每一位都是0时(e等于0), \(E = 1-Bias\) , \(F=f_{n-1}…f_{0}\) 。这样的浮点数叫做非规格化的,用于表示接近于0的小数。当 \(e=2^{k-1}\) 且f等于0时,浮点数表示无穷大。当 \(e =2^{k-1}\) 且f不等于0时,浮点数表示非数值。
分类 | 条件 | E | F | 值 |
---|---|---|---|---|
规格化 | e != 0 且 e != \(2^{k-1}\) | e-Bias | \(1+0.f_{n-1}…f_{0}\) | \((-1)^s*F*2^E\) |
非规格化 | e = 0 | 1-Bias | \(f_{n-1}…f_{0}\) | \((-1)^s*F*2^E\) |
无穷大 | e = \(2^{k-1}\) 且 f = 0 | 无穷大 | ||
非数值 | e = \(2^{k-1}\) 且 f != 0 | NaN |
上面介绍的是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 |