電腦算術

當 x 非常大時,以浮點數計算 √(x + 1) − √x 會發生位數消去。為了精確求得結果,下列何者是正確的改寫方式?

  1. A改為 1 ÷ (√(x + 1) + √x) 來計算
  2. B改為 √(x + 1 − x) 來計算
  3. C先將 √(x + 1) 與 √x 分別改為雙精度,再以相同的算式相減
查看答案與解析

正確答案:A. 改為 1 ÷ (√(x + 1) + √x) 來計算

√(x + 1) 與 √x 幾乎相等,因此直接相減時高位的位數會互相抵消。若將分子與分母同乘以 √(x + 1) + √x,便成為 (x + 1 − x) ÷ (√(x + 1) + √x) = 1 ÷ (√(x + 1) + √x),不再有相近數之間的減法,因此能精確計算。√(x + 1 − x) 會變成1,作為算式是錯誤的。改用雙精度雖然會有所改善,但若x更大,仍會發生相同的問題,因此並非根本的對策。

  • A. 正確。透過消除減法的變形,可避免位數消去。
  • B. √(x + 1 − x) 會成為1,與原算式並不相等。
  • C. 即使是雙精度,x更大時仍會發生相同的問題。
練習這個領域 前往領域頁面

電腦算術的其他題目

  1. 以單精度浮點數將1億(10⁸)加上1,結果仍維持為1億而沒有改變。關於此現象,下列說明何者正確?
  2. 在加總大量浮動小數時所使用的Kahan加法(帶補償的加法),其目的下列何者正確?
  3. 以FMA(融合乘加運算)指令計算 a × b + c 的優點,下列何者正確?
  4. bfloat16主要被用於AI訓練的理由為下列何者?
  5. 以FP16(半精度:符號1・指數部分5・尾數10位元)訓練類神經網路時容易發生問題,而以將損失值放大數倍後再計算的方法(損失縮放,loss scaling)來因應的是下列何者?