找回密码
 立即注册
查看: 276|回复: 5

宏定义中加2是为了自动实现四舍五入?

[复制链接]
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 161 天

    [LV.7]常住居民III

    11

    主题

    91

    回帖

    444

    积分

    中级会员

    积分
    444
    发表于 2024-2-22 12:25:24 | 显示全部楼层 |阅读模式
    本帖最后由 pursuing 于 2024-2-22 12:29 编辑

    我在学习《STC8H》pdf手册,其中 17.10.4 串口 2 使用定时器 2 做波特率发生器 章节中,有下面的宏定义:

    #define FOSC 11059200UL
    #define BRT (65536 - (FOSC / 115200+2) / 4)  //加 2 操作是为了让 Keil 编译器自动实现四舍五入运算

    我认为这个注释是不是有问题?因为C语言的除法是小数直接丢弃,不存在四舍五入吧。应该是99/4=24和(99+2)/4=25这种区别。
    而就这里频率设11059200而言,除以115200,正好等于96,加不加2 除以4,结果也都是24,仿真也验证了。应该是其他频率时产生99/4和101/4这种区别。
    如我说的不对,请大家帮忙指正,谢谢!另外,如能更进一步解释一下这是怎么来的,就更感谢了!


    回复 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    587

    回帖

    1301

    积分

    荣誉版主

    积分
    1301
    发表于 2024-2-22 13:03:37 | 显示全部楼层
    本帖最后由 tzz1983 于 2024-2-22 14:01 编辑

    (65536 - (FOSC / 115200+2) / 4)    // 加2后跟除4, 实际上就是+0.5 => (65536 -  ( (FOSC / 115200) / 4  +0.5 )  )  提前加2是为了计算顺序时不被提前舍去

    // 如果  ((FOSC / 115200) / 4)  结果的余数大于0.5, 则加0.5后取整时自动进1, 否则加了0.5也凑不齐1,取整时自动舍去了,
      
    所以这就是4舍5入

    以你的例举的数据来说, 99除4  = 24.75  取25比取24合理   实际上(99+2)/4  =25  余0.25舍去, 验证结果正确






    回复 支持 1 反对 0 送花

    使用道具 举报

    该用户从未签到

    565

    主题

    9934

    回帖

    1万

    积分

    管理员

    积分
    14430
    发表于 2024-2-22 14:47:19 | 显示全部楼层
    神来之笔,醉了,爱了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 136 天

    [LV.7]常住居民III

    11

    主题

    659

    回帖

    1187

    积分

    金牌会员

    积分
    1187
    发表于 2024-2-22 14:48:41 | 显示全部楼层
    以前写汇编时用过,加上除数的一半再除即可实现四舍五入的效果,具体原理可以参考楼上所说,稍微琢磨一下就明白了。或者你用加5后除以10来算更容易理解:
    (0+5)//10=0
    (1+5)//10=0
    (2+5)//10=0
    (3+5)//10=0
    (4+5)//10=0
    (5+5)//10=1
    (6+5)//10=1
    (7+5)//10=1
    (8+5)//10=1
    (9+5)//10=1
    (10+5)//10=1
    (11+5)//10=1
    (12+5)//10=1
    (13+5)//10=1
    (14+5)//10=1
    (15+5)//10=2
    回复 支持 2 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 161 天

    [LV.7]常住居民III

    11

    主题

    91

    回帖

    444

    积分

    中级会员

    积分
    444
     楼主| 发表于 2024-2-22 16:13:44 | 显示全部楼层
    谢谢楼上几位朋友的讲解,说加0.5我就明白了。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 10:17
  • 签到天数: 201 天

    [LV.7]常住居民III

    12

    主题

    359

    回帖

    1286

    积分

    金牌会员

    积分
    1286
    发表于 2024-2-22 16:37:42 | 显示全部楼层
    还能这样搞,学习了学习了
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-6-14 14:18 , Processed in 0.063083 second(s), 48 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表