半精度浮点数

维基百科,自由的百科全书
跳到导航 跳到搜索

半精度浮点数 是一种计算机使用的二进制浮点数数据类型半精度浮点数使用2字节(16位)存储。

IEEE 754-2008中,它被称作binary16。这种类型只适合用来存储那些对精度要求不高的数字,而不适合用来计算。

半精度浮点数是一种相对较新的浮点类型。 英伟达在2002年初发布的Cg语言中将它定义为 half 数据类型,并且首次在2002年末发布的GeForce FX中实现。[1]ILM 当时正在寻找一种能够有高动态范围,并且不需要过多消耗硬盘以及内存,而且能像单精度浮点数双精度浮点数那样被用来进行浮点计算的图像格式。[2]SGI的John Airey领导的硬件加速可编程着色小组在1997年发明了作为'bali'设计工作的一部分的s10e5数据类型。这曾在SIGGRAPH 2000年的论文[3]中介绍过。(见章节 4.3)并且在美国专利7518615[4]中被进一步记录。

半精度浮点数可以在包括OpenEXRJPEG XROpenGLCg语言和D3DX等数种计算机图形环境中使用。与8位或16位整数的相比,它的优点是可以提升动态范围,从而使高对比度图片中更多细节得以保留。与单精度浮点数相比,它的优点是只需要一半的存储空间和带宽(但是会以精度和数值范围为代价)。[2]

定义[编辑]

IEEE 754 标准指定了一个 binary16 要有如下的格式:

  • Sign bit(符号位): 1 bit
  • Exponent width(指数位宽): 5 bits
  • Significand precision(尾数精度): 11 bits (有10位被显式存储)

按如下顺序排列:

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

引用[编辑]

外部链接[编辑]