搜索
bottom↓
回复: 17

keil c51下16位有符号数的四舍五入,有没有高效的程序?

[复制链接]

出90入0汤圆

发表于 2021-9-19 10:08:29 | 显示全部楼层 |阅读模式
单片机就2k FLASH,已经就剩几十个字节了,
keil 5 编译器,16位有符号数的四舍五入,有没有高效的程序?

出0入8汤圆

发表于 2021-9-19 10:25:56 来自手机 | 显示全部楼层
+0.5后取整?

出0入84汤圆

发表于 2021-9-19 10:27:54 | 显示全部楼层
有,讲下原理,程序自己可以编,1X要四舍五入到十位,先定义或转换1X成浮点,然后除10变成1.X,再加上0.5,转换成int,再乘10,四舍五入到其它位依照原理同样操作

出75入90汤圆

发表于 2021-9-19 10:51:22 | 显示全部楼层
不应该是:尾数加5 后去掉尾数嘛 。没法再再简单了吧。
4+5 =9   四舍后=  0
5+5 =10 五入后=10

出90入0汤圆

 楼主| 发表于 2021-9-19 10:52:43 | 显示全部楼层
16位有符号数:
0000~7FFF 表示 0 ~ 32767
8000~FFFF表示 -32766 ~ -1

+0.5 是 小数运算。  
浮点 要链接浮点库,
程序都很大。

出0入475汤圆

发表于 2021-9-19 14:31:06 来自手机 | 显示全部楼层
眼拙没看懂,你是想将16位整数四舍五入?还是将16位整数与额外的小数相加后的结果进行四舍五入得到新的16位整数?
如果前者,彻底看不懂,后者的话,加(减)的小数是哪里来的?得到这个小数是否会吊用浮点运算?

出90入0汤圆

 楼主| 发表于 2021-9-19 14:40:32 | 显示全部楼层
本帖最后由 hzpyl 于 2021-9-19 14:48 编辑
1a2b3c 发表于 2021-9-19 14:31
眼拙没看懂,你是想将16位整数四舍五入?还是将16位整数与额外的小数相加后的结果进行四舍五入得到新的16位 ...


16位有符号数 整数四舍五入,
原理很简单,
主要是,FLASH不够了,有没有高效的程序。

这个是我编的程序:  占162个字节

                        if(temp16 <0x8000)
                        {                        // 正数:四舍五入
                                temp8 = (U8)(temp16%10);
                                temp16 -= temp8;
                                if(temp8 >=5)
                                {
                                        temp16 += 10;
                                }
                        }
                        else
                        {                        // 负数:四舍五入
                                temp8 = (U8)((0 -temp16)%10);
                                temp16 += temp8;
                                if(temp8 >=5)
                                {
                                        temp16 -= 10;
                                }
                        }

出0入0汤圆

发表于 2021-9-19 17:24:57 | 显示全部楼层
取绝对值再加5再送回符号位

出0入84汤圆

发表于 2021-9-19 19:00:34 | 显示全部楼层
hzpyl 发表于 2021-9-19 14:40
16位有符号数 整数四舍五入,
原理很简单,
主要是,FLASH不够了,有没有高效的程序。

不用这么麻烦
temp16+=5;
temp16/=10;
temp16*=10;

出0入475汤圆

发表于 2021-9-19 20:35:43 来自手机 | 显示全部楼层
czzhouyun 发表于 2021-9-19 19:00
不用这么麻烦
temp16+=5;
temp16/=10;

对头就是这么简单快捷。楼主上面那一楼的成了多吃一举,都已经是有符号数了,你还去判断0x8000,为啥不直接>0或者<0判断即可?否则你这个0x8000又会出现有符号数与无符号数之间判断大小的问题。

出90入0汤圆

 楼主| 发表于 2021-9-22 08:06:19 | 显示全部楼层
czzhouyun 发表于 2021-9-19 19:00
不用这么麻烦
temp16+=5;
temp16/=10;

负数不行,
-1 ~ -14 都为0
-15 ~ -24都为-10

出0入84汤圆

发表于 2021-9-22 08:47:24 | 显示全部楼层
hzpyl 发表于 2021-9-22 08:06
负数不行,
-1 ~ -14 都为0
-15 ~ -24都为-10

if(temp16>=0)
        temp16+=5;
else
        temp16-=5;
temp16/=10;
temp16*=10;

出90入0汤圆

 楼主| 发表于 2021-9-22 09:20:04 | 显示全部楼层
czzhouyun 发表于 2021-9-22 08:47
if(temp16>=0)
        temp16+=5;
else

谢谢。
打赏50个。

出0入0汤圆

发表于 2021-9-22 09:51:53 | 显示全部楼层
本帖最后由 haigerl 于 2021-9-22 09:59 编辑

也可以参考浮点数四舍五入表达式2x-(int)(x)来计算

出300入477汤圆

发表于 2021-9-22 10:15:48 来自手机 | 显示全部楼层
haigerl 发表于 2021-9-22 09:51
也可以参考浮点数四舍五入表达式2x-(int)(x)来计算

关键是负数的取余该怎么定义,好像不同的编程语言的规定都是不同的。
比如-7除3余几?
是余2还是余-1 ?
所以楼主的要求只能在自己的编译器上试,或者自己判断负数就转为正数再做。正数除正数的余数定义是唯一的。

出0入0汤圆

发表于 2021-9-22 13:42:55 | 显示全部楼层
可以用10*(x/5-x/10)来计算,不需要判断正负,但需要注意编译器优化。

出0入8汤圆

发表于 2021-9-22 15:44:27 | 显示全部楼层
四舍五入的好算法

出0入10汤圆

发表于 2021-9-22 18:01:46 | 显示全部楼层
  2K  FALSH。  扣空间, 那只能用汇编来对付了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 16:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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