令人惊讶的是,我想对此进行简单的计算:
float x = /*...*/;
float next = nextint(x);
其中next严格大于x
(即,如果x
是整数,则返回下一个更高的整数)。理想情况下没有分支。
答案 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
将我们带到后者)。