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つの部分で構成されるビット列として表現される。

  1. 符号部(Sign): 1ビット。0が正、1が負を表す。

  2. 指数部(Exponent): float型は8ビット、double型は11ビット。数値の大きさを表す。

  3. 仮数部(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/0sqrt(-1)のような数学的に定義できない演算結果として生成される。

  • NaNはどの値とも等しくないという性質を持つため、NaN == NaNという比較は常にfalseになる。これは、NaNNaN自体を意味しないためだ。

ビット列のまとめ

符号部指数部仮数部
00または1すべて0すべて0
±Infinity0または1すべて1すべて0
NaN0または1すべて10以外