
浮點數運算
簡介電腦在計算浮點數時出現的計算誤差量,以及相對應的解法。
最後更新:
浮點數運算實作
現今的動態記憶體存取能做到:$x$運算後數值太大,能再向記憶體所要存取空間,以存取更大的數值。
然而除法常見的無限小數在電腦中無法實現,因為不存在「無限的記憶體空間」,實務上會用小數點後$n$位來實現$x$的近似值,也因此真實值 ($x_{real}$) 與計算值 ($x_{cal}$) 存在誤差。
$$ |x_{real} - x_{cal}| < 10^{-n} $$運算累積誤差
以加法為例,將 $x, y$ 兩數相加,誤差會被擴大
$$ \begin{align*} |(x + y)_{real} - (x + y)_{cal}| & < |x_{real} - x_{cal}| + |y_{real} - y_{cal}| \\ & = 2 \times 10^{-n} \end{align*} $$設 $x^{(i)}$ 為用執行 $i$ 次運算後的數值,則 $10^m$ 次運算後
$$ \left| x_{real}^{(10^{m})} - x_{cal}^{(10^{m})} \right| < 10^{-(n - m)} $$則精度會下降至小數點後 $n - m$ 位,即運算會累積誤差,且運算越多,愈差越大。
遠離誤差項
若真實值非常小,則計算值容易被誤差數值干擾。放大計算值,遠離誤差項會比較安全。將 $x$ 放大 $z$ 倍,令 $y = z x$,則運算後的誤差仍然存在。
$$ \left| y_{real}^{(10^{m})} - y_{cal}^{(10^{m})} \right| = z \left| x_{real}^{(10^{m})} - x_{cal}^{(10^{m})} \right| < 10^{-(n - m)} $$若 $z = 10^{k}$,在運算完後除以 $z$
$$ \left| x_{real}^{(10^{m})} - x_{cal}^{(10^{m})} \right| < 10^{-(n - m + k)} $$精度能保有小數點後 $n - m + k$ 位
限制
一般而言
$$ f (kx) \ne k f (x) $$也就是此方式存在一定的限制性,得想辦法找到相對應的函數 $g (k)$ 來變回原始的 $f (x)$
$$ f (kx) = g (k) f (x) $$使得
$$ f (x) = \frac{f (kx)}{g (k)} $$