给定整数值x和y, C和c++都返回q = x/y的商,即浮点等价物的底数。我感兴趣的是一种返回天花板的方法。例如,ceil(10/5)=2, ceil(11/5)=3。

最明显的方法是:

q = x / y;
if (q * y < x) ++q;

这需要额外的比较和乘法;我所见过的(实际上使用过的)其他方法都涉及到float或double类型的类型转换。有没有一种更直接的方法可以避免额外的乘法(或二次除法)和分支,同时也避免将类型转换为浮点数?


当前回答

这适用于正数或负数:

q = x / y + ((x % y != 0) ? !((x > 0) ^ (y > 0)) : 0);

如果有余数,则检查x和y是否具有相同的符号,并相应地加1。

其他回答

使用O3编译,编译器优化性能良好。

q = x / y;
if (x % y)  ++q;

对于正数,求x除以y的上限q。

unsigned int x, y, q;

把…

q = (x + y - 1) / y;

或(避免x+y溢出)

q = 1 + ((x - 1) / y); // if x != 0

这适用于正数或负数:

q = x / y + ((x % y != 0) ? !((x > 0) ^ (y > 0)) : 0);

如果有余数,则检查x和y是否具有相同的符号,并相应地加1。

对于正x和负x都有一个解,但只对正y有一个除法,没有分支:

int div_ceil(int x, int y) {
    return x / y + (x % y > 0);
}

注意,如果x是正的,那么除法趋向于零,如果提醒符不为零,我们应该加1。

如果x为负,除法趋向于0,这就是我们需要的,我们不加任何东西,因为x % y不为正

简化的通用形式,

int div_up(int n, int d) {
    return n / d + (((n < 0) ^ (d > 0)) && (n % d));
} //i.e. +1 iff (not exact int && positive result)

更通用的答案是,c++函数使用定义良好的舍入策略进行整数除法