情報科学的 ε-δ 論法


□ コンピュータ上の実数は本当の実数ではない

 コンピュータの基本的なデータ型に「単精度や倍精度の実数型」がありますが、 それらはせいぜい 64 ビットで表現できる有限個 ( 264個 ) の数のどれかでしかありません。 無限個存在する実数を有限個の数で代用するのですから、 当然そこに誤差が介入してきます。


□ 計算に誤差はつきもの

 たとえば cos(x) という関数の値を求めることを考えましょう。
 まず思い付くのは cos(x) のテイラー展開

cos(x) = 1 - x2/(2!) + x4/(4!) - ...
を適当な所で打ち切って計算する、ということでしょう。 適当な所で打ち切ってしまいますので、その先の項の和は誤差(打ち切り誤差)になってしまいます。 また x4/(4!) のような単純な計算も、 x の値が厳密であったとしても、 2進法では 1/3 が厳密に計算できないなどの理由で誤差を生じてしまいます。

 更に面白いことには、cos(x) をたとえば x6 の項で打ち切って計算する場合、テイラー展開の正しい係数を用いるよりも、

0.99999981155 - 0.49999395279 x2 + 0.04163632912 x4 - 0.00134007047 x6
とした方が計算誤差が 2 桁小さくなるのだそうです。


□ 誤差を小さくするには

 数学でいう「 関数 f(x) 」とは、C 言語なら

double f(double x)
と宣言される関数と思えば良いでしょう。 その出力誤差を小さくするには ということが重要になります。 前者は「引数 x の入力誤差を制御すれば関数の出力誤差が制御できる」ということです。


□ 情報科学的 ε-δ 論法

 関数 f(x) が x = x0 で連続であることは、ε-δ 論法では

「任意の正数 ε について、或る δ が取れて、
| x - x0 | < δ ならば  | f(x) - f(x0) | < ε
が成り立つ」

と定義されます。 これを入力誤差と出力誤差という言葉で読み換えてみると、

出力誤差 | f(x) - f(x0) | を ε 程度に押さえたければ、 入力誤差 | x - x0 | を δ で押さえればよい
となります。 すなわち、出力誤差 ε が指定されたとき、いつでもそのような δ が取れることが 「関数が連続である」ということです。 逆に、関数が不連続な点 x0 というのは、 いくら入力誤差を制御しても出力誤差を制御できない点のことです。


参考文献: 浜田穂積「近似式のプログラミング」(培風館)
塩田研一のホームページへ