ゼロ値のunary operator-()-C ++
-
28-09-2019 - |
質問
私はこのコードを作成して、Matrixクラスで単位オペレーターを過負荷にしました。
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でデバッガーを使用してプログラムを実行したとき、操作がダブルで実行されるとゼロに等しくなると、結果マトリックスが番号-0.00000を挿入することがわかりました。それはいくつかの奇妙なvs-display機能ですか、それとも慎重に処理する必要があるものですか?
解決
署名ゼロはゼロで、関連するサインがあります。通常の算術では、-0 = +0 = 0です。ただし、コンピューティングでは、いくつかの数の表現が2つのゼロの存在を可能にします。これは、整数の一部の署名された数値表現、およびほとんどの浮動小数点数表現で発生します。数値0は通常+0としてエンコードされますが、+0または-0で表すことができます。
浮動小数点算術のIEEE 754標準(現在のほとんどのコンピューターとフローティングポイント番号をサポートするプログラミング言語で使用されている)には、+0と-0の両方が必要です。ゼロは、1/-0 =-∞および1/ +0 = +∞である拡張実数線のバリアントと見なすことができます。
ゼロゼロのゼロは、x→0-、x→0-、またはx→↑0で示される片側制限として、下から0に近づくという数学的分析の概念を反映します。表記「-0」は、ゼロに丸められた小さな負の数を示すために非公式に使用できます。負のゼロの概念には、統計力学やその他の分野にいくつかの理論的応用があります。
IEEE 754に署名されたゼロを含めると、いくつかの重要な問題で数値精度を達成することがはるかに簡単になると主張されています。1 特に、複雑な基本機能を使用して計算する場合。[2]一方、署名されたゼロの概念は、ネガティブゼロがゼロと同じであるというほとんどの数学的分野(およびほとんどの数学コース)で行われた一般的な仮定に反して実行されます。負のゼロを許可する表現は、ソフトウェア開発者が2つのゼロ表現が数値比較下で等しいように動作する一方で、それらは異なるビットパターンであり、一部の結果で異なる結果を生み出すことを認識していない(または忘れる)ため、プログラムのエラーの原因となる可能性があります。オペレーション。
詳細については、参照してください ゼロに署名 wikiページ。
他のヒント
ダブルの使用(IEEE754)、正と負のゼロが定義されています。
ダブルスの場合、実際には「0.0」と「-0.0」の値が異なります。
どのような結果を期待しましたか?
エレオンが言ったように、あなたは負のゼロを持っています:
#include <stdio.h>
int main()
{
printf("%f\n", -0.0);
}
-0と0は同じものであり、心配する必要はありません。浮動小数点数には、数学の理由により、正と負の両方の0を持つ機能があります。しかし、-0はC/C ++算術の0と同じ方法で解釈されます。