NaNやInfなどの特殊な値
NaN(Not-A-Number;非数)やInf(無限大)などの特殊な値には以下の4種類がある.
| クラス(種類) |
符号部 |
指数部 |
仮数部 |
個数 |
| 非数 |
NaN |
* |
11..1 |
≠00..0 |
たくさん存在する |
| 無限大 |
Inf |
* |
11..1 |
00..0 |
+Infと-Infの2種類が存在する |
| 非正規化数 |
Denormal |
* |
00..0 |
≠00..0 |
たくさん存在する |
| ゼロ |
Zero |
* |
00..0 |
00..0 |
+0と-0の2種類が存在する |
-
表からわかるように,指数部がオール0またはオール1のときは何らかの特殊な値になっている.
-
無限大(Inf)とゼロ(Zero)はそれぞれ+/-の2値だけだが,
非数(NaN)と非正規化数(Denormal)は仮数部がオール0以外なら何でもよいので,単精度(23ビット)で223-1≒800万とおり,
倍精度で252-1…もうわからないくらい たくさんのバリエーションが存在する.
-
インテルのマニュアルにはdenormalと同じ意味で“unnormal”という語も出てくるのだけど,他のベンダーはこの語は用いてないような気がする.
unnormalという表現は,正規化できない数の意味なのか・正規化する前の一時的な未正規化状態を指しているのかの区別がつきにくいから嫌われてるのかも.
-
指数部の両端の2つの値(00..0と11..1)はこれら特殊な値を表現するために予約されている.
したがって,例えば単精度の場合,指数部は8ビットあり,0〜255の256とおりの値が設定できるが,
0と255は使えないので,通常の数の範囲では1〜254---バイアスを考慮して-126(=1)〜127(=254)となる.
以下,それぞれの特殊な値について詳細を説明する.
[…と いいたいところだけど,まだ書けてないです.]
NaN
指数部がオール1で仮数部が0でない.
符合は+/-どちらでもよい.
NaNには,Signaling NaN(SNaN)とQuiet NaN(QNaN)の2種類がある.
Inf
指数部がオール1で仮数部が0.
符合が+のときは+Inf,-のときは-Inf.
非正規仮数(denormalized numbers)
指数部がオール0で仮数部が0でない.数値は精度が落ちるけども有効と考えられ,次の値となる.
| 単精度 | (-1)s×0.f×2-126 |
| 倍精度 | (-1)s×0.f×2-1022 |
ゼロ(zeros)
指数部がオール0で,仮数部も0.
符合はどちらでもよく,+のときは+0,-のときは-0となる.
はたいたかし
2004-01-19 初稿
2006-10-30 改訂3