圆整通常被理解为为满足某种要求而进行的数据修正。按照修正后的数据在数值上是否比原数据大,又可分为向上圆整和向下圆整。它们很像对模拟信号进行采样,对一定范围的数据向一个固定的数据靠拢。Linux内核中定义了面向整除的圆整计算宏。第一个叫做roundup。

#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))

roundup类似于一个数学函数,它总是尝试找到大于x并接近x的可以整除y的那个数,也即向上圆整。那么为何内核不同是提供roundown宏定义呢?这是由于对于整型相除而言,所得的结果本身就是向下圆整的了。所以roundown可以很容易定义:

#define roundown(x, y) (((x) / (y)) * (y))

那么如何理解roundup的定义呢?看起来是尝试将(x) + ((y) - 1)的结果对y做向下取整,为何这样就可以实现x对y的向上取整呢?除法的本质在于对量的均分,那么观察下图:

图 133. 向上圆整算法证明

对于x = βy + δ来说,β>=0,y>0,并且0<=δ<y。因为y>0且为整数,那么0<=δ<y等价于0<=δ<=y-1。对于圆整运算来说,可以将x中可以整除y的部分βy提取出来,只对剩下的δ部分做圆整运算然后加上βy。同理这里对δ+y-1部分进行圆整,由于0<=δ<=y-1,得到y-1 <= δ + y-1 <= 2y-2。考虑两种情况: 当可以整除时,δ=0,也即取y-1,显然圆整值为0,也即不用向上圆整;而不可整除时,δ>0,所以y-1 < δ + y-1 <= 2y-2,又因为y为整数,所以y <= δ + y-1 <= 2y-2成立,由于y=1时符合第一种情况,所以只需考虑y>=2的情况。y==y并且2y-2在y>=2时>=y且<2y,所以保证δ + y-1的圆整值为1,也即不整除则要始终向上圆整。

一种更易被人理解的定义方式如下,它根据取余的结果计算圆整,由于整除的概率很低,所以这种算法每次都要多计算一次取余,而不能完全避免对除法的运算以消减取余算法的影响,它的效率要低。

#define roundup(x, y) ((x)%(y) ? ((x)/(y) + 1) * (y) : x)

一段如下的测试程序可以看到它的作用:

  int divisor = 0;printf("divisor\troundup\trounddown\n");for(; divisor < 5; divisor++)printf("%d:\t%d\t%d\n", divisor, roundup(divisor, 2), roundown(divisor, 2));

输出结果如下:

divisor    roundup rounddown
0:  0   0
1:  2   0
2:  2   2
3:  4   2
4:  4   4

内核提供的另一个宏DIV_ROUND_UP用来对除法的结果进行圆整,也即总是取大于n并接近n的那个数整除d后的结果。DIV_ROUND_UP类似于roundup,只是少了乘的动作,原理也是相同的。

#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))

DIV_ROUND_UP的处理结果如下:

0, 0
1, 1
2, 1
3, 2
4, 2

圆整可以通过除法实现,另一种实现方式是通过对低比特位进行清0操作,但是它们只适合对对齐到2的幂指数的操作有效。

数据圆整ROUNDUP|DOWN相关推荐

  1. 齿轮数据接口标准及应用前景

    为解决齿轮设计.制造.测量和在役等各个阶段的数据种类和格式繁杂,数据交互困难且缺少相应自动化系统的问题,提出了基于XML语言的可扩展齿轮描述语言(eXtensible Gear Describe La ...

  2. python-基于python程序设计基础第二版

    持续不定期更新,以下内容主要供学习使用 文章目录 *持续不定期更新,以下内容主要供学习使用* 一.基本规则 1. 基本词法单位 2. python 区分大小写 3 . 标识符的规则 4 . print ...

  3. linux 和windows 内存管理区别

    linux 和windows 内存管理区别 在 80 年代初,IBM 推出的 IBM PC 机采用了 Intel 16 位的 8088 处理器,该处 理器可以访问最多 1MB 的存储器.当应用程序需要 ...

  4. matlab实验一 图像增强

    实验一 图像增强 一.实验目的 二.实验环境 三.相关函数 四.实验内容: 一 . 灰度变换 二 . 空域滤波 三.频域增强 一.实验目的 熟悉及掌握图像的灰度转换. 理解直方图的概念及应用,实现图像 ...

  5. matlab图像低通滤波器 实验报告,基于matlab数字图像处理之低通滤波器

    <基于matlab数字图像处理之低通滤波器>由会员分享,可在线阅读,更多相关<基于matlab数字图像处理之低通滤波器(6页珍藏版)>请在人人文库网上搜索. 1.实践一:理想低 ...

  6. 用matlab编程实现数字图像理想低通滤波、高斯低通滤波和巴特沃斯低通滤波去噪算法

    1 理想低通滤波 %理想低通 I = imread('fig.png'); I=rgb2gray(I); figure(1); subplot(221),imshow(I); title('原图像') ...

  7. C#基础教程-c#实例教程,适合初学者

    C#基础教程-c#实例教程,适合初学者. 第一章 C#语言基础 本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和W ...

  8. index和roundup扩展数据行以完成筛选

     写在前面:     今天的案例主要通过index和roundup函数组合实现数据扩充,进而使用vlookup进行多字段联合查找,以实现最终筛选目的. 案例如下:某品牌共4款新品在北京.天津.上海.重 ...

  9. index和roundup扩展数据行并实现筛选

    学习更多,欢迎关注微信公众号:Excel办公小技巧 写在前面:     今天的案例主要通过index和roundup函数组合实现数据扩充,进而使用vlookup进行多字段联合查找,以实现最终筛选目的. ...

最新文章

  1. 北理工硕士生「一字不差」抄袭顶会投稿,网友:买论文被忽悠了?
  2. 华为手机logcat不出日志解决方案
  3. 对于一个管理性的软件来讲,数据主键的产生策略是很关键的一点,这个关系到整个系统的基础架构思想。...
  4. SharePoint配置和自定义Content Query Web Part
  5. javaSE各阶段练习题--流程控制2
  6. mysql的1045 28000 排查方法
  7. Hibernate缓存和加强
  8. jQuery中each的用法之退出循环和结束本次循环
  9. 谷歌浏览器一直显示弹框登陆代理解决方法
  10. 使用iWebOffice实现电子签章
  11. 惠普局域网共享打印机设置_打印机usb转网络?打印机共享怎么设置?怎样设置hp打印机共享器操作方法...
  12. halcon轮廓擦除_HALCON高级篇:轮廓处理
  13. 广告法违禁词替换工具_广告法禁用词替代大全之第一弹
  14. 前端工程师面试时自我介绍该如何做?
  15. 2023秋招--梦加网络--游戏客户端--一面面经
  16. Tektronix泰克DPO4054示波器
  17. 洛谷 P2258 子矩阵
  18. Oracle中的emp、dept、bonus及salgrade表的新建及MySQL中的三种注释形式
  19. centos7.x 查看端口占用情况方法
  20. Ins和TikTok最受欢迎,社交媒体成为千禧一代和Z世代消费者发现国际品牌的首选渠道 | 美通社头条...

热门文章

  1. 诺基亚将更名为微软移动
  2. C++提高编程(四)—— STL函数对象
  3. 管理经济学【三】之 消费者效用分析
  4. 简单工厂模式——2016手机也疯狂
  5. conda查看配置config命令
  6. 宝塔给WordPress网站搬家
  7. 深圳戴尔服务器R730XD 详细参数与讲解
  8. LGV - 求多条不相交路径的方案数
  9. 云场景实践研究第4期:小鱼儿科技
  10. 6.1.5 日志管理