ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
非数値、非数。演算結果が数値で表わせないときに使われる特殊な値のこと。
浮動小数点演算は、整数演算と異なり様々な演算条件があり、その演算結果が数値で表わせない状況が生じうる。このような場合、NaNが返される。
プログラミング言語でも、それが整数演算の場合であっても言語仕様によりNaNを定義し、NaNを返す場面が存在する。
NaNが返る例として、0×∞や、0÷0、∞÷∞のようなものがある。
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同士であっても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 を返す。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます