数値計算の精度
次のプログラムを実行するとどうなるか考えてから実行してみよう。
code:test1.c
int main(void)
{
double x = 0;
while (x < 1) {
printf("%g\n", x);
x += 0.1;
}
return 0;
}
何が起こっているのかを調べるために %g を %.17g のようにしてみよう。
コンピュータが 0.1 のような簡単な数を正確に表せないとするならば,例えば10%の消費税を計算するために 0.1 を掛けるのも危険かもしれない。金額を入力すると消費税込みの値段を正しく出力するプログラムを作ってみよう。その際,切り捨て・四捨五入・切り上げを正しくするにはどうすればよいか。
2次方程式 $ ax^2+bx+c=0 を解の公式で解くプログラムを書いてみよう。
桁落ちの概念を復習し,2次方程式の一般的な解の公式と,「分子を有理化」したものとでどちらがどういう場合に正確かを考えてみよう。
桁落ちを避けるためには,なるべく同程度の数の引き算をしないほうがよい。例えば $ \log x - \log y は $ \log (x/y) とするほうがよい。同様な例を挙げてみよう。
$ x_0, x_1, x_2, \ldots, x_{n-1} の平均値と分散(あるいは標準偏差)を求めるプログラムを書いてみよう。
よく $ \sum x_i と $ \sum x_i^2 を求めて分散をワンパスで求める方法を薦めている数学書があるが,これでは桁落ちが生じやすい。2パスでよいから桁落ちの生じにくい方法を使おう。
$ f(x) の微分係数を求めるために $ (f(x+h) - f(x)) / h を使うことがあるが,$ h をあまり小さくすると桁落ちのためかえって不正確になる。どれくらいの $ h が適当か,調べてみよう。また,$ (f(x+h)-f(x-h))/2h と比べてみよう。