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 を返す。

関連する用語
浮動小数点
IEEE 754

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club