機器 epsilon
/ EP-suh-lon /
機器 epsilon 回答一個直白的問題:從 1.0 出發,你能加上的、且加完後結果仍與 1.0 不同的最小數是多少?任何比它更小的數都會被捨掉、徹底丟失。那個門檻是「浮點網格在 1 附近有多細」的一個直接而具體的量度,也是描述某格式精度時最常被引用的單一數字。
形式上,機器 epsilon 是 1.0 與其上方下一個可表示數之間的間隔。當二進位尾數有 p 個位元(含隱含的領先 1)時,這個間隔恰為 2^(1-p)。雙精度中 p = 53,所以機器 epsilon = 2^(-52) ~ 2.22 * 10^(-16);單精度中 p = 24,所以是 2^(-23) ~ 1.19 * 10^(-7)。要小心:有些參考把 eps 定義成這個的一半(2^(-p),即單位捨入)——兩種約定差了 2 倍,所以務必確認某函式庫指的是哪一個。
機器 epsilon 是你衡量一切誤差相關事物的量尺。可靠的有效數字位數約為 -log10(eps),所以雙精度約 16 位、單精度約 7 位。當你要比較兩個浮點數是否「相等」時,應檢驗 |a - b| <= tol,其中容差由 eps 乘上所涉數值大小建構而成,絕不用 ==。而 eps 也告訴你相對誤差的下限:無論多聰明的演算法,都無法從本身也只準到 eps 的輸入交付出比約 eps 更細的相對準確度。
在雙精度中,1.0 + 1e-16 算回來恰為 1.0,因為 1e-16 低於機器 epsilon(約 2.2e-16)而被捨掉;但 1.0 + 1e-15 給出 1.000000000000001,是個不同的數。對 1.0 而言,最小「可察覺」的加法量級約為 2^(-52)。
Eps = 緊鄰 1.0 處的網格間距。
機器 epsilon 只描述 1.0 附近的間距;相鄰值之間的絕對間隔約為 eps 乘以該數的大小,所以在一百萬附近,步距會大上數百萬倍。大致恆定的是「相對」間距。