NANの定義について

gcc環境だと math.h に NAN という定数が定義されている。ところが visual c++ (visual studio)には対応する定義が無い。

環境に依存しない、ポータブルな、移植性の高いコードが必要な場合は、STLを使って

#include <limits>
std::numeric_limits<float>::quiet_NaN();
std::numeric_limits<double>::quiet_NaN();

と書けば良い。

なお quiet_NaN() の"quiet"はシグナルを発生させないという意味。浮動小数点関連の仕様を定めているIEEE 754は、2 種類の NaN を用意していて、

  • シグナルを発生するNAN (signaling nan)
  • シグナルを発生しないNAN (quiet nan) 

して区別している。つまりシグナルハンドラから見て、五月蝿い(signaling)か、静か(quiet)か、という分類。

ところで、バッドノウハウのひとつとして、 NAN を 0/0 で実装する方法がある。

const float FLT_NAN = 0.f/0.f; 

しかし、これは環境依存であり、使うべきではないらしい。(結果が、不定なのか未定義なのかは未調査)