資料表示法與數字系統
尾數(有效位數,mantissa / significand)
在一個浮點數裡,有效位數(舊名尾數)裝著真正的有效數字——數值有意義的那部分——而另外的指數只說明把點放在哪裡。在科學記號的數 6.022 乘 10^23 裡,6.022 是有效位數、23 是指數。有效位數回答「數字是什麼?」,指數回答「在什麼尺度?」。有效位數的位元越多,這個數攜帶的精確度就越高。
浮點數會保持正規化:把點滑動到它前面恰好有一個非零數字,就像科學記號永遠寫成 6.022,而非 0.6022 或 60.22。在二進位裡那個開頭數字必然是 1,而這裡有個標準利用的可愛技巧——既然正規化的二進位有效位數總是以 1 開頭,那個 1 根本不必儲存。它是隱含的(或隱藏的)開頭位元。所以單精度物理上儲存 23 個有效位數位元、卻有效地得到 24 位元的精確度;雙精度儲存 52、得到 53。那個免費的位元純屬巧思、不是魔法。
有一個值得知道的例外,因為它解釋了浮點如何處理最小的那些數。當指數已經到最小值時,這個數無法再正規化;於是它變成次正規(或反正規)值,隱藏的開頭位元被當作 0,精確度被逐步讓出,使數值能平滑地縮向零、而不是一步跳到零(稱為漸進下溢)。誠實的陷阱是:次正規讓極小的值仍可使用,但有效位元變少,所以準確度在那裡悄悄下降——而且在某些處理器上它們也跑得慢得多。
要把 5.0 存成二進位,寫成 1.01 乘 2^2:有效位數是 1.01(二進位)、指數是 2。開頭的 1 不被儲存(它是隱含的),所以只保留 .01 那些小數位元與指數。
正規化的二進位有效位數以隱含的 1 開頭,因而多得一個免費的精確位元。
隱藏的開頭 1 免費給正規化數多一個精確位元,但次正規值放棄它:在零附近,精確度悄悄下降,而某些晶片處理次正規數會慢得多。
又稱
另見