NaN
読み:エンエイエン
外語:NaN: Not a Number
非数値、非数。演算結果が数値で表わせないときに使われる特殊な値のこと。
目次
概要
特徴
IEEE 754
内部表現方法
NaNに対する演算
プログラミング言語
概要
浮動小数点演算は、整数演算と異なり様々な演算条件があり、その演算結果が数値で表わせない状況が生じうる。このような場合、NaNが返される。
プログラミング言語でも、それが整数演算の場合であっても言語仕様によりNaNを定義し、NaNを返す場面が存在する。
NaNが返る例として、0×∞や、0÷0、∞÷∞のようなものがある。
特徴
IEEE 754
内部表現方法
IEEE 754
では、次のように数値を表わす。
(-1)
s
× m × b
e
それぞれに数ビットずつ割り当てて、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 を返す。
再検索