浮動小数点の数値誤差

ロベールのC++入門講座 03-09

浮動小数点の話で少し驚いた。

下記のようなコードを実行する。

#include <iostream>
using namespace std;

int main () {
    
    for (double i=0.0; i<1; i+=0.1) {
        cout << i << endl;
    }
    
    return 0;
}

条件ではiは1以下までとなっているはずなのに、1まで表示されてしまう。

$ main
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1

これは浮動小数点の数値誤差によるものらしい。

もしこういった計算をしたければ、intの値でまず計算し、出力の寸前でdoubleに変えてやると数値誤差はでない。

#include <iostream>
using namespace std;

int main () {
    
    for (int i=0; i<10; i++) {
        cout << (i / 10.0) << endl;
    }
    
    return 0;
}
$ main
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9

気をつけるべし。