私はgdbを使用してdoubleの値を出力していましたが、驚いたことに-0が出力されました
Cでの-0値の2倍は何を意味しますか?
ちなみに、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 つの浮動小数点数が等しいかどうかをテストするには、決して書きませんa == b
がfabs(a-b) < 1e-13
、1e-13 はイプシロンです (適切な指数を選択してください)。
実際に本「Writing great code, Volume 1」を第 4 章で読んでいると、著者は答えを非常に明確に示しています。これは、IEEE FP 標準で符号付き浮動小数点数を表すために 1 の補数を使用しているためです。彼は言います:
仮数は、2 の補数ではなく 1 の補数形式を使用します。これは、仮数の 24 ビット値が単に符号なし 2 進数であり、ビット位置 31 の符号ビットがその値が正か負かを決定することを意味します。1 の補数には、ゼロに対して 2 つの表現 (符号ビットを設定またはクリア) があるという特殊な特性があります。一般に、これは浮動小数点ソフトウェアまたはハードウェア システムを設計する人にとってのみ重要です。
強調鉱山