了解CEILING宏用例

时间:2012-07-06 13:38:41

标签: c macros ceiling

我在代码库中的实用程序标头中找到了以下宏:

#define CEILING(x,y) (((x) + (y) - 1) / (y))

我在this answer的帮助下)将其解析为:

// Return the smallest multiple N of y such that:
//   x <= y * N

但是,无论我多么盯着我们的代码库中如何使用这个宏,我都无法理解这种操作的价值。没有任何用法被评论,这似乎表明它是显而易见的。

有人能为这个宏提供用例的英文解释吗?它可能很明显,我只是看不到它......

5 个答案:

答案 0 :(得分:5)

假设你想以块的形式分配内存(想想:缓存行,磁盘扇区);保存包含X字节的整数块的内存需要多少内存?如果卡盘大小为Y,则答案为:CEILING(X,Y)

答案 1 :(得分:5)

当您在C中使用整数除法时

y = a / b

你得到的分割结果将舍入为零,即5 / 2 == 2-5 / 2 == -2。有时需要以另一种方式将其舍入为5 / 2 == 3,例如,如果要采用最小整数数组大小来保存n字节,则需要对n / sizeof(int)进行四舍五入,因为您想要空间来容纳那些额外的字节。

所以这个宏就是这样做的:CEILING(5,2) == 3,但请注意它仅适用于正y,所以要小心。

答案 2 :(得分:4)

嗯......英文例子......你只能买5个香蕉串。你有47个人想要一个香蕉。你需要多少串?答案=天花板(47,5)=((47 + 5) - 1)/ 5 = 51/5 = 10(丢弃余数 - 整数除法)。

答案 3 :(得分:3)

让我们尝试一些测试值

CEILING(6, 3) = (6 + 3 -1) / 3 = 8 / 3 = 2 // integer division
CEILING(7, 3) = (7 + 3 -1) / 3 = 9 / 3 = 3
CEILING(8, 3) = (8 + 3 -1) / 3 = 10 / 3 = 3
CEILING(9, 3) = (9 + 3 -1) / 3 = 11 / 3 = 3
CEILING(10, 3) = (9 + 3 -1) / 3 = 12 / 3 = 4

如您所见,宏的结果是一个整数,尽可能小z满足:z * y >= x

我们也可以尝试使用符号:

CEILING(k*y, y) = (k*y + y -1) / y = ((k+1)*y - 1) / y = k
CEILING(k*y + 1, y) = ((k*y + 1) + y -1) / y = ((k+1)*y) / y = k + 1
CEILING(k*y + 2, y) = ((k*y + 2) + y -1) / y = ((k+1)*y + 1) / y = k + 1
....
CEILING(k*y + y - 1, y) = ((k*y + y - 1) + y -1) / y = ((k+1)*y + y - 2) / y = k + 1
CEILING(k*y + y, y) = ((k*y + y) + y -1) / y = ((k+1)*y + y - 1) / y = k + 1
CEILING(k*y + y + 1, y) = ((k*y + y + 1) + y -1) / y = ((k+2)*y) / y = k + 2

您可以使用此方法来分配具有常量大小倍数的内存,以确定填充屏幕所需的平铺量等等。

但请注意。这仅适用于正y

希望它有所帮助。

答案 4 :(得分:2)

假设CEILING(x,y),{p> y > 0会给你x/y(数学除法)的上限。一个用例就是从偏移x开始的主筛,在这里您将筛选范围内的素数y的所有倍数标记为复合材料。