捨入模式
當計算產生的位數比你的格子放得下還多,你必須捨入——但怎麼捨?總是進位、總是捨去、或直接砍掉多餘位數,都會帶入一致的偏向,在數百萬次運算後讓答案漂移。捨入模式就是 FPU 遵循的規則,用來在真正結果落在兩個可表示值之間時,決定保留哪一個。IEEE-754 定義了好幾種,關鍵是把這個選擇明確化、標準化,而非任其隨機。
預設且最重要的模式是「捨入到最近,平局取偶」。挑兩個可表示值中較近的;若真值正好落在正中間,挑最後一位是 0 的那個(「偶」的那個)。為何平局取偶而非一律進位?因為在中點一律進位會帶入一個微小的向上偏差並累積;把一半的平局往下捨、一半往上進,讓誤差平均而言相互抵銷,使長計算在統計上無偏。例子:取到整數,2.5 捨入到 2(偶),3.5 捨入到 4(偶)——各走一半。IEEE-754 也定義有向模式:朝正無窮捨入、朝負無窮捨入、朝零捨入(截斷),對區間算術與取得可證明的誤差界至關重要。
誠實的重點是:捨入不是該被消滅的瑕疵,而是一種有定義、受控的行為。因為模式是標準的一部分,同一支程式在每台符合標準的機器上以同樣方式捨入,這正是浮點結果可重現的緣由。但捨入仍意味著每次運算都可能略有偏差,這些誤差會疊加,粗心的演算法會放大它們——選對模式(或更準確的求和法)是寫出數值穩健程式的一部分。
對中點情形用「捨入到最近、平局取偶」:0.5 捨入到 0,1.5 捨入到 2,2.5 捨入到 2,3.5 捨入到 4。一律進位則會給 1、2、3、4——一個持續的向上偏差,平局取偶正好避開。
平局取偶抵銷了一律進位會累積的向上漂移。
捨入到最近取偶不等同於課本的「逢五進一」;它刻意把平局分流以消除偏差。模式是標準化的,所以相同程式碼到哪都以相同方式捨入——但每次捨入的運算仍可能帶入會累積的誤差。