Для Visual Studio я использовал бы _isnan
и _finite
, или возможно _fpclass
.
, Но если у Вас есть доступ к C++ 11-способная стандартная библиотека и компилятор, Вы могли бы использовать std::isnan
и std::isinf
.
Хотя не строго часть C++ 03, если Ваш компилятор обеспечивает некоторые новые функции C99 стандарта < математика h> заголовочный файл, тогда у Вас может быть доступ к следующим "подобным функции макросам": isfinite
, isinf
, isnan
. Если так, они были бы самым легким и самым безопасным способом выполнить эти проверки.
Можно также использовать их в качестве строгого C ++-only решение. Они действительно не предлагают больше, чем решение OP кроме дополнительной защиты посредством использования черт типа и возможно самого крошечного повышения скорости в случае is_inf
.
template <bool> struct static_assert;
template <> struct static_assert<true> { };
template<typename T>
inline bool is_NaN(T const& x) {
static_cast<void>(sizeof(static_assert<std::numeric_limits<T>::has_quiet_NaN>));
return std::numeric_limits<T>::has_quiet_NaN and (x != x);
}
template <typename T>
inline bool is_inf(T const& x) {
static_cast<void>(sizeof(static_assert<std::numeric_limits<T>::has_infinity>));
return x == std::numeric_limits<T>::infinity() or x == -std::numeric_limits<T>::infinity();
}
(остерегаются, самодельных static_assert
)