NaN
読み:エンエイエン
外語:NaN: Not a Number

 非数値、非数。演算結果が数値で表わせないときに使われる特殊な値のこと。
目次

概要
 浮動小数点演算は、整数演算と異なり様々な演算条件があり、その演算結果が数値で表わせない状況が生じうる。このような場合、NaNが返される。
 プログラミング言語でも、それが整数演算の場合であっても言語仕様によりNaNを定義し、NaNを返す場面が存在する。
 NaNが返る例として、0×∞や、0÷0、∞÷∞のようなものがある。

特徴

IEEE 754

内部表現方法
 IEEE 754では、次のように数値を表わす。
 (-1)s × m × be
 それぞれに数ビットずつ割り当てて、32ビット長あるいは64ビット長などの一定の長さにして内部で演算をしている。
 この時、eが全ビットが1で、mの最上位ビットを除いた値が1以上の時、NaNであると定義されている。この場合でもsが有効なため、NaNには+NaNと−NaNが存在する。
 更に、NaNにはQuiet NaN(qNaN)とSignaling NaN(sNaN)があり、mの最上位ビットが0ならSignaling ±NaN、1ならQuiet ±NaN、である。いずれの場合も、mの余剰ビットを用いて情報の伝達をすることが可能となっている。

NaNに対する演算
 NaNに対する演算は、基本的には無効である。
 数値演算を行なったときはNaNが得られる。比較演算も、それがNaN同士であってもfalse(偽、不一致)が得られる。なぜならNaNは特定の値を表わすものではないため、NaN同士の比較自体意味を持たないためである。
 従って、単純な比較演算で値がNaNかどうかを判断することはできず、ビット列の解読が必要である。そこで、プログラミング言語によってはisNaN()などの判断用関数が用意されていることがある。
 但し例外はあり、NaNに対する冪乗、つまりpow(x, y) = x ** y の演算である。幾つかの数学では、任意の実数の0乗を1と定義し、かつまた1の任意の実数乗も1と定義している。その数が極限であったとしても、ロピタルの定理によってこれが成り立つ。
 そこでIEEE 754-2008では、pow(1, qNaN) および pow(qNaN, 0) は、いずれも 1 を返すことを推奨している。

プログラミング言語
 浮動小数点演算自体がNaNに対応するため、それを扱えるプログラミング言語は必然的にNaNという値を処理する必要性が生じるが、プログラミング言語として対応するかどうかは別の問題である。
 Swiftの Double.nan や、JavaScriptの NaN または Number.NaN のよう言語仕様として定義するものと、そうでないものに別れる。C/C++はそうでないものに分類されるが、そうでない言語でもisNaN()などの関数やメソッド等は用意することが多い。
 整数演算におけるNaNの扱いもプログラミング言語ごとに様々である。
 また、NaNに対する演算結果も様々だが、JavaScript(ECMAScript 2016以降)では NaN ** 0 は 1 を返す一方、1 ** NaN は NaN を返す。

再検索