常見浮點數格式梳理
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