浮点数格式: FP64, FP32, FP16, BFLOAT16, TF32

发布时间 2023-11-20 10:11:33作者: kkzhang

浮点数格式 (参考1参考2

浮点数是一种用二进制表示的实数,它由三个部分组成:sign(符号位)、exponent(指数位)和fraction(小数位)。不同的浮点数格式有不同的位数分配给这三个部分,从而影响了它们能表示的数值范围和精度。例如:

 下面是一些常见的浮点数格式的介绍:

  • FP64(双精度浮点数):用64位二进制表示,其中1位用于sign,11位用于exponent,52位用于fraction。它的数值范围大约是2.23e-308到1.80e308,精度大约是15到17位有效数字。它通常用于科学计算中对精度要求较高的场合,但在深度学习中不常用,因为它占用的内存和计算资源较多。
  • FP32(单精度浮点数):用32位二进制表示,其中1位用于sign,8位用于exponent,23位用于fraction。它的数值范围大约是1.18e-38到3.40e38,精度大约是6到9位有效数字。它是深度学习中长期使用的标准格式,因为它能平衡数值范围和精度,同时也有较好的硬件支持。
  • FP16(半精度浮点数):用16位二进制表示,其中1位用于sign,5位用于exponent,10位用于fraction。它的数值范围大约是6.10e-5到6.55e4,精度大约是3到4位有效数字。它是近年来在深度学习中越来越流行的格式,因为它能节省内存和计算资源,同时也有张量核心(Tensor Core)等专门的硬件加速器。但它的缺点是数值范围和精度较低,可能导致数值溢出或下溢的问题。
  • BFLOAT16(Brain Floating Point 16):用16位二进制表示,其中1位用于sign,8位用于exponent,7位用于fraction。它的数值范围和FP32相同,但精度只有2位有效数字。它是由Google提出的一种针对深度学习优化的格式,它的优点是能保持和FP32相同的数值范围,从而避免数值溢出或下溢的问题,同时也能节省内存和计算资源,提高训练速度。它的缺点是精度较低,可能导致数值不稳定或精度损失的问题。
  • TF32(TensorFloat 32):用32位二进制表示,其中1位用于sign,8位用于exponent,10位用于fraction,剩余的13位被忽略。它的数值范围和FP32相同,但精度只有3到4位有效数字。它是由NVIDIA在Ampere架构中推出的一种专为深度学习设计的格式,它的优点是能保持和FP32相同的数值范围,同时也能利用张量核心(Tensor Core)等专门的硬件加速器,提高训练速度。它的缺点是精度较低,可能导致数值不稳定或精度损失的问题。

浮点数的计算方式 (详细):

  浮点数是一种用二进制表示的实数,它由三个部分组成:sign(符号位)、exponent(指数位)和fraction(小数位)。不同的浮点数格式有不同的位数分配给这三个部分,从而影响了它们能表示的数值范围和精度。

浮点数的数学公式是:

value = (-1)^{sign} \times fraction \times 2^{exponent}

其中,sign是一个0或1的二进制数,表示浮点数的正负。exponent是一个整数,表示浮点数的指数部分。fraction是一个小于1的二进制小数,表示浮点数的小数部分。

例如,一个双精度浮点数(FP64)的二进制表示为:

  0 10000000001 1011001100110011001100110011001100110011001100110011

  它的sign为0,表示正数。它的exponent为10000000001,转换为十进制为1025,减去偏移量1023,得到2。它的fraction为1011001100110011001100110011001100110011001100110011,转换为十进制为0.6999999999999998。所以,这个浮点数的数值为:

  value = (-1)^0 \times 0.6999999999999998 \times 2^2 = 2.8