資料表示法:位元、位元組與數值

IEEE-754 浮點數

/ I-triple-E seven-fifty-four /

整數適合表示完整的東西,但世界充滿了分數,以及極大和極小的量——0.5、3.14159、一顆電子的質量、到一顆星的距離。浮點數就是電腦在固定位元數裡儲存這類實數的方式。名字本身就是線索:小數點(其實是二進位點)會「浮動」,所以同一個格式能藉由犧牲精度,同時表示極小和極大的值。IEEE-754 是幾乎放諸四海皆準的標準,明確規定了該怎麼做。

訣竅是二進位的科學記號。就像我們把一個數寫成一個符號、一個分數和一個十的次方(例如 -1.5 乘以 10 的 3 次方),一個浮點數儲存三個欄位:一個符號位元(0 為正,1 為負)、一個指數(以 2 的次方把值放大或縮小)、以及一個尾數,也叫有效數或分數(精確的位數)。32 位元的「float」把位元分成 1 + 8 + 23;64 位元的「double」分成 1 + 11 + 52,換來更高的精度和範圍。對正規化的值,尾數前有一個隱含的前導 1 位元,所以有效數實際上免費多了一個位元的精度,而指數以偏移量儲存,好讓它能表示負和正的次方。

浮點數既驚人地有用,也驚人地微妙。因為只有有限的位元去編碼實數那無限的連續體,大多數值是以「最接近的可表示數」儲存,而非精確——這正是「為什麼 0.1 + 0.2 不正好是 0.3?」的根源。它以精確換取範圍:一個 double 能表示約 10 的 -308 次方到 10 的 +308 次方的數,但一次只有約 15 到 17 位有效十進位數字。把它用於量測的、科學的和圖形的量;當你需要精確時(如金錢)則改用整數(或定點數)。

一個 32 位元 float 把位元排成 1 個符號 + 8 個指數 + 23 個尾數。數字 1.0 是符號 0、一個偏移指數和一個為零的分數(前導 1 是隱含的),儲存為 0x3F800000。

符號 + 指數 + 尾數 = 二進位的科學記號。

絕不要對浮點數做精確相等比較(避免「if (a == b)」);累積的捨入意味著「理應」相等的計算值常相差極小量——改為在一個小容差內比較。

又称
floating pointfloat / double浮點數標準