is_nan

少し前のBoost MLでNaNの判定が話題になっていたので、
http://thread.gmane.org/gmane.comp.lib.boost.devel/146001
これを参考にしつつ、Hamigaki.Audioのdetailにあるis_nanを独立したヘッダに移動してみました。
http://hamigaki.sourceforge.jp/hamigaki/math/is_nan.hpp


簡単なテストも追加したのですが、またもやBorlandだけ動きません。
正しく判定できないのは、

  • floatのquiet_NaN
  • doubleのquiet_NaN
  • long doubleのquiet_NaN/signaling_NaN

です。long doubleはquiet/signalingも駄目なので試しに、

if (std::numeric_limits<long double>::has_quiet_NaN)
    std::cout << std::numeric_limits<long double>::quiet_NaN() << std::endl;

してみた結果が、

6.72339e-4932

16進でダンプすると、

0000FFF8000000000000

となっていました。
doubleだと、

FFF8000000000000

なので、long doubleが64bitの設定でコンパイルされている気がします。
あと、doubleにしても最上位ビット(符号フラグ)が立ってるのは変です。
is_nan自体は動いているようなのですが、こんなところに落とし穴があるとは、、、。