浮點數運算與數值表示

尾數與指數

把科學記號拆開來看:在 6.022 * 10^23 中,6.022 是承載數字的部分,23 則說明這個數有多大。浮點數正是這樣拆分的。尾數/假數(significand,常被籠統稱作 mantissa)保存有效數字,指數(exponent)則是縮放它們的基底次方。值 = ±尾數 * base^指數。符號是第三個獨立的部分,只佔一個位元。

在位元層面,尾數與指數各有固定寬度的欄位。在二進位中,正規化的尾數寫成 1.f,其中開頭的 1 被視為理所當然而不儲存——即「隱含的領先位元」——所以你免費多賺到一個位元的精度;只保存小數部分 f。指數則以「偏移量(bias)」儲存:不用帶號整數,而是把 指數 + bias 存成一個無號數,於是最小指數對應到 0、最大指數對應到全 1。這個「存值加偏移」的技巧讓同一套無號比較硬體能正確地排列浮點數的大小。

這個拆分賦予浮點數其性格。尾數決定你保留多少位有效數字——即你的「相對」精度,在 1 附近與在一兆附近一樣——而指數決定「範圍」,即你能命名的數值有多大或多小。尾數位元越多換來越高的精度;指數位元越多換來越大的動態範圍。單精度與雙精度不過是這兩個欄位的不同預算配置。

IEEE 單精度(32 位元)配置為 1 個符號位元、8 個指數位元、23 個小數位元,偏移量為 127。要儲存 -1.5 = 二進位 -1.1 * 2^0:符號 = 1、小數部分 = 1000...0(其中的 1. 是隱含的)、儲存指數 = 0 + 127 = 127。24 個有效尾數位元給出約 7 位十進位有效數字。

符號 + 尾數 + 偏移指數:浮點數的三個欄位。

「mantissa(假數)」是歷史用語,但嚴格說它指的是對數的小數部分;數值分析學家偏好用「significand(尾數)」。隱含的領先 1 只適用於「正規化」數——次正規數會捨棄它。

又稱
mantissa and exponentfraction and exponent假數與指數