パソコンで数値計算

丸め誤差

コンピューターは、無限に記憶できない

コンピューターは、あらゆる数値計算を素早く行ってくれますが、記憶できる値に制限があります。例えば、無理数の場合、正確には無限の桁数となりますが、コンピューターでは有限の桁数しか扱えませんので、無理数を正確に記憶できません。

このため、コンピューターでは、丸め誤差と呼ばれる誤差が発生します。以下では、丸め誤差の一例を紹介します。

√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 更新