寻找constexpr ceil功能

时间:2015-08-11 21:24:53

标签: c++ c++11 visual-c++ constexpr

由于std:ceil在Visual Studio 2015中都不是constexpr,我正在寻找constexpr的实现,我可以使用编译时 - 但收效甚微

感谢任何帮助。

3 个答案:

答案 0 :(得分:9)

由于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);
}

答案 1 :(得分:6)

您可以使用

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);
}

Live demo

注意:一旦整数不能表示浮点值,则不起作用。

答案 2 :(得分:0)

这是通过消除两个分支之一构建在 Jarod42's excellent answer 上的版本。这将适用于 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(),因为函数是 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(作为奖励,它还包括 constexprfloor() 实现)。