给定整数值,x并且yC和C++都返回作为q = x/y浮点等效的底数的商.我对一种返回天花板的方法很感兴趣.例如,ceil(10/5)=2和ceil(11/5)=3.
显而易见的方法包括:
q = x / y;
if (q * y < x) ++q;
Run Code Online (Sandbox Code Playgroud)
这需要额外的比较和乘法; 我见过的其他方法(事实上使用)涉及铸造为float或double.是否有更直接的方法可以避免额外的乘法(或第二个除法)和分支,并且还可以避免作为浮点数进行转换?
我想ceil()在 中实现我自己的C。在库中搜索源代码并在此处找到,但似乎很难理解。我想要干净优雅的代码。
我也在 SO 上进行了搜索,在这里找到了一些答案。似乎没有一个答案是正确的。答案之一是:
#define CEILING_POS(X) ((X-(int)(X)) > 0 ? (int)(X+1) : (int)(X))
#define CEILING_NEG(X) ((X-(int)(X)) < 0 ? (int)(X-1) : (int)(X))
#define CEILING(X) ( ((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X) )
Run Code Online (Sandbox Code Playgroud)
AFAIK,返回类型ceil()不是 int。宏在这里是类型安全的吗?此外,上述实现对于负数有效吗?
实施它的最佳方式是什么?
你能提供干净的代码吗?