Definition of NaN
非数。
Not A Numberの略で、そのバイト数の浮動小数点数では表現されない値を指す。正の無限大及び負の無限大とは区別される。
指数部が全て
1, 仮数部が全て
0でない(いずれかが
1の)ビット列。倍精度では
1 11111111111 1111111111111111111111111111111111111111111111111111,
0 11111111111 1000000000000000000000000000000000000000000000000000
など。
なお浮動小数点数は一般に
単精度
(4バイト): 符号[1bit] + 指数部[8bit] + 仮数部[23bit]
倍精度
(8バイト): 符号[1bit] + 指数部[11bit] + 仮数部[52bit]
という構造になっている。
+
浮動小数点数
Making NaN
NaNを定数として定義する方法はいくつかあって、コンパイラによって通ったり通らなかったりらしいが、次の方法が良いようである。
+
FortranでNaNを定数として宣言する何通りかの方法 - Qiita
0/0,
log(-1)なども候補として挙げられていたが、この記事にもあるように
gfortranでは
0/0は通らないし、
ifortでもコンパイルオプションにはじかれたりもするのでお勧めしない。
Execute.
Judging NaN
NaNの判定では
transferによる逆変換は使わない方が良い。
上のサンプルを見ると、
transfer(nan,0_8) == -1_8
となりそうに思われるが、
nanをモジュールから定数として呼び出すときにはこれが成り立たない。モジュールで定数として定義された
nanをプログラムから呼び出すと、仮数部の値が変わっており、
transferで整数に変換したとき
-1_8に戻らなくなっている、ということが起きる。
コンパイラーによっては仮数分もそのまま保存されるが、移植性を考えると
transferは使わず、素直に指数部と仮数部の中を確認するのが良い。
NaN判定関数