7

私はgdbを使用してdoubleの値を出力していましたが、驚いたことに-0が出力されました

Cでの-0値の2倍は何を意味しますか?

ちなみに、0と等しいことを確認したところ、trueが返されました。比較を行うために、次のことを行いました

gdbで

> print some_double
-0
> print some_double == 0
1
4

3 に答える 3

16

負のゼロは、数値計算に役立つ概念であり、C では有効な浮動小数点数です。

于 2009-03-06T00:34:58.953 に答える
3

これは、 のよく知られた問題printfです。浮動小数点数を使用しているため、バイナリで可能な表現はありません。また、ほとんどの場合、バイナリ表現は完全ではありません。したがって、0 は0.00000000000000...0042時々ととして保存され-0.000000000000000000000123ます。printf が 2 番目のものを出力すると、奇数の -0 が得られます。

0 と比較する方法がよくわかりません。浮動小数点の比較を行うときにイプシロンを追加して、奇妙さを調整することを忘れないでください。例: 2 つの浮動小数点数が等しいかどうかをテストするには、決して書きませんa == bfabs(a-b) < 1e-13、1e-13 はイプシロンです (適切な指数を選択してください)。

于 2009-03-06T00:35:26.673 に答える
2

実際に本「Writing great code, Volume 1」を第 4 章で読んでいると、著者は答えを非常に明確に示しています。これは、IEEE FP 標準で符号付き浮動小数点数を表すために 1 の補数を使用しているためです。彼は言い​​ます:

仮数は、2 の補数ではなく 1 の補数形式を使用します。これは、仮数の 24 ビット値が単に符号なし 2 進数であり、ビット位置 31 の符号ビットがその値が正か負かを決定することを意味します。1 の補数には、ゼロに対して 2 つの表現 (符号ビットを設定またはクリア) があるという特殊な特性があります。一般に、これは浮動小数点ソフトウェアまたはハードウェア システムを設計する人にとってのみ重要です。

強調鉱山

于 2010-01-14T00:58:01.987 に答える