NaN
[Wikipedia|▼Menu]
.mw-parser-output .hatnote{margin:0.5em 0;padding:3px 2em;background-color:transparent;border-bottom:1px solid #a2a9b1;font-size:90%}

「nan」はこの項目へ転送されています。言語については「?南語」をご覧ください。

n/a」とは異なります。

NaN(Not a Number、非数、ナン)は、コンピュータにおいて、主に浮動小数点演算の結果として、不正なオペランドを与えられたために生じた結果を表す値またはシンボルである。NaNの体系的仕様は、無限大の表現などと共に1985年の IEEE 754 浮動小数点規格で標準が与えられている。

NaNには quiet NaN と signaling NaN の2種類がある。quiet NaN は不正な操作や不正な値で生じる誤りを伝播させるのに使用され、signaling NaN は数値計算と記号計算(英語版)の混合や基本的な浮動小数点演算への他の拡張といった高度な機能のサポートに使える。例えば結果が実数の範囲内でないゼロ除算において、ゼロ以外のゼロ除算は無限大だが、ゼロのゼロ除算は NaN である。負数の平方根虚数となるため、浮動小数点数としては表現できず、NaN で表現される。他に、正負の無限大の両方が絡んだために、どちらの無限大ともできないような計算の結果も NaN である。また、NaN は計算上必要な値が得られていない場合にも使われることがある[1][2]

類似用語としてNA(Not Available)や n/a があるが、異なる概念なので注意を要する。(後述NA参照)
浮動小数点数の NaN

浮動小数点演算においては、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 フラグを調べる必要がある[3](詳しくは後述の関数定義における NaN節を参照)。

IEEE 754-2008 の6.2節に、引数のうち大きい方あるいは小さい方を返す maxnum と minnum という関数があるが、これらは引数の一方が NaN の場合は常にもう一方の引数を返す。

同様のコンセプトは GNU OctaveMATLAB のNaNツールボックスに実装されている[4]。NaNツールボックスに含まれる統計関数群(平均、標準偏差などの関数)は、NaNを統計データがないことを示すものとみなし、単に NaN を無視して伝播させない。
NaN を返す演算

以下の処理で NaN が生成される可能性がある[5]

唯一の引数に NaN を指定された数学関数

不定形(英語版)

次のような除算: 0/0、±∞/±∞

次のような乗算: 0×±∞、±∞×0

次のような加算(および等価な減算): ∞ + (?∞)、(?∞) + ∞

標準には冪乗が2種類定義されている。

pow 関数と冪指数が整数である pown 関数は、00、1∞、∞0 を 1 と定義している。

powr 関数は上記3つの不定形を不正演算と定義しており、NaN を返す。



結果が虚数となるような演算(以下は一部)

負数の平方根

負数の対数

-1未満の値や+1より大きい値の逆三角関数

必要な値がないとき、明示的に変数に NaN を代入しておくことがある。IEEE 754 制定以前、未定義値を表すのに特別な値(例えば ?99999999)を使うことが多かったが、そういった値が常に想定通りに扱われるとは限らなかった[1]

上記の全ケースで常に NaN が生成されるとは限らない。マスクされていない例外やトラップを発生できる場合、NaNを生成する代わりにトラップを発生させることもある[6]。引数が quiet NaN で signaling NaN ではない場合、例外の発生する条件が成立しておらず quiet NaN を結果として返す。明示的に代入する場合は signaling NaN であっても例外は発生しない。
quiet NaN

quiet NaN あるいは qNaN は演算過程で伝播していく以外に何も例外などを発生させない。ただし、NaNを出力できない処理の場合は別である。たとえば、フォーマットの変換やある種の比較操作である(NaNが入力されることを想定していない操作)。
signaling NaN

signaling NaN あるいは sNaN は特殊なNaNであり、多くの操作に入力として用いられたときに不正例外を発生する(通常、オペレーティングシステム例外処理が呼び出される)。その後、sNaN は qNaN に変化し、伝播していく。これは IEEE 754 で導入された。この機能の使い方はいくつかある。

未使用メモリに signaling NaN の値を入れておくと、初期化前にそのデータが使われたときに不正例外が発生するようにできる。

sNaN をもっと複雑なオブジェクトのプレースホルダーとして使うこともできる。

算術アンダーフローとなった数を表現する。

算術オーバーフローとなった数を表現する。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:16 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef