計算機算術

保護、捨入與黏滯位元

當 FPU 為對齊指數而把有效位數右移,位元會從暫存器底邊掉出去。若你任它們消失,那麼在你還沒決定怎麼捨入之前就已經損失了資訊——就像在確認零錢夠不夠把帳單進位之前,就先把零錢扔了。要正確捨入,你必須記住一點被移出去的東西。保護、捨入與黏滯位元,就是硬體正為此保留的三個額外低位位元。

它們就位在保留的最低有效位元下方。保護位元是第一個被移出的位元,捨入位元是第二個,黏滯位元則是其後每一個被移出位元的邏輯 OR——只要有任何被丟棄的位元是 1,它就是 1,而且一旦被設起就「黏」在 1。這三者合起來,把被丟棄的尾巴彙總得精確到足以正確地做捨入到最近取偶。判斷如下:若保護位元是 0,往下捨(尾巴不到半個單位)。若保護位元是 1 且捨入位元或黏滯位元任一為 1,尾巴超過一半,所以往上進。若保護位元是 1 但捨入與黏滯都是 0,被丟棄的部分剛好是一半——平局——於是看最後保留的位元來套用取偶。關鍵是你不必保留整條尾巴;黏滯位元把它全部壓縮成一個「下面有沒有任何非零?」的旗標。

這三個微小的位元,正是「完全照 IEEE-754 要求捨入的浮點單元」與「細微卻持續出錯的浮點單元」之間的差別。一個常見誤解是你可以直接截斷多餘位元、或只保留保護位元;少了黏滯位元,硬體就無法分辨真正的中點平局與「剛好超過一半」的值,會把許多結果往錯的方向捨。它們是「只保留剛好夠用的狀態以保證正確性」的小巧優雅範例。

對齊後,被丟棄的尾巴是 1 接著 0 接著 0 接著 1。保護=1、捨入=0、黏滯=OR(0,1)=1。由於保護=1 且黏滯=1,尾巴超過一半,所以往上進。若尾巴是 1,0,0,0,則保護=1、捨入=0、黏滯=0——一個精確的平局,由取偶決定。

黏滯 = 捨入位元以下所有位元的 OR,把整條尾巴壓成一個位元。

截斷、或只保留一個保護位元都不夠:少了黏滯位元,你無法分辨精確的中點平局與剛好過半的值,捨入就會出錯。黏滯位元的任務正是記住「有沒有任何非零被移出去?」。

又称
GRS bitsguard/round/stickyGRS 位元