浮動小数点の情報落ちを追って見た

今日topcoderの問題を解いてて、浮動小数点の誤差ではまりました。問題を単純化したコードが以下になります。

#include <iostream>
using namespace std;

int main(int argc, char** argv) {
    double small = 1e-18;
    double big   = 1;
    double added = small + big;
    cout << added << endl;  // 1が出力される。(small分が切り捨てられてる)
}

加算を行った結果、小数点以下の値が切り捨てられています。一瞬何が起こったのか解らなかったのですが、折角なので追ってみる事にしました。

Continue reading “浮動小数点の情報落ちを追って見た”