特別是,它必須像std::copysign那樣對NaN作業。同樣,我需要一個 constexpr std::signbit.
constexpr double copysign(double mag, double sgn)
{
//How?
}
constexpr bool signbit(double arg)
{
//span>如何?
}
//產生兩種型別的NaN。
constexpr double nan_pos = copysign(std:: numeric_limits<double>::quiet_NaN(), 1)。)
constexpr double nan_neg = copysign(std:: numeric_limits<double>::quiet_NaN(), -1)。)
//必須通過檢查。
static_assert(signbit(nan_pos) == false) 。
static_assert(signbit(nan_neg) == true) 。
背后的故事是,我在編譯時需要兩種型別的NaN,以及區分它們的方法。我能想到的最直接的方法是操縱NaN的符號位。它在運行時確實有效;現在我只想把一些計算轉移到編譯時,這就是最后的障礙。
注:目前,我依靠 GCC,因為它有這些函式的內置版本,而且它們確實是 uj5u.com熱心網友回復: 如果你能使用 uj5u.com熱心網友回復: 使用 https://godbolt.org/z/8Wafaj4a4
標籤: 上一篇:如果條件。(64>360)為真?
下一篇:計算45度,指向頁面的左上角
constexpr,這很好。但我希望我的代碼庫能在Clang上編譯,也許還有其他編譯器。
std::bit_cast,你就可以操作浮點型別投向整數型別。其可移植性僅限于double的表示,但是如果你能承擔 IEEE 754雙精度二進制浮點格式,投到uint64_t并使用符號位應該可以。
__builtin...并不是真正的portable,但在作為目標提到的編譯器中可以作業。__builtin_copysign是contexpr,但是__builtin_signbit顯然不在clang上,所以用__builtin_copysign做signbit:#include <limit>/span>
constexpr double copysign(double mag, double sgn)
{
return __builtin_copysign(Mag, sgn)。
}
constexpr bool signbit(double arg)
{
return __builtin_copysign(1, arg) < 0;
}
//產生兩種型別的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)。)
//必須通過檢查。
static_assert(signbit(nan_pos) == false) 。
static_assert(signbit(nan_neg) == true) 。
int main(){}。
