6

Open Group Base Specification Issue 7、IEEE Std 1003.1-2008から:

signbit()マクロは、引数値の符号が負の場合にのみ、ゼロ以外の値を返します。

なぜsignbit(-0)戻るの0ですか?この決定の背後にある論理を理解したいだけです。

4

3 に答える 3

11

最近の符号付き整数の最も一般的な表現である2の補数では、負のゼロなどはありません。 -0 == +0すべての場合で、ビット単位でも。したがって、マクロのコードがそれを処理するときまでに、たとえそれが含まれていても((float) -0)、記号はすでに消えています。

テストしたい場合は、signbit(-0.0)またはのようなもので運が良いかもしれませんsignbit(-1.0 * 0)。その時点では整数から変換していないので、数値にはまだ符号が付いているはずです。

于 2013-03-11T18:41:38.223 に答える
11

signbit(-0)

  • 0タイプの定数ですint
  • -0は否定の結果である0ため、タイプはゼロですint
  • この値は浮動小数点に変換されます。
  • 浮動小数点値の符号ビットはゼロであるためsignbit(-0)、0を生成します。

signbit(-0.)代わりに行う場合:

  • 0.タイプの定数ですdouble
  • -0.は否定の結果である0.ため、タイプの負のゼロですdouble
  • 浮動小数点値の符号ビットは1であるためsignbit(-0.)、1を生成します。

重要なのは-0整数型を否定することであり、整数型は通常、正のゼロとは異なり、負のゼロをエンコードしません。整数のゼロが浮動小数点に変換されると、結果は単純な(正の)ゼロになります。ただし、-0.浮動小数点型を否定し、浮動小数点型は正のゼロとは明確に負のゼロをエンコードします。

于 2013-03-11T19:01:37.060 に答える
2

そうではありません。マクロは、浮動小数点データのsignbitリテラル符号ビットを返します。「引数の符号が負の場合」ではなく、「引数の符号が負の場合」というテキストに注意してください。

C規格の脚注236は、次のことを明確にしています。

signbitマクロは、無限大、ゼロ、NaNを含むすべての値の符号を報告します。

これは架空の質問ですか、それともバグのある実装がありますか?

于 2013-03-11T18:50:54.080 に答える