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自体は動いているようなのですが、こんなところに落とし穴があるとは、、、。