JavaRush /Java Blog /Random-TW /浮點數裡面有什麼、它是如何運作的?
Ivan
等級 2
Харьков

浮點數裡面有什麼、它是如何運作的?

在 Random-TW 群組發布

內容:

圖片:http://pikabu.ru/

介紹

在學習 Java 的最初幾天,我遇到了浮點數這樣奇怪的原語類型。我立即對它們的功能感興趣,更感興趣的是它們用二進位程式碼(互連的)編寫的方式。與任何整數範圍不同,即使在非常小的範圍內(例如,從 1 到 2),它們的數量也是無限的。而且記憶體大小有限,不可能表達這個集合。那麼它們是如何用二進位表示的以及它們是如何運作的呢?唉,維基上的解釋和一篇關於哈布雷的相當酷的文章沒有讓我完全理解,儘管它們奠定了基礎。直到隔天早上讀完 這篇分析文章後,我才意識到這一點。

歷史之旅

摘自Habré的這篇文章)在60-70年代,當電腦很大而程式很小時,仍然沒有單一的計算標準,也沒有一個表達浮點數本身的標準。每台計算機的處理方式都不同,都有自己的錯誤。但在 70 年代中期,英特爾決定製造支援「改進」演算法的新處理器,同時對其進行標準化。威廉·卡漢(William Kahan)和約翰·帕爾默(John Palmer)教授(不,不是有關啤酒的書籍的作者)被聘請來開發它。雖然發生了一些戲劇性的事情,但制定了新的標準。現在這個標準被稱為IEEE754

浮點數格式

即使在學校教科書中,每個人都面臨著以 1.2 × 10 31.2 E3形式書寫非常大或非常小的數字的不尋常方式,這等於1.2 × 1000 = 1200。這稱為指數記數法。在這種情況下,我們使用以下公式處理數字的表達式: N=M×n p,其中
  • N = 1200 - 結果數字
  • M = 1,2 - 尾數 - 小數部分,不考慮階次
  • n = 10是順序的基數。在這種情況下,當我們不談論計算機時,基數是數字 10
  • p = 3 - 鹼度
通常,階數的基數被假定為10 ,並且僅寫入尾數和基數的值,並用字母E分隔它們。在我們的範例中,我給了等效條目1.2 × 10 31.2 E3 如果一切都清楚了,並且我們已經完成了學校課程的懷舊之旅,那麼現在我建議忘記這一點,因為在形成浮點數時,我們正在處理二的冪,而不是十的冪,即 n = 2,整個和諧公式1.2E3崩潰了,真是傷透了我的腦子。

標誌和學位

那我們有什麼呢?因此,我們還有一個二進制數,它由尾數組成- 我們將求冪的部分和冪本身。此外,正如整數類型常見的那樣,浮點數有一個位元來確定符號 - 數字是正數還是負數。作為範例,我建議考慮float由 32 位元組成的 type 。對於雙精度數,double邏輯是相同的,只是位數是雙精度數的兩倍。在 32 位元中,第一個最高有效位元分配給符號,接下來的 8 位元分配給指數(尾數的冪),剩下的 23 位元分配給尾數。為了進行演示,讓我們來看一個例子: 浮點數的內部結構及其工作原理 - 1第一點非常簡單。如果第一位的值為0,那麼我們得到的數字將為正數。如果該位為1,則該數將為負數。下一個 8 位元區塊是指數區塊。指數被寫成一個普通的八位數,為了獲得所需的次數,我們需要從結果數中減去127 。在我們的例子中,指數的八位數是10000001。這對應於數字129。如果您對如何計算有疑問,那麼圖片會顯示一個快速答案。任何布林代數課程都可以獲得擴展版本。 浮點數的內部結構及其工作原理 - 21×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 不難算出,這8位我們能得到的最大數是 11111111 2 = 255 10(下標210表示二進制和十進制)但是,如果我們只使用正指數值(從0到255),那麼得到的數字會有很多小數點之前的數字,但小數點之後沒有?要獲得次數的負值,需要從產生的指數中減去127。因此,度數範圍為-127 到 128。使用我們的範例,所需的度數將為129-127 = 2。現在讓我們記住這個數字。

尾數

現在關於尾數。它由 23 位元組成,但在開始時總是隱含另一個單元,而未為其分配位元。這樣做是出於方便和經濟的原因。在小數點前面或後面的尾數加零,可以用不同的冪表示相同的數字。理解這一點的最簡單方法是使用十進制指數: 120,000 = 1.2×10 5 = 0.12×10 6 = 0.012×10 7 = 0.0012×10 8等。然而,透過在尾數開頭輸入固定數字,我們每次都會收到新的數字。我們理所當然地認為,在我們的 23 位元之前,還會有 1 位元加 1。通常,該位與其餘部分用點分隔,但這並不意味著任何內容。就是比較方便1. 111000000000000000000000 浮點數的內部結構及其工作原理 - 3現在需要從左到右對所得尾數求冪,每一步減一。我們從計算得到的冪的值開始,即2 (我故意選擇了一個簡單的例子,以免把2的冪的每個值都寫出來,也沒有在上表中計算)對應位為零) 浮點數的內部結構及其工作原理 - 41× 2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0.5 = 4+2+1+0.5 = 7.5 並且得到結果7.5,可以檢查正確性,例如在此鏈接

結果

標準浮點數float由 32 位組成,第一位是符號(+ 或 -),接下來的 8 位是指數,接下來的 23 位是尾數 按符號 - 如果位 0 是正數。若位 1 為負。 通過指數- 我們按位轉換為十進制數(左起第一位是128,第二位是64,第三位是32,第四位是16,第五位是8,第六位是4,第七位是2,第八個是1 ),從結果數中減去127,我們就得到了開始的度數。 根據尾數- 在前面現有的 23 位中,我們添加另一個值為 1 的位,並從它開始提高我們收到的冪,並隨著每個後續位遞減該冪。 這就是大家,孩子們! 浮點數的內部結構及其工作原理 - 5PS:作為家庭作業,請使用本文,在評論中留下你的版本,說明為什麼大量浮點數算術運算會出現精度錯誤
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION