浮點數運算與數值表示
定點數表示
想像你一勞永逸地規定:金額永遠寫成小數點後恰好兩位,例如 3.00、12.50、0.07,小數點永遠不移動。定點數(fixed-point)表示在電腦裡做的正是這件事:它把一個數存成一串普通的整數位元,而你只是事先約定好二進位小數點落在哪裡。小數點的位置由約定固定,並不另外儲存。
具體來說,一個定點數值就是一個整數 N 加上一個隱含的比例:實際值為 N / 2^f,其中 f 是事先選定且固定的小數位元數。若 f = 8,則存的整數 384 代表 384/256 = 1.5。加減就是普通的整數運算;乘法會產生 2f 個小數位元,所以要右移 f 位來重新縮放。由於一切都是整數運算,定點數又快、又確定、又不需特殊硬體——這正是它主宰早期計算、DSP 晶片與許多嵌入式控制器的原因。
代價是一張僵硬、間距均勻的網格。有 f 個小數位元時,相鄰值之間的間隔處處都是 1/2^f,所以你必須事先選定範圍與精度並同時承擔兩者:整數位元太少,大數會溢位;小數位元太少,小數會喪失所有細節。浮點數的發明正是為了擺脫這種僵硬——讓小數點浮動,以均勻網格換取一張能涵蓋極大動態範圍、且相對精度大致恆定的網格。
在 Q8.8 格式(8 個整數位元、8 個小數位元)中,整數 333 的位元樣式代表 333/256 = 1.30078125,是最接近 1.3 的網格點。此格式中每個值都是某整數除以 256,而相鄰值的步距恰為 1/256 ~ 0.0039,無論你靠近 0 還是靠近 100 都一樣。
定點數:一張間距均勻、處處絕對步距相同的網格。
定點數提供恆定的絕對精度;浮點數提供大致恆定的相對精度。一般而言並無哪一者「比較準」——它們適合不同的範圍,把兩者混為一談是常見的臭蟲來源。
又称
另见