4

行列クラスで単項演算子をオーバーロードするために、次のコードを書きました。

const RegMatrix RegMatrix::operator-()const{
    RegMatrix result(numRow,numCol);
    int i,j;
    for(i=0;i<numRow;++i)
        for(j=0;j<numCol;++j){
            result.setElement(i,j,(-_matrix[i][j]));
        }

        return result;
}

Visual Studio でデバッガーを使用してプログラムを実行したところ、double が 0 に等しい操作が行われると、結果マトリックスに数値 -0.00000 が挿入されることがわかりました。それは奇妙な VS 表示機能ですか、それとも慎重に処理する必要があるものですか?

4

5 に答える 5

4

符号付きゼロは、関連する符号を持つゼロです。通常の算術演算では、−0 = +0 = 0 です。ただし、計算では、2 つのゼロの存在を許容する数値表現があり、多くの場合、−0 (負のゼロ) と +0 (正のゼロ) で示されます。これは、一部の整数の符号付き数値表現と、ほとんどの浮動小数点数表現で発生します。数値 0 は通常 +0 としてエンコードされますが、+0 または -0 で表すことができます。

浮動小数点演算の IEEE 754 標準 (現在、浮動小数点数をサポートするほとんどのコンピューターとプログラミング言語で使用されています) では、+0 と -0 の両方が必要です。ゼロは、1/−0 = −∞ および 1/+0 = +∞ のような拡張実数直線の変形と見なすことができ、ゼロによる除算は ±0/±0 に対してのみ未定義です。

負の符号のゼロは、x → 0−、x → 0−、または x → ↑0 で示される片側限界として下から 0 に近づくという数学的分析の概念を反映しています。「-0」という表記は、ゼロに丸められた小さな負の数を示すために非公式に使用される場合があります。負のゼロの概念には、統計力学やその他の分野での理論的な応用もあります。

IEEE 754 に符号付きゼロを含めることで、特に複雑な初等関数を計算する場合に、いくつかの重要な問題で数値精度を達成することがはるかに容易になると主張されています [2] 一方、符号付きゼロの概念は、ほとんどの数学分野 (およびほとんどの数学コース) で負のゼロはゼロと同じであるという一般的な仮定に反しています。負のゼロを許可する表現は、プログラムのエラーの原因となる可能性があります。ソフトウェア開発者は、数値比較では 2 つのゼロ表現が同等に動作する一方で、異なるビット パターンであり、一部のアプリケーションでは異なる結果をもたらすことに気付いていない (または忘れている可能性がある) ためです。オペレーション。

詳細については、Signed Zero wiki ページを参照してください。

于 2010-10-07T13:14:21.427 に答える
2

double ( IEEE754 ) を使用すると、正と負のゼロが定義されます。

于 2010-10-07T13:13:21.147 に答える
0

ereOnが言ったように、あなたは負のゼロを持っています:

#include <stdio.h>
int main()
{
    printf("%f\n", -0.0);
}
于 2010-10-07T13:14:42.660 に答える
0

double の場合、実際には「0.0」と「-0.0」の値が異なりますが、それは完全に理にかなっていると思います....

どのような異なる結果を期待していましたか?

于 2010-10-07T13:14:12.233 に答える
-1

-0と0は同じものであり、心配する必要はありません。浮動小数点数には、数学上の理由から、正と負の両方の0を持つ機能があります。ただし、-0はC /C++演算の0と同じように解釈されます。

于 2010-10-07T13:14:48.563 に答える