Как Вы проверяете на бесконечные и неопределенные значения в C++?

28
задан legends2k 30 July 2014 в 09:00
поделиться

3 ответа

Для Visual Studio я использовал бы _isnan и _finite , или возможно _fpclass .

, Но если у Вас есть доступ к C++ 11-способная стандартная библиотека и компилятор, Вы могли бы использовать std::isnan и std::isinf .

17
ответ дан dalle 28 November 2019 в 03:41
поделиться

Хотя не строго часть C++ 03, если Ваш компилятор обеспечивает некоторые новые функции C99 стандарта < математика h> заголовочный файл, тогда у Вас может быть доступ к следующим "подобным функции макросам": isfinite, isinf, isnan. Если так, они были бы самым легким и самым безопасным способом выполнить эти проверки.

3
ответ дан CB Bailey 28 November 2019 в 03:41
поделиться

Можно также использовать их в качестве строгого 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)

3
ответ дан Konrad Rudolph 28 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: