天天看点

常见浮点数格式梳理常见浮点数格式梳理

常见浮点数格式梳理

IEEE 754 标准

浮点数转换网站:https://www.h-schmidt.net/FloatConverter/IEEE754.html

IEEE二进制浮点数算术标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。

IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。只有32位模式有强制要求,其他都是选择性的。大部分编程语言都提供了IEEE浮点数格式与算术,但有些将其列为非必需的。例如,IEEE 754问世之前就有的C语言,现在包括了IEEE算术,但不算作强制要求(C语言的

float

通常是指IEEE单精确度,而

double

是指双精确度)。

(摘自维基百科)

四种精度的浮点数的各位数含义如下:

符号 阶/指数 尾数 总位数
单精度 1 5 10 16
单精度 1 8 23 32
双精度 1 11 52 64
长双精度 1 15 64 80

各类型浮点数的精度和动态范围:

最小值 最大值
fp16 (半精度) 5.96 × 1 0 − 8 5.96\times 10^{-8} 5.96×10−8 65504 65504 65504
fp32 (单精度) 1.4 × 1 0 − 45 1.4\times 10^{-45} 1.4×10−45 3.4 × 1 0 48 3.4\times 10^{48} 3.4×1048

这里仅介绍最基本的各位的含义,详细的规约形式、移码、舍入等请参考具体标准、相关课程或博客1、博客2。

fp16、fp32与bf16

相信在机器学习领域,除了上面提到的标准的浮点数之外,大家还经常见到的一种浮点数格式就是所谓的 bf16。

  • BF16 是对FP32单精度浮点数截断数据,即用8bit 表示指数,7bit 表示小数。
  • FP16半精度浮点数,用5bit 表示指数,10bit 表示小数;
常见浮点数格式梳理常见浮点数格式梳理

与32位相比,采用BF16/FP16吞吐量可以翻倍,内存需求可以减半。但是这两者精度上差异不一样,BF16 可表示的整数范围更广泛,但是尾数精度较小;FP16 表示整数范围较小,但是尾数精度较高。计算时可避免计算溢出,出现Inf case;FP16 在输入数据超过65506 时,计算结果溢出,出现Inf case。

Ref:

https://zh.wikipedia.org/wiki/IEEE_754

https://www.zhihu.com/search?type=content&q=bf16

https://www.h-schmidt.net/FloatConverter/IEEE754.html

https://blog.csdn.net/a3192048/article/details/106662693

http://c.biancheng.net/view/314.html

继续阅读