在constexpr变量模板中模拟nan/inf

Simulating nan/inf in a constexpr variable template

本文关键字:模拟 nan inf constexpr 变量      更新时间:2023-10-16

有没有一种方法可以在常量表达式中模拟nan/inf!使用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

我知道这有点宽泛,但这是一个图书馆,我正在寻找一些有教育意义的建议!谢谢

__builtin_nan("0")

我使用编译器资源管理器检查了这一点,它似乎在gcc 6.1+、clang 6.0.0+、MSVC v19.24+和许多其他不常见的编译器中都得到了支持。

使用编译器提供的内容。这是唯一不标准的方式。检查编译器是否以及如何提供此功能。还要记住,标准库提供std::numeric_limits<T>::has_quiet_NaN是有原因的。