誤差について

真値と近似値との差を誤差といいます[1]。数値計算を行なうにあたりどのような 誤差が生じるかをまとめてみると
モデル誤差 より単純なモデルを考えるために生じる誤差
近似誤差 数学的モデルを計算可能とするために近似式で計算する時生じる誤差
打ちきり誤差 数学的に厳密に与えられる関数"f"の値を有限回の四則演算の反復計算式 "f0"で近似する時生じる誤差
入力誤差 有限桁数で入力データを表現するために生じる誤差
計算誤差 丸め誤差、桁落ち誤差、誤差の伝搬をまとめて計算誤差
出力誤差 出力する桁数が実際の桁数より少ないために生じる誤差
一番やっかいなのが計算語差でしょう。
  1. 丸め誤差: 計算機の中での数値表現は有限桁数であるため、四則演算の たびにその結果は有限の桁数で表現される。これを丸めといい、丸めの時に 生じる誤差を丸め誤差という。
    [例] 5桁の計算機で計算する時、
    123.45 * 0.567 = 69.99615 --> 69.996
  2. 桁落ち誤差: 近接する2数の引き算で有効桁数が失われる現象
    [例] sqrt(5001) (70.71775)とsqrt(5000) (70.71068)の差をとると
         sqrt(5001) - sqrt(5000) = 70.71775 - 70.71068 = 0.00707
    
    となり計算結果の有効数字は7桁から3桁に下がる。
  3. 誤差の伝搬による誤差:与えられた変数に含まれる誤差が計算過程で 次々と伝わり最後の結果にいたる様子。
このように誤差にはさまざまな原因があります。では誤差を全くなくすのは 無理としてもできるだけ少なくするにはどうしたらよいでしょう。以下がその 対策です。
  1. 倍精度計算を行なう
  2. アルゴリズムの改良
  3. 計算値の中心を移動する

  1. 平方根の差
    サンプルプログラムその出力結果
    上の例にあるのでつくってみた。"EXACT"と書いているものが分数化して計算した ものである。50000くらいになると相対誤差が数 % のオーダーになり、かなり 大きい。倍精度実数計算によってかなり改善される。
  2. 二次方程式の解
    サンプルプログラムその出力結果
    解の公式を使って計算したものが一番上、二番目がアルゴリズムを工夫した もの、三番目が倍精度実数で計算したもの。アルゴリズムを工夫したものは相対誤差は ほとんど0であり、桁落ちが生じていないことがわかる。倍精度実数計算によっても かなり改善されるが、数字の差が大きくなるにつれて誤差があらわれてくる傾向が みられ、アルゴリズムを工夫することが重要であることが理解できる。
  3. 数値積分
    サンプルプログラムその出力結果
    区間の分割数をあまり大きくしすぎると丸め誤差が蓄積されていくのがわかる。
(注)上のサンプルプログラムを例えば自分のところへコピーし、コンパイル+実行 しても上の出力結果と同じにはならないと思われる。とくに単精度の計算結果が 予想されるものにならず、倍精度の計算をした結果と変わらなくなってしまう であろう。これは演習で使っているコンパイラが "f2c + gcc"であるためである。 もう少し詳しく言うと、"f2c"とはFORTRANのソースプログラムをCに変換する ためのソフトで、それをgccというCコンパイラでコンパイルしているのである。 上のプログラムでは組み込み関数"sqrt"を使っているが、Cではsqrtの返り値は 倍精度実数を返す。ここで精度が勝手に回復されてしまう。”出力結果”の 方は普通のFORTRANコンパイラを使った時の結果であり、こちらではもくろみ通りの 結果が得られる。

参考文献

[1]川崎晴久著、"C&FORTRANによる数値解析の基礎" (共立出版)
本講義の目次へ戻る