IEEE 754における正のゼロと負のゼロ
IEEE 754に+0と-0の両方が存在する理由を理解します。ビットパターン、計算でいつ発生するか、JavaScriptなどの言語でどう検出するかを学びましょう。
Special Values
Decimal Value
0
Float32 Hex
0x00000000
Float64 Hex
0x0000000000000000
詳細な説明
IEEE 754はゼロの2つの異なる表現を定義しています:正のゼロ(+0)と負のゼロ(-0)。標準的な比較では等しいと評価されますが、格納方法が異なり、特定の演算で異なる結果を生成することがあります。
ビットパターン:
| 値 | Float32 | Float64 |
|---|---|---|
| +0 | 0x00000000(全32ビットがゼロ) |
0x0000000000000000 |
| -0 | 0x80000000(符号ビット=1、残りゼロ) |
0x8000000000000000 |
唯一の違いは符号ビットです。両方とも指数フィールドと仮数フィールドがすべてゼロです。
-0はいつ発生するか?
負のゼロは以下の場合に生成されます:
- 正の数に-0を掛ける:
5 * (-0) = -0 - 負の数を正の無限大で割る:
-1 / Infinity = -0 - ゼロを否定する:
-(0) = -0 - 非常に小さな負の数をゼロに向けて丸める
等価性と比較:
ほとんどの言語で、+0 === -0はtrueと評価されます。JavaScriptでは以下の方法で区別できます:
Object.is(+0, -0)はfalseを返す1/+0 === Infinityだが1/-0 === -InfinityMath.sign(-0)は0を返す(-1ではない)、これは驚くかもしれません
なぜ2つのゼロが存在するか:
符号-絶対値表現は自然に2つのゼロを生成します。それらを1つに統合する特別なハードウェアロジックを追加する代わりに、IEEE 754委員会は両方を保持することにしました。なぜなら、計算がゼロにどの方向から近づいたかについて有用な情報を運ぶからです。これは複素解析や、ゼロの符号が分岐点に影響する特定の数値アルゴリズムで重要です。
実用的な意味:
ほとんどのアプリケーションコードでは、+0と-0を同一として安全に扱えます。ただし、数学ライブラリ、シリアル化ルーチン、またはデバッグツールを実装する場合は、符号付きゼロを認識することで微妙なバグを防げます。
ユースケース
符号付きゼロの理解は、分岐点を持つ数学関数の実装(atan2など)、ビット正確な往復変換が重要な浮動小数点データのシリアル化、または数値コードでの予期しない動作のデバッグにおいて重要です。