【发布时间】:2021-11-14 11:46:22
【问题描述】:
特别是,它必须像 std::copysign 那样与 NaN 一起工作。同样,我需要一个 constexpr std::signbit。
constexpr double copysign(double mag, double sgn)
{
// how?
}
constexpr bool signbit(double arg)
{
// how?
}
// produce the two types of NaNs
constexpr double nan_pos = copysign(std::numeric_limits<double>::quiet_NaN(), +1);
constexpr double nan_neg = copysign(std::numeric_limits<double>::quiet_NaN(), -1);
// must pass the checks
static_assert(signbit(nan_pos) == false);
static_assert(signbit(nan_neg) == true);
背后的故事是我在编译时需要两种类型的 NaN,以及区分它们的方法。我能想到的最直接的方法是操纵 NaN 的符号位。它确实在运行时工作;现在我只想将一些计算转移到编译时间,这是最后一个障碍。
注意:目前,我依赖 GCC,因为它具有这些函数的内置版本,它们确实是 constexpr,这很好。但我希望我的代码库也能在 Clang 和其他编译器上编译。
【问题讨论】:
-
正负无穷对您来说是有效值吗?如果没有,您可以将它们用作您的两个哨兵值。
-
我们考虑过无穷大,但它们不适合代码库。不幸的是,它必须是 NaN。
-
std::nan("1")和std::nan("2")有什么问题? -
@Eljay 这些不是 constexpr。
-
@NathanOliver • 嗯...那很不幸!