2

重複の可能性:
C++ の倍精度と丸め

コード:

int main(void)
{
    double a = 12;
    double b = 0.5;
    double c = 0.1;

    std::cout.precision(25);
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
    std::cout << a + b << std::endl;
    std::cout << a + c << std::endl;

    return 0;
}

出力:

12
0.5
0.1000000000000000055511151
12.5
12.09999999999999964472863

GCC が 0.1 と 0.5 を異なる方法で表現するのはなぜですか? 追加するとき、それらは異なって表現されます。0.5 と整数は、他のフロートとは異なる方法で表現されているようです。それとも、これはioライブラリで起こっていることですか?この動作の原因は何ですか?

4

4 に答える 4

5

桁数が有限の 10 進数が 10 のべき乗の合計である数値のみを正確に表すことができるように、2 進浮動小数点数は 2 の累乗の合計である数値のみを正確に表すことができます。

この場合、0.1は 2 のべき乗の有限和として表すことはできませんが、0.5and12は (0.5は 2 -112等しく、 は 2 3 + 2 2に等しくなります)。

さらなる例として、0.75 は 2 -1 + 2 -2として表現できるため、2 進浮動小数点でも正確に表現できます。

于 2012-05-25T06:56:58.337 に答える
4

0.1 は 2 の累乗ではないため、2 進数で正確に表すことはできず、代わりに本当に、本当に、本当に近い数値で表す必要があります。これが、学生が浮動小数点数を比較するときに演算子を使用しないように教えられている理由で==あり、銀行アプリケーションはほとんどの場合、金額とペニーの数の 2 つの整数としてお金を格納します。

于 2012-05-25T06:45:29.533 に答える
4

これらの質問に対するデフォルトの回答:

すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

基本的に、浮動小数点エンコーディングの不正確さです。あなたは約17桁の有効数字を持っており、算術演算を行うとそれらが減少します。

于 2012-05-25T06:46:07.233 に答える
0

これを読む

http://floating-point-gui.de/

于 2012-05-25T06:48:36.507 に答える