C++中的循环划分 我如何在C++中使用两个int值执行除法而不使用STD::CEIL?

C++中的循环划分 我如何在C++中使用两个int值执行除法而不使用STD::CEIL?,c++,c++11,division,integer-division,ceil,C++,C++11,Division,Integer Division,Ceil,通常情况下,我会做如下事情: double res = ceil(a / (double) b); 有没有办法不使用std::ceil复制结果?您可以这样做 double res = (double) (((a % b) == 0) ? (a / b) : (a / b) + 1); 基本上,如果有余数,则将1添加到截断整数结果中您可以这样做 double res = (double) (((a % b) == 0) ? (a / b) : (a / b) + 1); 基本上,如果有余数,

通常情况下,我会做如下事情:

double res = ceil(a / (double) b);
有没有办法不使用std::ceil复制结果?

您可以这样做

double res = (double) (((a % b) == 0) ? (a / b) : (a / b) + 1);
基本上,如果有余数,则将1添加到截断整数结果中

您可以这样做

double res = (double) (((a % b) == 0) ? (a / b) : (a / b) + 1);
基本上,如果有余数,则将1添加到截断整数结果中

如果a和b都为正,则可以完全避免浮点运算,并通过经典方法获得精确的结果—FP舍入没有问题,执行时间更快:

int res = (a + (b - 1)) / b;
对于负a,您不需要任何更正-整数除法执行的截断已经具有与ceil公式匹配的语义;因此,如果您想了解更一般的情况:

int res = (a<0 ? a : (a + (b - 1))) / b;
如果a和b都为正,则可以完全避免浮点运算,并通过经典方法获得精确结果—FP舍入没有问题—执行时间更快:

int res = (a + (b - 1)) / b;
对于负a,您不需要任何更正-整数除法执行的截断已经具有与ceil公式匹配的语义;因此,如果您想了解更一般的情况:

int res = (a<0 ? a : (a + (b - 1))) / b;

a和b的类型是什么?它们是int.inta/doubleb+0.5?a和b的类型是什么?它们是int.inta/doubleb+0.5?这里的整数溢出怎么办?如果a和b中的任何一个足够大,那么负b呢?@LuisMachuca如果这是一个问题,你可以做类似a/b+的事情!!a%b,这应该不会造成任何问题,但它可能会慢一点,因为它有一个分支,通常是更复杂的代码。如果它们都是正数,a-1/b+1更好,因为它不会溢出。@norok2到目前为止,当a和b都允许被签名时,建议的解决方案中的一个比较等于std::ceil。这里的整数溢出怎么办?如果a和b中的任何一个足够大,那么负b呢?@LuisMachuca如果这是一个问题,你可以做类似a/b+的事情!!a%b,这应该不会造成任何问题,但它可能会慢一点,因为它有一个分支,通常是更复杂的代码。如果它们都是正数,a-1/b+1更好,因为它不会溢出。@norok2到目前为止,当a和b都被允许签名时,建议的解决方案中有一个相当于std::ceil。或者,更简洁地说,a/b+!!a%b。或者更紧凑地说,a/b+!!a%b。