-3

大学で C++ を使用して行っている課題で、負のゼロとゼロを並べ替えることができなければなりません。次のコードが負のゼロを生成する理由を教えてください。私は立ち往生しており、なぜこれが機能するのかわかりません...

        cout << "Enter the number of elements you want to add to the vector:\n";
    cin >> x;
    cout << "Enter the integers: \n" << endl;
    for (int i = 0; i < x; i++)
    {
        cin >> y;
        y = y - 0.0;
        cout << y; 

        Array.push_back(y);
    }

上記のベクトルをソートするときに負のゼロを生成するより良い方法がある場合は、アドバイスしてください。どうもありがとう!

4

1 に答える 1

4

まず第一に、標準 C++ には負のゼロが存在する必要はないので、IEEE-754 の負のゼロについて話していると思います。これは、ほとんどの (私は例外に遭遇したことはありません) C++ 実装が浮動小数点演算の基礎となるものです。

この場合、式

y = y - 0.0;

その割り当ての前に、または丸めモードを「-INFINITYに向かっ-0.0て丸める」に設定した場合にのみ生成されますが、通常はそうではありません。y == -0.0

doublevalueで実際に を生成する-0.0には、目的の値を割り当てるだけです。

double d = -0.0;

現在d == -0.0、IEEE 浮動小数点演算で使用されています。

ただし、

比較ではゼロの符号は無視されます

(IEEE 754-1985、5.7. 比較) は-0.0 < 0.0を生成するfalseため、実際に負のゼロを正のゼロの前に並べ替えたい場合は、おそらく を使用して、独自のコンパレータを作成する必要がありますstd::signbit


付録: 関連する標準引用:

反対の符号を持つ 2 つのオペランドの合計 (または同様の符号を持つ 2 つのオペランドの差) が正確にゼロの場合、その合計 (または差) の符号は、-INFINITY 方向への丸めを除くすべての丸めモードで + になります。符号は – とする。

IEEE 754-1985、6.3 (符号ビット)

于 2016-02-07T23:03:28.380 に答える