計算機算術

浮點運算單元(FPU)

/ FPU = eff-pee-you /

整數很適合計數,但許多運算需要分數與極大範圍的量值——從星系間的距離到原子的大小。浮點數把這類數字存成一個符號、一個有效位數(有意義的數字)與一個指數(二進位小數點落在哪),很像科學記號:6.02 乘 10^23。浮點運算單元(FPU)就是對這種三部分數字做算術的專用硬體,與整數 ALU 分開,因為步驟相當不同。

看浮點加法就明白它為何需要自己的機器。要把 1.5 乘 2^3 與 1.0 乘 2^1 相加,你不能直接把有效位數相加——它們的二進位小數點在不同位置。FPU 必須:(1) 比較指數,把較小數的有效位數右移以對齊二進位小數點;(2) 用整數加法器把現在已對齊的有效位數相加;(3) 把結果正規化,讓領頭的 1 回到它的標準位置,並調整指數;(4) 把有效位數捨入回可用的位元數。乘法在某些方面較簡單(有效位數相乘、指數相加),但仍需正規化與捨入。所以 FPU 綁了移位器、一個整數加法器、一個乘法器、用於正規化的前導零計數器,以及捨入邏輯。

由於這一切比整數運算多工,FPU 為吞吐量而管線化,並依 IEEE-754 標準運作,使同一支程式在不同機器上給出位元精確相同的答案。誠實的現實是:浮點是一種近似——大多數實數無法精確表示,所以每次運算都可能捨入,而那捨入正是浮點著名意外的根源——包括結合律的喪失,使 (a + b) + c 可能不同於 a + (b + c)。

把 1.5(二進位 1.1 x 2^0)與 0.25(1.0 x 2^-2)相加:把 0.25 的有效位數右移 2 位以共用指數 0 來對齊,相加得 1.11 x 2^0 = 1.75,這裡它已正規化、不需捨入。

對齊指數、相加有效位數、正規化、捨入——四個步驟,不是一個。

FPU 算的是近似,不是精確實數。遵循 IEEE-754 使結果在不同機器間可重現,但並不使它們在數學上精確——捨入照樣發生,浮點加法不滿足結合律。

又称
FPU浮點運算單元math coprocessor