C++ 正在查找constexpr cell函数

C++ 正在查找constexpr cell函数,c++,c++11,visual-c++,constexpr,C++,C++11,Visual C++,Constexpr,由于在Visual Studio 2015中,std:ceil都不是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)) {

由于在Visual Studio 2015中,
std:ceil
都不是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);
}
constepr std::int32\t ceil(float num){
std::int32_t inum=静态强制转换(num);
如果(num==静态(inum)){
返回inum;
}
返回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 int32\u t ceil(float num)
{
return(static_cast(static_cast(num))==num)
?静态铸件(数量)
:静态_cast(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;
}

玩(作为奖励,它还包括
floor()
constexpr
实现)。

看,它看起来可以写为constexprWhy而不是
float-ceil(float)
就像std提供的那样?@legends2k:这个实现并不适用于所有的浮点值,签名反映了这一点。只是好奇而已。通常不赞成用浮点进行相等比较。这是一个例外吗?@如果在正确的位置执行翻转浮点比较,则完全可以。在本例中,我们感兴趣的是向下舍入的值是否等于原始值(或其符号是否为正),并且由于舍入中没有浮点错误,因此它是浮点相等的正确位置。如果您想解决来自以前计算的浮点错误,则需要修改此函数以处理此问题。我在(GPL3)库中使用了此函数,希望可以;)@当然,谢谢你的提醒。图书馆的名字是什么?我只是好奇。
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);