在整数除法中,使用表达式 (a + b - 1) / b 可以实现向上取整的效果。其核心原理是通过调整分子,使得余数部分自动触发进位。
1. 基本原理
假设 a 和 b 是正整数,目标是计算 ceil(a / b)(即不小于 a/b 的最小整数)。
由于编程语言中的整数除法默认是向下取整的(如 5/2=2),需要通过调整分子实现向上取整。
2. 数学推导
设 a = q*b + r,其中:
q是商(整数部分),r是余数(0 ≤ r < b)。
需要分两种情况讨论:
情况1:余数 r = 0
- 此时
a/b = q,直接返回q即可。 - 表达式计算:
(a + b - 1)/b = (q*b + b - 1)/b = q + (b - 1)/b
由于(b-1)/b的整数除法结果为0,最终值为q,符合预期。
情况2:余数 r > 0
- 此时
a/b = q + r/b,向上取整应为q + 1。 - 表达式计算:
(a + b - 1)/b = (q*b + r + b -1)/b = q + (r + b -1)/b
由于r ≥ 1,且r + b -1 ≥ b,因此(r + b -1)/b的整数除法结果为1,最终值为q + 1,符合预期。
3. 公式特性
- 通用性:无论
a是否为b的整数倍,公式均适用。 - 边界示例:
a=10, b=3:
(10 + 3 -1)/3 = 12/3 = 4(10/3=3.333,向上取整为4)。a=9, b=3:
(9 + 3 -1)/3 = 11/3 = 3(9/3=3,向上取整仍为3)。
4. 代码中的应用
在给定的代码片段中,该公式用于两类计算:
1. 计算步长(repeated_step)
cCopy Code
ctrl_para->repeated_step = (sample_para->num + MAG_DEV_FAM_STRENGTH_LIST_MAX_LEN - 1) / MAG_DEV_FAM_STRENGTH_LIST_MAX_LEN;
- 目标:将
num个采样点压缩到不超过MAG_DEV_FAM_STRENGTH_LIST_MAX_LEN的数组中。 - 逻辑:
若num超过最大长度,通过增大步长(repeated_step),将多个采样点合并为一个存储点。
2. 计算有效点数(valid_num)
cCopy Code
ctrl_para->valid_num = (sample_para->num + ctrl_para->repeated_step - 1) / ctrl_para->repeated_step;
- 目标:确保有效点数不超过存储容量。
- 逻辑:
根据步长计算实际需要存储的点数,避免数组越界。
5. 实际效果示例
| 参数 | 计算步骤 | 结果 |
|---|---|---|
num=100, MAX_LEN=20 | (100+20-1)/20 = 119/20 = 5 → 步长=5valid_num=(100+5-1)/5=104/5=20 | 压缩为20个点 |
num=101, MAX_LEN=20 | (101+20-1)/20=120/20=6 → 步长=6valid_num=(101+6-1)/6=106/6=17.666→18 | 压缩为18个点 |
6. 总结
- 公式本质:通过调整分子,将余数的影响转换为进位。
- 代码意义:在资源受限的场景中,通过数学技巧实现数据压缩,确保不越界且保留关键信息。
3422

被折叠的 条评论
为什么被折叠?



