1

正確に変換できる場合は 10 進数を単項から 2 進数に変換し、変換できない場合はエラー メッセージを返すコードを作成しています。以下は私のコードです。小数点以下のエラーについて混乱しています。1 つのステップでは、n before は 1.12、temp は 1 ですが、出力は 0.12001 です。この種のエラーを回避するにはどうすればよいですか?

list<bool> binary_decimal(double n, bool& flag){
    list<bool> li;
    list<double> left;
    flag = true;
    n = n - (int)n;
    left.push_back(n);
    while(n){
        n = n * 2;
        cout << "n before " << n << endl;  //test area
        li.push_back(n >= 1);
        int temp = (int)n;
        cout << "temp " << temp << endl;  // test area
        n = n - temp;
        cout << "n now = " << n << endl;  //test area
        for(list<double>:: iterator it = left.begin(); it != left.end(); it++){
            if(*it == n){
                cout << "error!";
                flag = false;
                return li;
            }
        }
        left.push_back(n);
    }
    return li;
}
4

1 に答える 1

2

浮動小数点の丸め誤差へようこそ!

数値 0.12 は、終端の 2 進小数として表現できないため、丸め誤差が発生します。

エラーを回避するために、各桁を明示的に計算できます。任意精度の算術演算または「独自の」計算エンジンのいずれかを考えてください。

または、別の方法として、必要な桁数に丸めることもできます。ここでは、小数点以下 4 桁で十分です。

于 2013-10-30T16:52:02.067 に答える