寻找一个 constexpr ceil 函数
Looking for a constexpr ceil function
由于 std:ceil
在 Visual Studio 2015 年都不是 constexpr
,我正在寻找它的 constexpr
实现,我可以在编译时使用它 -收效甚微。
感谢任何帮助。
您可以使用
constexpr std::int32_t ceil(float num) {
std::int32_t inum = static_cast<std::int32_t>(num);
if (num == static_cast<float>(inum)) {
return inum;
}
return inum + (num > 0 ? 1 : 0);
}
注意:一旦整数不能表示浮点值,就不起作用。
由于 Visual Studio 2015 的编译器仍然不允许 constexpr 函数具有 if
条件和变量,我重写了 Jarod42 的解决方案并删除了它们:
constexpr int32_t ceil(float num)
{
return (static_cast<float>(static_cast<int32_t>(num)) == num)
? static_cast<int32_t>(num)
: static_cast<int32_t>(num) + ((num > 0) ? 1 : 0);
}
这是一个基于 的版本,删除了两个分支之一。这将适用于 C++14 或 C++17——如果你内联整数转换,你也可以让它支持 C++11。
constexpr int int_ceil(float f)
{
const int i = static_cast<int>(f);
return f > i ? i + 1 : i;
}
这是一个验证行为是否正确的小套件。 (只是一系列 C++17 static_assert()
s,因为函数是 constexpr
——如果它编译,你知道测试通过了!)
static_assert(int_ceil(0.0) == 0);
static_assert(int_ceil(0.5) == 1);
static_assert(int_ceil(0.999999) == 1);
static_assert(int_ceil(1.0) == 1);
static_assert(int_ceil(123.0) == 123);
static_assert(int_ceil(123.4) == 124);
static_assert(int_ceil(-0.5) == 0);
static_assert(int_ceil(-0.999999) == 0);
static_assert(int_ceil(-1.0) == -1);
static_assert(int_ceil(-123.0) == -123);
static_assert(int_ceil(-123.4) == -123);
Here's a Compiler Explorer sample 一起玩(作为奖励,它还包括 floor()
的 constexpr
实现)。
由于 std:ceil
在 Visual Studio 2015 年都不是 constexpr
,我正在寻找它的 constexpr
实现,我可以在编译时使用它 -收效甚微。
感谢任何帮助。
您可以使用
constexpr std::int32_t ceil(float num) {
std::int32_t inum = static_cast<std::int32_t>(num);
if (num == static_cast<float>(inum)) {
return inum;
}
return inum + (num > 0 ? 1 : 0);
}
注意:一旦整数不能表示浮点值,就不起作用。
由于 Visual Studio 2015 的编译器仍然不允许 constexpr 函数具有 if
条件和变量,我重写了 Jarod42 的解决方案并删除了它们:
constexpr int32_t ceil(float num)
{
return (static_cast<float>(static_cast<int32_t>(num)) == num)
? static_cast<int32_t>(num)
: static_cast<int32_t>(num) + ((num > 0) ? 1 : 0);
}
这是一个基于
constexpr int int_ceil(float f)
{
const int i = static_cast<int>(f);
return f > i ? i + 1 : i;
}
这是一个验证行为是否正确的小套件。 (只是一系列 C++17 static_assert()
s,因为函数是 constexpr
——如果它编译,你知道测试通过了!)
static_assert(int_ceil(0.0) == 0);
static_assert(int_ceil(0.5) == 1);
static_assert(int_ceil(0.999999) == 1);
static_assert(int_ceil(1.0) == 1);
static_assert(int_ceil(123.0) == 123);
static_assert(int_ceil(123.4) == 124);
static_assert(int_ceil(-0.5) == 0);
static_assert(int_ceil(-0.999999) == 0);
static_assert(int_ceil(-1.0) == -1);
static_assert(int_ceil(-123.0) == -123);
static_assert(int_ceil(-123.4) == -123);
Here's a Compiler Explorer sample 一起玩(作为奖励,它还包括 floor()
的 constexpr
实现)。