質問
gdb を使用して double の値を出力していましたが、驚いたことに -0 が出力されました。
C における -0 値の double の意味は何ですか?
ちなみに、0と等しいかどうかをチェックすると、trueが返されました。比較を行うために、次のことを行いました
gdbで
> print some_double
-0
> print some_double == 0
1
解決
負のゼロは数値計算に役立つ概念であり、有効な浮動小数点数ですC。
他のヒント
これは、printf
の既知の問題です。浮動小数点数を使用しているため、バイナリで表現できるものはありません。そして、ほとんどの場合、バイナリ表現は完全ではありません。そのため、0は0.00000000000000...0042
として、また-0.000000000000000000000123
として格納されます。 printfが2番目のものを印刷すると、奇数の-0が得られます。
0と比較する方法はよくわかりませんが、浮動小数点比較を行う際にイプシロンを追加することを忘れないでください。例:2つのfloatが等しいかどうかをテストするには、a == b
but fabs(a-b) < 1e-13
を記述しないでください。1e-13はイプシロンです(あなたに合った指数を選択してください)。
実際に本「Writing great code, Volume 1」を読むと、第 4 章で著者が非常に明確に答えています。それは、IEEE FP 標準で符号付き浮動小数点を表すために 1 の補数が使用されているためです。彼はこう言います。
仮数は 2 の補数ではなく 1 の補数形式を使用します。これは、仮数の 24 ビット値が単なる符号なし 2 進数であり、ビット位置 31 の符号ビットによってその値が正か負かを決定することを意味します。1の補数には珍しい性質があります ゼロには 2 つの表現がある (符号ビットがセットまたはクリアされる). 。一般に、これは浮動小数点ソフトウェアまたはハードウェア システムを設計する人にとってのみ重要です。
私のものを強調してください