NaN

NaN（Not a Number、非数、ナン）は、コンピュータにおいて、主に浮動小数点演算の結果として、不正なオペランドを与えられたために生じた結果を表す値またはシンボルである。NaNの体系的仕様は、無限大の表現などと共に1985年の IEEE 754 浮動小数点規格で標準が与えられている。
NaNには quiet NaN と signaling NaN の2種類がある。quiet NaN は不正な操作や不正な値で生じる誤りを伝播させるのに使用され、signaling NaN は数値計算と記号計算の混合や基本的な浮動小数点演算への他の拡張といった高度な機能のサポートに使える。例えば結果が実数の範囲内でないゼロ除算において、ゼロ以外のゼロ除算は無限大だが、ゼロのゼロ除算は NaN である。負数の平方根は虚数となるため、浮動小数点数としては表現できず、NaN で表現される。他に、正負の無限大の両方が絡んだために、どちらの無限大ともできないような計算の結果も NaN である。また、NaN は計算上必要な値が得られていない場合にも使われることがある。
類似用語として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 フラグを調べる必要がある（詳しくは後述の関数定義における NaN節を参照）。
標準の最新版である IEEE 754-2008 の6.2節に、引数のうち大きい方あるいは小さい方を返す maxnum と minnum という関数があるが、これらは引数の一方が NaN の場合は常にもう一方の引数を返す。
同様のコンセプトは GNU Octave と MATLAB のNaNツールボックスに実装されている。NaNツールボックスに含まれる統計関数群（平均、標準偏差などの関数）は、NaNを統計データがないことを示すものとみなし、単に NaN を無視して伝播させない。

quiet NaN

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

関数定義における NaN

数値関数が入力として NaN を受け取ったとき、どう処理すべきかについては様々な意見がある。1つの見方は、NaN はエラーを示すものとして常に出力に伝播させなければならないというものである。別の見方として、その関数に複数の引数があり、NaN でない引数だけで出力値が決定される場合、その値を返すべきだという考え方もある。IEEE 754 は主に後者の立場で策定されている。例えば、hypot(±∞, qNaN) と hypot(qNaN, ±∞) は +∞ を返す。
例えば冪乗関数 pow(x,y) = x ** y という関数を考えてみよう。0⁰、∞⁰、1∞ といった式は極限を考えると（∞ × 0 などと同様）不定形だが、0の0乗は1と定義すべきだという意見もある。
引数が未定義なら結果も未定義とする場合、pow(1,qNaN) は qNaN を出力すべきである。しかし、一般的な数学ライブラリでは pow(1,y) は任意の実数 y について常に 1 を返す。これは y が無限大であっても同様である。同様に pow(x,0) は x が 0 や無限大であっても 1 を返す。本来不定形であるはずなのに 1 を返す論理的根拠は、ロピタルの定理である。IEEE 754-2008 では、pow(1,qNaN) と pow(qNaN,0) はどちらも 1 を返すべきだとされている。
冪乗関数がより厳密な解釈に従うべきだという立場を考慮し、IEEE 754-2008 では他に2つの冪乗関数を定義している。pown(x, n) は冪指数として整数しか指定できない。powr(x, y) は引数のいずれかが NaN の場合や計算結果が不定形になる場合、常に NaN を返す。

整数の NaN

固定ビット幅の整数フォーマットは明確に不正データを示す方法がない。
Perl の BigInt パッケージは正常な整数でないものを表す文字列として "NaN" を使用する。
 >perl -mMath::BigInt -e "print Math::BigInt->new('foo')"  NaN

テキスト表現

各種プログラミング言語やライブラリの入出力における、リテラルなどにおけるNaNのテキスト表現はまちまちである。以下に例を挙げる。
 nan
 NaN
 NaN%
 NAN
 NaNQ
 NaNS
 qNaN
 sNaN
 1.#SNAN
 1.#QNAN
 +nan.0
 -nan.0
 -1.#IND
符号と診断用の情報（ペイロード）を含む場合の例。
 -NaN
  NaN12345
 -sNaN12300
 -NaN(s1234)
これら以外の場合もある。

NA

紛らわしい言葉として、NA(Not Availableの略、N/Aとも表記される)がある。「数表のコラムにデータが存在しない場合」に使われ『欠損値』（missing value）と訳される。
殊に統計計算の分野、R言語など統計解析ソフトウェアで用いられる。R言語では、NaN==NaNの結果が偽なのに対し、NA==NAの結果はNAである。