圓州率
🌐

Feature Image

浮點數運算

數學, 演算法
簡介電腦在計算浮點數時出現的計算誤差量,以及相對應的解法。
   最後更新:

浮點數運算實作

現今的動態記憶體存取能做到:xx運算後數值太大,能再向記憶體所要存取空間,以存取更大的數值。

然而除法常見的無限小數在電腦中無法實現,因為不存在「無限的記憶體空間」,實務上會用小數點後nn位來實現xx的近似值,也因此真實值 (xrealx_{real}) 與計算值 (xcalx_{cal}) 存在誤差。

xrealxcal<10n |x_{real} - x_{cal}| < 10^{-n}

運算累積誤差

以加法為例,將 x,yx, y 兩數相加,誤差會被擴大

(x+y)real(x+y)cal<xrealxcal+yrealycal=2×10n \begin{align*} |(x + y)_{real} - (x + y)_{cal}| & < |x_{real} - x_{cal}| + |y_{real} - y_{cal}| \\ & = 2 \times 10^{-n} \end{align*}

x(i)x^{(i)} 為用執行 ii 次運算後的數值,則 10m10^m 次運算後

xreal(10m)xcal(10m)<10(nm) \left| x_{real}^{(10^{m})} - x_{cal}^{(10^{m})} \right| < 10^{-(n - m)}

則精度會下降至小數點後 nmn - m 位,即運算會累積誤差,且運算越多,愈差越大。

遠離誤差項

若真實值非常小,則計算值容易被誤差數值干擾。放大計算值,遠離誤差項會比較安全。將 xx 放大 zz 倍,令 y=zxy = z x,則運算後的誤差仍然存在。

yreal(10m)ycal(10m)=zxreal(10m)xcal(10m)<10(nm) \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=10kz = 10^{k},在運算完後除以 zz

xreal(10m)xcal(10m)<10(nm+k) \left| x_{real}^{(10^{m})} - x_{cal}^{(10^{m})} \right| < 10^{-(n - m + k)}

精度能保有小數點後 nm+kn - m + k

限制

一般而言

f(kx)kf(x) f (kx) \ne k f (x)

也就是此方式存在一定的限制性,得想辦法找到相對應的函數 g(k)g (k) 來變回原始的 f(x)f (x)

f(kx)=g(k)f(x) f (kx) = g (k) f (x)

使得

f(x)=f(kx)g(k) f (x) = \frac{f (kx)}{g (k)}