半精度浮点数

半精度浮点数（）是用来表示浮点数的一种数据类型，在计算机中占据16比特（2字节）大小，因此也称为float16或FP16。在IEEE 754中这种16位二进制格式被正式称为binary16格式，因为只有單精度浮點數的一半大小，也简称为half，即半精度。这种数据类型适合对精度要求不高的场景，例如图像处理和人工神经网络等领域。

半精度浮点数可在OpenEXR， JPEG XR， OpenGL， Cg语言、D3DX等计算机图形环境中使用。其与8位或16位整数相比具有动态范围高的优点，可以使高对比度图片中更多细节得以保留。与单精度浮点数相比，它的优点是只需要一半的存储空间和带宽（但是会牺牲精度和数值范围）。

 历史 

半精度浮点数是一种较新的浮点类型。 英伟达在2002年初发布的Cg语言中称它作 half 类型，并首次在2002年末发布的GeForce FX中实现。ILM 当时正在寻找一种拥有高动态范围，且不需过多消耗硬盘和内存，并且能像单精度浮点数和双精度浮点数那样被用来进行浮点计算的图像格式。由SGI的John Airey领导的硬件加速可编程着色小组在1997年发明了作为“bali”设计工作的一部分的s10e5数据类型，曾在SIGGRAPH 2000年的论文中介绍过，并且在美国专利7518615中被进一步记录。

 定义 

IEEE 754 标准指定了一个 binary16 要有如下的格式：
 Sign bit（符号位）： 1 bit
 Exponent width（指数位宽）： 5 bits
 Significand precision（尾数精度）： 11 bits （有10位被显式存储）

按如下顺序排列：

Image:IEEE 754r Half Floating Point Format.svg

除非指数位全是0，否则就会假定隐藏的起始位是1。因此只有10位尾数在内存中被显示出来，而总精度是11位。据IEEE 754的说法，虽然尾数只有10位，但是尾数精度是11位的(log10(211) ≈ 3.311 十进制数).

 例子 

 0 01111 0000000000 = 1
 0 01111 0000000001 = 1 + 2−10 = 1.0009765625 （1之后的最接近的数）
 1 10000 0000000000 = −2

 0 11110 1111111111 = 65504  （max half precision）

 0 00001 0000000000 = 2−14 ≈ 6.10352 × 10−5 （最小正指数）
 0 00000 1111111111 = 2−14 - 2−24 ≈ 6.09756 × 10−5 （最大尾数）
 0 00000 0000000001 = 2−24 ≈ 5.96046 × 10−8 （最小正尾数）

 0 00000 0000000000 = 0
 1 00000 0000000000 = −0

 0 11111 0000000000 = infinity
 1 11111 0000000000 = −infinity

 0 01101 0101010101 = 0.333251953125 ≈ 1/3

由于尾数的位数是奇数，所以默认情况下，1/3 这类的数会像双精度浮点数一样四舍五入。

 参阅 
 IEEE 754：  IEEE二进制浮点数算数标准 （IEEE 754）
 ISO/IEC 10967， Language Independent Arithmetic
 Primitive data type
 RGBE image format

引用

 外部链接 
 Minifloats （in Survey of Floating-Point Formats）
 Half precision constants from D3DX
 OpenGL treatment of half precision
 Analog devices variant （four-bit exponent）
  Half precision floating point for one of the extended GCC features

Category:数据类型
Category:二进制算术
Category:計算機算術