【发布时间】:2010-04-30 14:16:53
【问题描述】:
给定整数值 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);就足够了 -
@LưuVĩnhPhúc 说真的,您需要将其添加为答案。我只是在代码测试期间用它来回答我的问题。虽然我不确定答案的 mod 部分是如何工作的,但它就像一种魅力,但它确实起到了作用。
-
@AndreasGrapentin Miguel Figueiredo 下面的答案是在 Lưu Vĩnh Phúc 留下上述评论前将近一年提交的。虽然我了解 Miguel 的解决方案是多么吸引人和优雅,但我不倾向于在这么晚的时候更改已接受的答案。这两种方法仍然有效。如果您对此感觉足够强烈,我建议您通过在下面对 Miguel 的回答进行投票来表示您的支持。
-
奇怪,我还没有看到对提议的解决方案进行任何理智的测量或分析。您谈论的是近乎骨干的速度,但没有讨论架构、管道、分支指令和时钟周期。