還不會浮點數轉二進制?下次有人問你,直接把這篇文章扔給他


作為一名程序猿,假如某一天,有一個妹子拿着一個浮點數,求你教她怎么換算成二進制,如果你不能單手求出來,你都不能算一個合格的工具人.....好吧,是一個合格的程序猿(狗頭保命)。

在這里插入圖片描述

回歸正題,有好多小伙伴去工作之后,早已經忘了最基本的計算機基礎,今天,來講下,在計算機中,怎么用二進制表示浮點數?下次再有人問你,就把這篇文章丟給他。

作為一種數據類型,浮點數應用廣泛。在處理諸如訂單交易、貨幣計算、或者商品金額的方面,應該小心慎用浮點數。在定義浮點數變量的時候,不完全理解原理,就容易出現各種揪心的問題。

那么,正題來了。

浮點數在計算機中的存儲方式遵循IEEE 754浮點數的計數標准,那么,IEEE 754浮點數的計數標准怎么表示浮點數的?

  • 浮點數數學表示:

在這里插入圖片描述

  • 符號位(sign):決定該浮點數的正負
  • 尾數(significand):二進制小數,范圍在[1,2)或者[0,1)中
  • 階碼(exponent):對浮點數加權,權重為2的E次冪

IEEE標准754規定了三種浮點數格式:單精度、雙精度、擴展精度。前兩者正好對應C語言里頭的float、double,限於篇幅,本文僅討論單精度、雙精度浮點格式。

其實,IEEE754標准可以概括成一張圖片,如下

在這里插入圖片描述
采用尾數+階碼的編碼方式。其實就是在我們學過的數學知識中,就是類似於科學計數法。即有效數字+指數位

所以,只要給出:符號(S)、尾數部分(M)、階碼部分這三種信息,就可以正確的表示一個浮點數。在C語言中,浮點數的數據類型最常用的就是float、double,那么,他們在計算機中的存儲結構是怎樣的呢?

在這里插入圖片描述
在這里插入圖片描述
浮點數的各個部分的含義如下表格所示

符號部分(S) 階碼部分(E) 尾數部分(M)
0表示正(+),1表示負(-) 階碼部分其實就是指數部分 float 指數部分8位,可以表示的指數范圍位-127~128 double 指數部分11位,可以表示的指數范圍位-1023~1024 決定浮點數的精度 float 尾數部分23位,換算成十進制為223 =8388608,因此精度為6~7位 double 尾數部分23位,換算成十進制為252 =4503599627370496,因此精度為15~16位

結論

浮點數交給計算機存儲的,可能會有精度的丟失問題,出了問題的話,在大型的項目中,是很難找出問題的,因此提前做好規划與計算是有必要的。

在這里插入圖片描述

計算實例

第一個例子

把十進制小數0.475轉換成二進制,具體應該怎么操作?

1. 將小數划分成整數+小數兩部分

2. 整數部分轉換

轉換采用除2取余法,此處的0.475的整數部分為0,不需要操作。

3. 小數部分轉換

轉換采用乘2取整法。詳細看下圖

在這里插入圖片描述
3. 合並結果

整數部分+小數部分,得到二進制結果為 0.101.

根據IEEE754標准,即符號位+尾數+階碼的計數方式,可以表示為

1.01 × 2-1

  • 符號位:0
  • 階碼部分:以float為例子,則為 127 + (-1)=126,所以二進制為:01111110
  • 尾數部分:以float為例子,應為 23位,尾數補齊之后為0100000000000000000000

最終結果為(以float表示)

0011111100100000000000000000000

第二個例子

把十進制小數8.26轉換成二進制,具體應該怎么操作?

在這里插入圖片描述
整數部分+小數部分 得到二進制結果為1000.0100001 .....

根據IEEE754標准,即符號位+尾數+階碼的計數方式,可以表示為

1.0000100001 × 2 3

  • 符號位:0
  • 階碼部分:以float為例子,則為 127 + (3)=130,所以二進制為:10000010
  • 尾數部分0.0000100001...,,它本身無限不循環,但是如果以 float 為例子,截取 23位,表示為00001000010100011110110

最終結果為(以float表示)

01000001 00000100 00101000 11110110

因此,對於這種無限位數的小數,用計算機去存儲必然會導致精度的損失。所以,各位在使用過程中一定要謹慎小心。

結語

浮點數轉換為二進制就講解到這里了,覺得有用的老鐵們,請點贊關注我吧,另外,關注我的老鐵們可以私聊我,獲取浮點數轉換為二進制的神器,這樣子,再也不用自己手撕浮點數轉為二進制了。

在這里插入圖片描述

如果覺得我寫的不錯的話,幫個忙唄

1.關注我的知乎賬號小叢,上面有我的文章同步,同時需要詢問學習計算機經驗的話,也歡迎私聊。
2.點贊,關注我,這是對我最大的鼓勵了,有了你們的鼓勵,我會寫出更多的優質文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM