常見浮點數格式梳理
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×10?85.96\times 10^{-8}5.96×10?8 | 655046550465504 |
fp32 (單精度) | 1.4×10?451.4\times 10^{-45}1.4×10?45 | 3.4×10483.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