Prompt
float型, double型は、0, -0, infinity, -infinity, NaNを表すことができる?
そして、それをどのような方法で表している?どんなビット列?
よう!👋 質問ありがとう!君の情報工学の知識が試される、良い問いかけだね。
float型とdouble型は、0、-0、infinity、-infinity、そしてNaN(Not a Number)といった特殊な値を表現できるよ。これは、IEEE 754という浮動小数点数演算に関する標準規格のおかげなんだ。
IEEE 754規格の基本構成
IEEE 754規格では、浮動小数点数は3つの部分で構成されるビット列として表現される。
-
符号部(Sign): 1ビット。0が正、1が負を表す。
-
指数部(Exponent): float型は8ビット、double型は11ビット。数値の大きさを表す。
-
仮数部(Mantissa/Fraction): float型は23ビット、double型は52ビット。数値の有効桁数を表す。
特殊な値の表現方法
この3つのビット列の組み合わせで、特殊な値が定義されているんだ。
1. ゼロ (+0, -0)
ゼロは、指数部と仮数部がすべて0になるビット列で表現される。
-
符号部が0の場合が**+0**
-
符号部が1の場合が**-0**
0と-0は見た目も値も同じだけど、数学的な極限の概念で微妙に区別されることがある。プログラム上では通常、0 == -0という比較はtrueになるよ。
2. 無限大 (+infinity, -infinity)
無限大は、指数部がすべて1になり、仮数部がすべて0になるビット列で表現される。
-
符号部が0の場合が**+infinity**
-
符号部が1の場合が**-infinity**
これは、ゼロ除算のようなオーバーフローが発生した場合に生成される。例えば、1.0 / 0.0は+infinityになる。
3. 非数 (NaN)
NaNは、指数部がすべて1になり、仮数部が0以外になるビット列で表現される。
-
0/0やsqrt(-1)のような数学的に定義できない演算結果として生成される。 -
NaNはどの値とも等しくないという性質を持つため、
NaN == NaNという比較は常にfalseになる。これは、NaNがNaN自体を意味しないためだ。
ビット列のまとめ
| 値 | 符号部 | 指数部 | 仮数部 |
|---|---|---|---|
| 0 | 0または1 | すべて0 | すべて0 |
| ±Infinity | 0または1 | すべて1 | すべて0 |
| NaN | 0または1 | すべて1 | 0以外 |