Programming Practice #0~Machine Epsilon

Programming Practice #0~Machine Epsilon

プログラミングの実践講座の連載開始です。何年続くか全く分かりませんが気力が続く限り連載する意気込みです。シリーズ第一回目のテーマは計算機イプシロンです。

計算機イプシロンとは一般の方には全く馴染みがないと思いますが、科学技術計算をする人にとっては避けては通れないIssueです。一般的に「丸め誤差」と呼ばれています。

科学技術計算では大きい桁数を扱うために導入された浮動小数点演算を扱う関係上、必ず演算誤差が発生します。浮動小数点演算は世界統一規格に則って実行され、高速で処理する専用の演算子(FPU)がパソコンレベルにも備わっています。

この丸め誤差は倍精度を扱う科学技術計算では「2の-53乗」に等しくなります。詳細はこちらをご参照ください。要は、計算機は2進法でしか処理できないので小数の10進数を2進法に変換する際誤差が生じるという物です。

丸め誤差という言葉から、大学初年度の解析入門の授業で学んだ「イプシロンデルタ論法」を思い出します。この定義で一挙に壁に当たり、高校時代得意だった数学から興味を失いました。尤も理工系学科の在籍だったので大きな支障はありませんでしたが数学科だったら落第ものでしたね。

今でもハッキリ覚えています。

数列\({Xn}\)において、任意の正の数\(\epsilon\)に対して、適当な番号\(m\)を決めると、
        \(n>m\)のすべての\(n\)について \(|Xn-a|<\epsilon\)
となるならば、これを
        \(n\rightarrow\infty\)のとき、\(Xn\rightarrow a\); あるいは\(\displaystyle \lim_{n \to \infty} Xn=a\)
という記号で表し、このとき、数列\({Xn}\)は\(a\)に収束するという。また、\(a\)を数列\({Xn}\)の極限値という。

例えば、番号\(n\)を大きくしさえすれば、\(|Xn-a|\)を\(0.1\)よりも\(0.01\)よりも、どんな小さな正の数\(\epsilon\)が与えられても、なおかつ、それよりも小さくすることができるということである。

しかしながら、計算機の世界では丸め誤差のよりその小さい正の数には限界があると云う事になってします。イプシロンデルタ論法には直接関係ありませんがね。

参考までに丸め誤差を算定するFortranプログラムを貼り付けておきます。

subroutine CalculateMachineEpsilon(EPSMAC)
!********************************************************************
    implicit none
    double precision EPSMAC
!====================================================================
    EPSMAC = 1.0
    do while (1.0+EPSMAC > 1.0)
        EPSMAC = 0.5 * EPSMAC   
    enddo   
    EPSMAC = 2.0 * EPSMAC
!====================================================================
end subroutine

 以上

Comments are closed.