C++ 中的除法舍入
Posted
技术标签:
【中文标题】C++ 中的除法舍入【英文标题】:Division Round Up in C++ 【发布时间】:2020-05-26 22:43:14 【问题描述】:在不使用 std::ceil
的情况下,在 C++ 中对两个 int
值执行除法时如何进行舍入?
通常我最终会执行以下操作:
double res = ceil(a / (double) b);
有什么方法可以在不使用std::ceil
的情况下复制结果?
【问题讨论】:
a
和b
有哪些类型?
他们是int
。
(int)(a / (double)b + 0.5)
?
【参考方案1】:
如果a
和b
都是正数,则可以完全避免浮点数,通过经典方法获得准确的结果(FP 舍入没有问题)和更快的执行时间:
int res = (a + (b - 1)) / b;
对于负的a
,您不需要任何更正 - 整数除法执行的截断已经具有与您的ceil
公式匹配的语义;所以,如果你想要一个更一般的情况:
int res = (a<0 ? a : (a + (b - 1))) / b;
【讨论】:
这里的整数溢出怎么办? (如果 a 和 b 中的任何一个足够大) 否定的b
呢?
@LuisMachuca 如果有问题,您可以执行a / b + !!(a % b)
之类的操作,这应该不会造成任何问题,但它可能会慢一些(它有一个分支,一般来说更多复杂的代码)。
如果都是肯定的,(a-1)/b + 1
更好,因为它不会溢出。
@norok2 到目前为止,当a
和b
都被允许签名时,所提议的解决方案中的none 比较等于std::ceil
。【参考方案2】:
你可以这样做
double res = (double) (((a % b) == 0) ? (a / b) : (a / b) + 1);
基本上如果有余数,将截断的整数结果加1
【讨论】:
或者,更简洁地说,a/b + !!(a%b)
。以上是关于C++ 中的除法舍入的主要内容,如果未能解决你的问题,请参考以下文章