NaN だと…

これまであまり気にすることもなく使っていた double(倍精度浮動小数点数)ですが,最近になって Inf や NaN の扱いを考える機会があり,存外にややこしくて困りました.

Inf は無限大を意味する値で +Inf と -Inf があります.+Inf == +Inf と -Inf == -Inf は true になります.ちなみに std::numeric_limits::min/max() は Inf にならない最小・最大の値を返すようになっていました.max() が返す値なので,それより小さい・大きい値は存在しないかと思いきや,min() < -Inf と max() > +Inf が成立してしまいます.

NaN は数として評価できないことを示します.大小関係が成立しないという特徴があり,NaN < 0.0 は false となり,同時に NaN >= 0.0 も false となります.おまけに,NaN == NaN は false となり,NaN != NaN も false となります.なんだかもやもやします.

さらに細かい話をすると NaN にも種類があるようなのですが,そこまでは気にしないことにしました.

ちなみに,大小比較に依存する std::set なんかは,NaN を入れると動作は未定義になるようです.もちろん,std::unordered_set も等号が成立しないので酷いことになると思います.