浮動小数点数の NaN
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/06 03:43 UTC 版)
浮動小数点演算においては、NaNと無限大は別の概念であるが、どちらも浮動小数点数としての表現も特殊であり、それを使った演算も特殊である(文献によっては、それら両方を含む広義の「非数」という表現が見られることもあるが、混同のおそれが無い場合以外は避けたほうがよい)。不正な演算という概念と、算術オーバーフロー(無限大を結果とする場合もある)や算術アンダーフロー(非正規化数か、ゼロとなる)は異なる。 IEEE 754では、NaNの表現について、指数部は全て1とし(これは無限大と同じ)、無限大の場合は仮数部の全てを0とするのに対し、NaNは全0以外の任意のビット列としている。他に、先頭の符号ビットで正負の区別がある。また、NaNの種別としてquiet NaN (qNaN) とsignaling NaN(sNaN)があり、例外を投げる場合について違いがある。 仮数部のビット列について任意としているため複数の表現があり得るが、それらが必ずしも区別して扱われるとは限らない。qNaNとsNaNの表現について規格の以前の版では具体的に決まっていなかったなど煩雑なため、詳細は#エンコードの節を参照。 IEEE 754 の単精度(32ビット)での NaN をビット列として表現すると s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx となり、ここで s は正負の符号(多くのアプリケーションでは無視する)、x は特殊ペイロード(多くのアプリケーションでは無視する)である。 大小比較以外の浮動小数点数操作は一般に quiet NaN をそのまま伝播する。signaling NaN に対する浮動小数点数操作は不正例外を発生し、デフォルトの例外処理ではqNaNをオペランドとしたときと同様に演算結果としてqNaNを生成するだけである。 NaNとの大小比較では、自分自身と比較した場合でも「大小不明な結果」を返す。比較には signaling と non-signaling があり、signaling 版では NaN との比較を行うと不正例外を発生する。等号および不等号で比較する場合は常に non-signaling であり、x が quiet NaN なら x = x は偽 (false) を返す。他の一般的な大小比較は全て signaling であり、オペランドとして NaN を渡されると不正例外を発生するが、規格ではそれらの non-signaling 版も提供することになっている。isNaN(x) は渡された値がNaNかどうかを判定する関数であり、x が signaling NaN であっても例外を発生しない。 quiet NaN が演算を通して伝播していくため、計算途中で何度もチェックを入れる必要はなく、最終的に得られた値を調べればよい。ただし、言語や関数によっては NaN を渡されてもそれが計算結果に影響しない場合に黙って普通の浮動小数点数値を返すことがある。例えばどんな数でも0乗すれば1になるので、NaN^0 は 1 と定義することもできる。そのため一般に最終的な値を得るまでの過程で NaN が入り込んでいたかを示す INVALID フラグを調べる必要がある(詳しくは後述の関数定義における NaN節を参照)。 IEEE 754-2008 の6.2節に、引数のうち大きい方あるいは小さい方を返す maxnum と minnum という関数があるが、これらは引数の一方が NaN の場合は常にもう一方の引数を返す。 同様のコンセプトは GNU Octave と MATLAB のNaNツールボックスに実装されている。NaNツールボックスに含まれる統計関数群(平均、標準偏差などの関数)は、NaNを統計データがないことを示すものとみなし、単に NaN を無視して伝播させない。
※この「浮動小数点数の NaN」の解説は、「NaN」の解説の一部です。
「浮動小数点数の NaN」を含む「NaN」の記事については、「NaN」の概要を参照ください。
- 浮動小数点数の NaNのページへのリンク