コンピューターは、あらゆる数値計算を素早く行ってくれますが、記憶できる値に制限があります。例えば、無理数の場合、正確には無限の桁数となりますが、コンピューターでは有限の桁数しか扱えませんので、無理数を正確に記憶できません。
このため、コンピューターでは、丸め誤差と呼ばれる誤差が発生します。以下では、丸め誤差の一例を紹介します。
丸め誤差
コンピューターは、無限に記憶できない
√2 の2乗の結果はどうなるのか
以下は、2つの √2 の値をかけて、その結果を表示するプログラムソースコード例です。printf 文にて、%.16f としてあるのは、小数点以下16桁まで表示するためです。
#include <stdio.h> #include <math.h> int main(void) { double num1, num2; double result; num1 = sqrt(2.0); /* √2の値を代入 */ num2 = sqrt(2.0); /* √2の値を代入 */ result = num1 * num2; /* √2×√2の値を代入 */ /* resultの値を小数点以下16桁まで表示する */ printf("%.16f\n", result); return 0; }
数値計算実行結果
上記のプログラムをコンパイルし実行すると、以下のような結果が表示されます。
2.0000000000000004正確な答えは丁度2のはずですが、結果はそうなっていません。 これは、sqrt(2.0) の値を代入した num1 と num2 では、有限な桁数で記憶したために、丸め誤差が発生した事が原因です。よって、正確には√2の値になっていないもの同士をかけて計算したので、その結果は丁度2にならないというわけです。また、小数点以下15桁まで0が続いているため、精度が15桁である事がわかります。以上の結果は、プログラム実行環境によって異なる場合があります。
2009/04/25 更新