回覆列表
  • 1 # 使用者1935023306605

    所以大學課堂會有數值分析這麼一門課。所以數值分析這門課的一個核心主題就是誤差分析。嚴肅的科學計算中,是先列出公式、演算法,由公式推導理論誤差上界,然後按誤差的界來進行比較、判斷終止條件等。比如說,計算機浮點數運算,IEEE 754 要求硬體上加減乘除、求餘數、開平方根、整數型別轉換等幾個運算是「精確舍入」的,即計算結束後要讓二進位制浮點數的最後一位精度都是準確舍入的,這要求計算過程要 CPU 內部使用比浮點數表示精度更多的位數來計算中間結果。中間表示要多幾位?開平方的迭代要進行幾次?是要靠嚴格的數學分析完成的。浮點數的表示和基本運算的分析可以讀著名論文 [1]。複雜一些的演算法則要讀數值分析的教材/文獻。然而誤差分析很難。一方面,即使是簡單的四則運算,其誤差分析已經很繁瑣或者困難了(比如考慮 (a-b) * c,而 a、b 很接近)。另一方面,對很複雜的演算法即使是計算數學的專家也很難給出精確的誤差上界,能給出的上界又太大而不實用。所以現實中也會使用一些經驗值,特別是當理論誤差上界沒什麼用時。不過誤差分析很難並不是完全無視誤差問題的藉口。像在所有地方無腦寫 abs(x-y) < 1e-6 這種做法當然是錯誤的。如果 x 和 y 絕對值都很大,會不會永遠無法判斷相等?絕對值都很小,會不會永遠當它們相等?實際上,當考慮帶誤差的計算時,就不應該是判斷兩個數是否相等,而是要根據兩個數的來源,判斷兩個計算結果的差是否落在誤差上界之內。舉個例子說吧,如果兩個浮點數 x, y 都是從整數轉化來的,或者只與整數做過加減法運算,那麼兩個數的浮點表示就是 0 誤差的。此時要比較兩個數相等就直接用 x == y 沒有問題。再舉個例子,如果 x 是牛頓法解多項式方程根的迭代結果,y 是上一次的迭代結果,要判斷想得到 8 位有效數字什麼時候應該停止迭代運算。牛頓法的理論分析告訴我們演算法是二階收斂,而多項式計算(四則運算)的浮點舍入誤差遠小於 8 位十進位制精度,因此只需要考慮演算法誤差 |x-y|,那麼比較的應該是 |x-y| / x < 1e-8,即兩次計算的相對誤差。[1]: What Every Computer Scientist Should Know About Floating-Point Arithmetic

  • 中秋節和大豐收的關聯?
  • 讀三毛的夢裡花落知多少的讀後感?