符号付きゼロとは、符号が付随するゼロのことです。通常の算術では、数値 0 には符号がなく、−0、+0、0 は同じ数値を表す 3 つの方法です。しかし、計算においては、数値表現によっては、2 つのゼロが存在することが許容されます。これらはしばしば−0 (負のゼロ) と+0 (正のゼロ) で表され、数値比較演算では等しいとみなされますが、特定の演算では異なる動作をする可能性があります。これは、整数の符号付き数値表現と1 の補数表現、およびほとんどの浮動小数点数値表現で発生します。数値 0 は通常 +0 と表現されます。
浮動小数点演算のIEEE 754規格(現在、浮動小数点数をサポートするほとんどのコンピュータとプログラミング言語で使用されている)では、+0と-0の両方が必要です。その演算は、拡張された実数直線( +∞と-∞という追加の数を含む実数)の変形をモデル化したものと考えることができます。IEEE 754演算では、1 / -0 = -∞ 、1 / +0 = +∞となります。 ± 0 / ± 0と± ∞ / ± ∞の除算は「非数」(NaN)を返します。
負の符号付きゼロは、数学解析における、ゼロに下から近づくという片側極限の概念を反映しており、 x → 0 −、x → 0− 、またはx → ↑0と表記されることがあります 。「−0」という表記は、ゼロに丸められた負の数を表すために非公式に使用されることがあります。負のゼロの概念は、統計力学やその他の分野においても理論的な応用があります。
IEEE 754 に符号付きゼロを含めることで、特に複素初等関数の計算において 、いくつかの重要な問題で数値精度を達成するのがはるかに容易になると主張されています。 [ 1 ] [ 2 ]一方、符号付きゼロの概念は、負のゼロがゼロと同じ値であるという数学における通常の仮定に反します。負のゼロを許容する表現は、ソフトウェア開発者が、2 つのゼロ表現が数値比較では等しいように動作する一方で、一部の演算では異なる結果をもたらすことを考慮しない場合、プログラムのエラーの原因となる可能性があります。
バイナリ整数形式には、さまざまなエンコーディングを使用できます。広く使用されている2の補数エンコーディングでは、ゼロは符号なしです。整数の1+7ビット符号と絶対値表現では、負のゼロはビット列で表されます1000 0000。8ビット1の補数表現では、負のゼロはビット列で表されます1111 1111。これら3つのエンコーディングすべてにおいて、正または符号なしのゼロはで表されます0000 0000。ただし、後者の2つのエンコーディング(符号付きゼロを含む)は、整数形式では一般的ではありません。符号付きゼロを含む最も一般的な形式は、以下で説明する浮動小数点形式(IEEE 754形式または類似)です。

IEEE 754 バイナリ浮動小数点形式では、ゼロ値はバイアス付き指数と仮数の両方がゼロであることで表されます。負のゼロは、符号ビットが 1 に設定されます。負のゼロは、特定の計算の結果として得られる場合があります。たとえば、負の数に対する算術アンダーフローの結果(他の結果も考えられます)、または−1.0 × 0.0、または単に として得られます−0.0。
IEEE 754 10 進浮動小数点形式では、負のゼロは、指数がその形式の範囲内の有効な指数であり、仮数部がゼロで、符号ビットが 1 であることによって表現されます。
IEEE 754浮動小数点規格は、様々な演算における正ゼロと負ゼロの挙動を規定しています。結果は、現在のIEEE丸めモードの設定によって異なる場合があります。
符号付きゼロと符号なしゼロの両方を含むシステムでは、表記法そして符号付きゼロを表すのに使われることがある。
加算と乗算は交換法則が成り立つが、従わなければならない特別な規則がいくつかあり、そのため、通常の代数的簡略化のための数学的規則が適用されない場合がある。下の記号は、得られた浮動小数点数の結果を示しています(通常の等号演算子ではありません)。
乗算や除算を行う際には、符号に関する通常の規則が常に適用されます。
符号付きゼロの加算または減算には特別な規則があります。
負のゼロが存在するため(また、丸めモードが上方または下方の場合も)、浮動小数点変数xとyの式−( x − y )と(− x ) − (− y )は、 y − xに置き換えることはできません。ただし、(−0) + x は、最も近い値に丸められたxに置き換えることができます(x がシグナリング NaNになる場合を除く)。
その他の特別なルール:
ゼロ以外の数をゼロで割ると、ゼロ除算フラグが設定され、NaN を生成する演算では、無効演算フラグが設定されます。対応するフラグが有効になっている場合は、例外ハンドラが呼び出されます。
IEEE 754規格によれば、負のゼロと正のゼロは、 C言語やJava などの通常の(数値)比較演算子では等しいものとして比較されるべきである。これらの言語では、2つの値を区別するために特別なプログラミング手法が必要になる場合がある。==
copysign()関数(IEEE 754copySign演算)を使用して、ゼロの符号をゼロ以外の数値にコピーする。signbit()マクロ(IEEE 754演算)を使用します。isSignMinus注:ほとんどのシステムでは2の補数表現の符号付き整数を使用しており、ゼロの表現は1種類しかないため、整数型への変換は通常うまくいきません。また、表現に2つのゼロが含まれる場合でも、ISO Cなどの言語ではそれらを区別する手段が提供されていない可能性があります。
しかし、一部のプログラミング言語では、2 つのゼロを区別する代替の比較演算子が提供される場合があります。たとえば、equals()Java のjava.lang.Doubleラッパー クラスのメソッドがその例です。[ 4 ]
非公式には、負の値をゼロに丸めた値を表すのに「−0」という表記を用いることがあります。この表記は、負の符号が重要な意味を持つ場合に役立ちます。例えば、摂氏温度を表にまとめる場合、負の符号は氷点下を意味します。
統計力学では、個体群反転のある系を記述するために負の温度が用いられることがある。個体群分布関数のエネルギー係数は −1 / 温度であるため、正の無限大よりも大きい温度を持つと考えられる。この文脈では、 − 0の温度は、他のどの負の温度よりも大きい(理論上の)温度であり、+0 とは反対の極値である、考えられる最大の個体群反転の範囲に対応する。[ 5 ]
SIGN