天天看點

常見浮點數格式梳理常見浮點數格式梳理

常見浮點數格式梳理

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

繼續閱讀