浮點數是計算機上最常用的資料型別之一,有些語言甚至數值只有浮點型(perl,lua同學別跑,說的就是你)。
常用的浮點數有雙精度和單精度。除此之外,還有一種叫半精度的東東。
雙精度64位,單精度32位,半精度自然是16位了。
半精度是英偉達在2023年搞出來的,雙精度和單精度是為了計算,而半精度更多是為了降低資料傳輸和儲存成本。
很多場景對於精度要求也沒那麼高,例如分布式深度學習裡面,如果用半精度的話,比起單精度來可以節省一半傳輸成本。考慮到深度學習的模型可能會有幾億個引數,使用半精度傳輸還是非常有價值的。
google的tensorflow就是使用了16位的浮點數,不過他們用的不是英偉達提出的那個標準,而是直接把32位的浮點數小數部分截了。據說是為了less computation expensive。。。
比較下幾種浮點數的layout:
雙精度浮點數
單精度浮點數
半精度浮點數
它們都分成3部分,符號位,指數和尾數。不同精度只不過是指數字和尾數字的長度不一樣。
解析乙個浮點數就5條規則
1、如果指數字全零,尾數字是全零,那就表示0
2、如果指數字全零,尾數字是非零,就表示乙個很小的數(subnormal),計算方式 (−1)^signbit × 2^−126 × 0.fractionbits
3、如果指數字全是1,尾數字是全零,表示正負無窮
4、如果指數字全是1,尾數字是非零,表示不是乙個數nan
5、剩下的計算方式為 (−1)^signbit × 2^(exponentbits−127) × 1.fractionbits
常用的語言幾乎都不提供半精度的浮點數,這時候需要我們自己轉化。
當然按照tensorflow那麼玩的話就很簡單了(~攤手~)。
關於單精度 雙精度的概念
單精度和雙精度數值型別最早出現在c語言中 比較通用的語言裡面 在c語言中單精度型別稱為浮點型別 float 顧名思義是通過浮動小數點來實現資料的儲存。這兩個資料型別最早是為了科學計算而產生的,他能夠給科學計算提供足夠高的精度來儲存對於精度要求比較高的數值。但是與此同時,他也完全符合科學計算中對於數值...
單精度和高精度乘法
lightoj 1024 include include include includeusing namespace std const int maxn 100010 int ans maxn cnt maxn len int fun int x,int y x代表因子 y代表這個因子出現的次數...
高精度乘單精度
沒壓位的 舉個例子,12345 5 ans 5 4 3 2 1 y 5一變 25 4 3 2 1 x 0 5 25 10 4 3 2 1 x 2 25 10 二變 5 22 3 2 1 x 0 5 2 22 10 3 2 1 x 2 22 10 三變 5 2 17 2 1 x 0 5 2 7 2 1...