IEEE 754 標準
/ I-triple-E seven-five-four /
IEEE 754 是大家共同約定的標準,明確規定浮點數如何在位元中排列、以及對它們的算術必須如何行為。在它之前,每家電腦廠商的浮點做法都略有不同,所以同一個程式在不同機器上可能給出不同答案。這個標準在 1985 年首次發表,終結了那場混亂:如今幾乎所有 CPU 與 GPU 都遵循它,這就是為什麼一個計算不論跑在手機、筆電還是超級電腦上都給出相同結果。
它定義了固定的位元配置。常見的 32 位元形式(單精度,稱為 binary32 或 float)用 1 個符號位元、8 個指數位元、23 個有效位數位元。64 位元形式(雙精度,binary64 或 double)用 1 個符號位元、11 個指數位元、52 個有效位數位元,提供遠更高的精確度與範圍。指數以偏移儲存:不用符號,而是加上一個固定的偏移量(單精度 127、雙精度 1023),使儲存的指數永遠非負,這讓比較大小變容易。標準也定義了特殊位元圖樣——正零與負零、正無窮與負無窮、以及 NaN(非數值)——並把捨入釘死,要求必須給出正確捨入的結果。
這在實務上為何重要:IEEE 754 讓浮點可攜且可預測,但它沒有讓浮點變精確。標準保證基本運算給你正確捨入的答案,但那個答案仍是近似,同樣的誠實陷阱也還在——0.1 不精確、相等比較不安全、捨入會累積。再一個誠實之處:並非每個 IEEE 754 特性在每顆晶片上都快;尤其是次正規數,在某些硬體上會慢得驚人,這是真實的效能陷阱、不是理論上的。
在單精度(binary32)裡,數 1.0 儲存為符號 0、指數位元 0111 1111(即 127,代表去偏移後的指數 0)、有效位數全為零——因為 1.0 是 1.0 乘 2^0。1023 與 127 這兩個偏移,正是儲存的指數被平移、永不為負的原因。
符號、加了偏移的指數,以及有效位數欄位,構成一個 IEEE 754 數。
IEEE 754 讓浮點可攜卻不精確:它保證正確捨入的結果,但那些結果仍是近似。次正規值在某些硬體上可能慢得多——這是真實而非理論上的陷阱。