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 的情况下复制结果?

【问题讨论】:

ab有哪些类型? 他们是int (int)(a / (double)b + 0.5)? 【参考方案1】:

如果ab 都是正数,则可以完全避免浮点数,通过经典方法获得准确的结果(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 到目前为止,当ab 都被允许签名时,所提议的解决方案中的none 比较等于std::ceil【参考方案2】:

你可以这样做

double res = (double) (((a % b) == 0) ? (a / b) : (a / b) + 1);

基本上如果有余数,将截断的整数结果加1

【讨论】:

或者,更简洁地说,a/b + !!(a%b)

以上是关于C++ 中的除法舍入的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法防止opencv矩阵除法中的舍入

浮点除法的软件实现,舍入问题

在 Python 中,整数除法中向零舍入的好方法是啥?

js中的除法

为啥整数除法在许多脚本语言中舍入?

如何在 Java 中舍入整数除法并获得 int 结果? [复制]