【梳理】計算機組成與設計 第3章 算術 第2節 浮點(內附文檔高清截圖)

配套教材:
Computer Organization and Design: The Hardware / Software Interface (5th Edition)
這是專業必修課《計算機組成原理》的複習指引。建議將本複習指導與博客中的《簡明操作系統原理》配合複習。
在本文的最後附有複習指導的高清截圖。需要掌握的概念在文檔截圖中以藍色標識,並用可讀性更好的字體顯示 Linux 命令和代碼。代碼部分語法高亮。
計算機組成原理不是語言課,本複習指導對用到的編程語言的語法的講解也不會很細緻。如果不知道代碼中的一些關鍵字、指令或函數的具體用法,你應該自行查找相關資料。


第二節 浮點

12、浮點(floating-point)是一種數據格式。之所以這樣命名是因爲小數點的位置不固定。計算機中採用科學計數法(scientific notation)表示一個浮點數。採用科學計數法的優點有:
(1)簡化了包含浮點數的數據交換。
(2)簡化了浮點數的算法,因爲所有浮點數都始終保持這一種格式。
(3)儘可能增加了數據的精度(相同的存儲空間而存儲精度更高),因爲不必要存儲一連串前導0(leading 0)。科學計數法中,沒有前導0的數稱爲規範化(normalized)的數。

13、一個浮點數中,一部分是小數(分數(fraction)),一部分是指數(exponent)。這兩部分互相擠佔存儲空間:其中一項多一位,另一項就少一位。第二章我們已經提過:好的設計要求好的妥協。
浮點數除了有上溢(overflow)的概念以外還有下溢(underflow),分別代表浮點數過大或過小以至於指數部分不能表示。

14、計算機中的浮點數主要有單精度(single precision)和雙精度(double precision)兩種。它們的格式如下:

單精度和雙精度的最高位都是符號,正0負1;單精度的指數部分是8位,分數23位;雙精度的指數部分是11位,分數部分是52位。它們都由IEEE-754標準規定。符號位放在最高位,指數位放在分數位之前,能夠簡化浮點數與整數混合的一組數據比較大小的過程。
上面的格式中,指數和分數部分自然也是二進制的;將能夠表示的範圍轉換成十進制,單精度和雙精度能表示的絕對值範圍大約分別是:1.18×10-38 ~ 3.40×1038,2.23×10-308 ~ 1.79×10308。
除了0以外,分數部分總是在1到2之間。由於1也算一個有效位,所以有效位數(significand)是指數部分的位數+1。當所有位數都是0時,浮點數表示0。還有專門的值表示正負無窮大和NaN(Not a Number)。

設分數部分爲F,指數部分爲E,符號位S,指數偏移(exponent bias)B,則一個浮點數的值可以表示爲:
(–1)S×(1 + F)×2E–B
對單精度浮點數,B = 127;對雙精度浮點數,B = 1023。
有很多數是無法用常見的浮點格式精確表示的,這時它們會被轉換成離實際數據最近的浮點數保存。

15、2008年,IEEE修訂了IEEE-754標準,稱爲IEEE-754 2008。相比IEEE-754 1985,新版本的標準增加了對半精度(half precision)和四精度(quadruple precision)的支持,也增加了十進制算術的規定。IBM的大型機已經跟進了十進制算術。目前還沒有硬件提供對四精度的支持。

16、在IEEE 754以前,爲了擴大浮點數能表示的範圍,一些計算機表示浮點數並非採用二進制。例如IBM 360、370大型機採用16進制。也就是說,這種計算機的浮點格式中的指數部分每位移一位,相當於乘或除以16。“規格化”後的16進制浮點數最多可以有3個前導零(前導零的數量達到4的時候纔可以修改分數部分和指數部分使得分數部分的最高位非0)。於是,16進制浮點在使用過程中,有效位數部分最多有3個bit需要丟棄(二進制位被前導0佔了),這就帶來了精度上的大問題。IBM的大型機目前既支持IEEE 754標準,也支持十六進制的浮點格式。

17、浮點數的加法過程如下:

先比較指數,當指數不同時,調整指數和分數部分,使得指數較小的浮點數的指數與指數較大的浮點數的相同。然後就可以將有效位相加。接下來將相加的結果規範化,結合左移右移和指數的加減來調整。下一步檢查是否上溢或下溢。如是,拋出異常;如否,對結果進行舍入。如果舍入之後變得不規範化,則重新進行規範化,直到舍入後的結果也規範化爲止,然後輸出。
現代的許多計算機的CPU中包含專門的浮點處理單元(Float processing unit,FPU)來進行浮點運算。

FPU中有一個小的ALU,用於比較兩個指數不同的浮點數誰的指數更大。比較結果控制三個數據選擇器,也叫多路選擇器(multiplexer,MUX),它們選擇較大的指數和兩數的有效位,然後根據比較結果進行調整,使得指數相同,然後將有效位在大的ALU中相加,接着對結果進行舍入。

18、浮點數乘法的計算步驟如下:

先將指數加起來(要加回多減去一次的指數偏移),然後把有效位相乘,規範化,再檢查是否溢出,然後舍入。如果舍入後並非規範化的浮點數,再次規範化(位移有效位兼加減指數),直到舍入後仍舊規範化爲止,計算結果的符號並輸出。

19、C / C++和許多語言的二維數組是行優先存儲的(row-major order),也就是說存儲順序是a[0][0],a[0][1],a[0][2],……。Fortran則採用列優先存儲。

20、爲了提高舍入的精度,在浮點數的計算過程中會多留兩位有效數字,稱爲保護位(guard bit)。當需要計算乘法時,兩位保護位是必要的:乘法的結果可能會出現一個前導零,這時候因爲要進行規範化,有效位會被左移一位,這時候一個保護位就會移到最低有效位(least significant bit,LSB)處,這時候仍然需要另一個位於最低有效位右側的保護位來進行舍入。ULP(units in the last place)用於衡量浮點誤差,代表浮點數可以表示的有效數字有幾個低位與實際結果不同。IEEE 754保證計算機在使用單精度和雙精度浮點每次進行各種運算時的誤差在1.5 ULP以內。

21、IEEE 754規定了四種舍入模式:向正無窮舍入、向負無窮舍入、截斷(truncate)、向最近的偶數舍入。一個更公平的方法是隨機決定:一半的概率向上舍入,一半的概率向下。IEEE 754規定了這個辦法:如果是奇數,進一;如果是偶數,截斷。
爲了實現向最近偶數舍入,除了保護位以外還多了一位粘滯位(sticky bit)。向最近偶數舍入時,入的條件爲guard = 1 and sticky = 1,或,guard = 1 and sticky = 0但精度最低位爲1。

22、PowerPC、SPARC64和支持SSE、AVX的架構均支持乘加融合(fused multiply add,FMA)指令。這個指令計算a = a + b×c。IEEE 754-2008也添加了FMA支持。這種算式很常用,因此FMA指令大大提升了性能。而且,FMA只在執行完加法後進行一次舍入,而非在乘法和加法的過程中各舍入一次,也提高了精度。

23、有序比較(ordered compare)和無序比較(unordered compare)的區別是:一次有序比較檢查是否兩個操作數都不是NaN。一次無序比較檢查兩個操作數中是否任意一個操作數是NaN。與NaN的比較結果是不確定的(無法確定結果),因此,有序 / 無序比較用來檢查是否是這種情況。

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章