一种有效的方法来计算浮点后的下一个更高的整数?

时间:2019-03-11 16:52:41

标签: c++ c

令人惊讶的是,我想对此进行简单的计算:

float x = /*...*/;
float next = nextint(x);

其中next严格大于x(即,如果x是整数,则返回下一个更高的整数)。理想情况下没有分支。

2 个答案:

答案 0 :(得分:6)

您似乎想要下限+ 1:

 float next = floorf(x) + 1; // or std::floor

请注意,这将为您提供数学上的下一个整数,四舍五入为最接近的可表示值,对于大x来说,它本身可能就是x。在这种情况下,这不会产生严格较大的可表示整数。您应该考虑这是否是您想要的。

答案 1 :(得分:3)

即使对于较大的浮点数(下一个浮点可能超过1的距离),也有一种方法来获得正确的结果。

float nextint(float x)
{
    constexpr float MAX_VALUE = std::numeric_limits<float>::max();
    return std::ceil(std::nextafter(x, MAX_VALUE));
}

首先,我们移至下一个可表示的浮点值(向正无穷大)。然后我们舍入到最接近的浮点值。

正确性证明:

我们微不足道地满足“严格大于”的条件,因为nextafter严格增加了数字,而ceil从不降低它。

我们永远不会超过一个可表示的整数(也就是说,我们实际上得到了“下一个更高的”整数):nextafter(x)要么已经是下一个更高的 representable 整数(其中情况ceil保持不变),或者它是x与下一个更高的整数之间的浮点数(在这种情况下,ceil将我们带到后者)。