Моделирование nan/inf в шаблоне переменных constexpr

Есть ли способ симулировать нано / инф в постоянном выражении и без! используя макросы C HUGE_VAL и INFINITY или любые другие в этом отношении! Плюс, даже с ними, это все еще не constexpr.

Я не хочу использовать какие-либо стандартные функции, которые предоставляет стандартная библиотека C++ или стандартная библиотека C.

Конечно, следующее не компилируется. Компилятор говорит, что переменная constexpr должна быть инициализирована константным выражением...

template<typename T = double>
constexpr T NaN = T(0.0 / 0.0);

Метод, который использует компилятор MSVC, также не компилируется:

template<typename T = double>
constexpr T NaN = T(1e+300); //with some changes, apparently having the float overflow

Я знаю, что это довольно широко, но это для библиотеки, и я ищу несколько образованных советов! Спасибо!

1 ответ

      __builtin_nan("0")

Я проверил это с помощью проводника компиляторов, и, похоже, он поддерживается в gcc 6.1+, clang 6.0.0+, MSVC v19.24+ и многих других необычных компиляторах.

Используйте то, что предоставляет компилятор. Это единственный нестандартный способ. Проверьте, предоставляет ли ваш компилятор эту функцию и как. Также имейте в виду, что стандартная библиотека предоставляетstd::numeric_limits<T>::has_quiet_NaNпо причине.

Другие вопросы по тегам