Open Group Base Specification Issue 7、IEEE Std 1003.1-2008から:
signbit()マクロは、引数値の符号が負の場合にのみ、ゼロ以外の値を返します。
なぜsignbit(-0)
戻るの0
ですか?この決定の背後にある論理を理解したいだけです。
Open Group Base Specification Issue 7、IEEE Std 1003.1-2008から:
signbit()マクロは、引数値の符号が負の場合にのみ、ゼロ以外の値を返します。
なぜsignbit(-0)
戻るの0
ですか?この決定の背後にある論理を理解したいだけです。
最近の符号付き整数の最も一般的な表現である2の補数では、負のゼロなどはありません。 -0 == +0
すべての場合で、ビット単位でも。したがって、マクロのコードがそれを処理するときまでに、たとえそれが含まれていても((float) -0)
、記号はすでに消えています。
テストしたい場合は、signbit(-0.0)
またはのようなもので運が良いかもしれませんsignbit(-1.0 * 0)
。その時点では整数から変換していないので、数値にはまだ符号が付いているはずです。
でsignbit(-0)
:
0
タイプの定数ですint
。-0
は否定の結果である0
ため、タイプはゼロですint
。signbit(-0)
、0を生成します。signbit(-0.)
代わりに行う場合:
0.
タイプの定数ですdouble
。-0.
は否定の結果である0.
ため、タイプの負のゼロですdouble
。signbit(-0.)
、1を生成します。重要なのは-0
整数型を否定することであり、整数型は通常、正のゼロとは異なり、負のゼロをエンコードしません。整数のゼロが浮動小数点に変換されると、結果は単純な(正の)ゼロになります。ただし、-0.
浮動小数点型を否定し、浮動小数点型は正のゼロとは明確に負のゼロをエンコードします。
そうではありません。マクロは、浮動小数点データのsignbit
リテラル符号ビットを返します。「引数の符号が負の場合」ではなく、「引数の符号が負の場合」というテキストに注意してください。
C規格の脚注236は、次のことを明確にしています。
signbitマクロは、無限大、ゼロ、NaNを含むすべての値の符号を報告します。
これは架空の質問ですか、それともバグのある実装がありますか?