diff options
author | graehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-08-15 02:43:08 +0000 |
---|---|---|
committer | graehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-08-15 02:43:08 +0000 |
commit | 09bbe07fedcdf74f9d0bb28510fe5f3bf0748f6a (patch) | |
tree | 80d946b0891220c135cb979213eb3ce253c8b388 /utils/nan.h | |
parent | 297d38bd8f70bcd7690da02bec70a49c2074869d (diff) |
nan
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@550 ec762483-ff6d-05da-a07a-a48fb63a330f
Diffstat (limited to 'utils/nan.h')
-rwxr-xr-x | utils/nan.h | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/utils/nan.h b/utils/nan.h new file mode 100755 index 00000000..257364d5 --- /dev/null +++ b/utils/nan.h @@ -0,0 +1,42 @@ +#ifndef NAN_H +#define NAN_H +//TODO: switch to C99 isnan isfinite isinf etc. (faster) + +#include <limits> + +template <bool> struct nan_static_assert; +template <> struct nan_static_assert<true> { }; + +// is_iec559 i.e. only IEEE 754 float has x != x <=> x is nan +template<typename T> +inline bool is_nan(T x) { +// static_cast<void>(sizeof(nan_static_assert<std::numeric_limits<T>::has_quiet_NaN>)); + return std::numeric_limits<T>::has_quiet_NaN && (x != x); +} + +template <typename T> +inline bool is_inf(T x) { +// static_cast<void>(sizeof(nan_static_assert<std::numeric_limits<T>::has_infinity>)); + return x == std::numeric_limits<T>::infinity() || x == -std::numeric_limits<T>::infinity(); +} + +template <typename T> +inline bool is_pos_inf(T x) { +// static_cast<void>(sizeof(nan_static_assert<std::numeric_limits<T>::has_infinity>)); + return x == std::numeric_limits<T>::infinity(); +} + +template <typename T> +inline bool is_neg_inf(T x) { +// static_cast<void>(sizeof(nan_static_assert<std::numeric_limits<T>::has_infinity>)); + return x == -std::numeric_limits<T>::infinity(); +} + +//c99 isfinite macro shoudl be much faster +template <typename T> +inline bool is_finite(T x) { + return !is_nan(x) && !is_inf(x); +} + + +#endif |