NaN
Not a Number の略
「数ではない」ことを示す数値型の値。
null とは意味が違う。
NaN の場合に本当の所どう判断すべきかは、期待する要件による。
NaN の取り扱いは環境に依存するため、確認が必要。
実装によってかなり違う。
NaNてことだ SIMD化したら結果が変わるなんて https://qiita.com/aka-nse/items/b42f12c229ab58c3f3a7
aarch64 linux で C/C++ 浮動小数点例外周りのメモ https://qiita.com/syoyo/items/8179411cab317290aad2
PostgreSQLの不思議なNaNの扱い ~ PostgreSQL is Chuck Norris — Qiita https://medium.com/@tetor/postgresqlの不思議なnanの扱い-postgresql-is-chuck-norris-qiita-1eb38bfa4eaa
一般的な実装
NaN と同値比較をするとすべての値で false となる。(NaN との比較でも false)
NaNとNaNは等しくない。(その値が本当は何なのかが分からないから。)
このため NaN != NaN が true になるがこれは正しい。
NaN を含む計算の計算結果は NaN となる。(伝播する)
例外を発生させないのが qNaN (quiet NaN)
例外を発生させるのが sNaN (signaling NaN)
sNaN を含む演算をしようとすると例外になる。
POSIX では SIGFPE シグナルが発生する。(浮動小数点例外)
0除算の結果を NaN にするかどうか、sNaNとqNaNのどちらにするかはほぼ実装依存
JavaScript
typeof NaN === "number"
NaN同士の比較は「異なるもの」と判定される。
code:NaN_equal.js
var o = NaN;
console.log(o === o); // false
console.log(o !== o); // true
この特殊な性質があるため、オブジェクトの単純な同値性判定が失敗することに注意。
NaN のための特例処理が必要になる。
C
code:NaN.c
void main(void) {
double nan = 0.0/0.0;
}
PostgreSQL
特殊なため要注意
NaN 同士の比較は「等しいもの」と判定される。
NaN と他の数値との大小関係は NaN が常に大きい。
0/0 は Divide by Zero でエラーになる。(NaN にならない。)
https://www.postgresql.jp/document/12/html/datatype-numeric.html
#特殊な値