#ifndef NAN_H #define NAN_H //TODO: switch to C99 isnan isfinite isinf etc. (faster) #include template struct nan_static_assert; template <> struct nan_static_assert { }; // is_iec559 i.e. only IEEE 754 float has x != x <=> x is nan template inline bool is_nan(T x) { // static_cast(sizeof(nan_static_assert::has_quiet_NaN>)); return std::numeric_limits::has_quiet_NaN && (x != x); } template inline bool is_inf(T x) { // static_cast(sizeof(nan_static_assert::has_infinity>)); return x == std::numeric_limits::infinity() || x == -std::numeric_limits::infinity(); } template inline bool is_pos_inf(T x) { // static_cast(sizeof(nan_static_assert::has_infinity>)); return x == std::numeric_limits::infinity(); } template inline bool is_neg_inf(T x) { // static_cast(sizeof(nan_static_assert::has_infinity>)); return x == -std::numeric_limits::infinity(); } //c99 isfinite macro shoudl be much faster template inline bool is_finite(T x) { return !is_nan(x) && !is_inf(x); } #endif