tommwq的博客

浮点数

· [tommwq@126.com]

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