搜索
bottom↓
回复: 13

单片机程序中的除法问题

[复制链接]

出0入0汤圆

发表于 2013-1-29 07:19:35 | 显示全部楼层 |阅读模式
在看一个产品的源程序,原作者很多地方用了除法, (int) x/18000,  (unsigned int) y /36 ....

看程序,原作者应该是个比较高手的程序员了,但是,他为何要用这么多除法,而不用移位来优化呢?

原单片机中并没有除法器。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-1-29 08:19:02 | 显示全部楼层
实现正确功能为先;优化不是时时需要的东西。

出0入0汤圆

发表于 2013-1-29 08:26:56 | 显示全部楼层
(int) x/18000这怎么移位?除非除数是2的几次方,否则是很难的,最多不过是近似值。

出0入4汤圆

发表于 2013-1-29 09:38:07 | 显示全部楼层
同意2楼。
写程序如果资源足够的情况下,就不用想着优化了。
在资源足够的情况下,首先要做的是程序的正确性,然后再考虑方便维护和修改。

程序里面使用除法,是调用库来实现的,这部分是通用的,即除法部分库只存在一份,其他地方的除法都是调用,不会占用太多空间的。

出0入0汤圆

发表于 2013-1-30 10:49:53 | 显示全部楼层
建议了解一下浮点运算就知道为什么不能这么做了。很多情况是除不尽,那内存能存得下嘛??比如1除3.然后在去乘3,计算机永远也得不到1了,只能是无穷接近于1.这叫精度问题

出0入0汤圆

 楼主| 发表于 2013-1-30 11:29:33 | 显示全部楼层
XA144F 发表于 2013-1-29 08:26
(int) x/18000这怎么移位?除非除数是2的几次方,否则是很难的,最多不过是近似值。 ...

但是单片机的除法本来就是近似值吧

出0入0汤圆

 楼主| 发表于 2013-1-30 11:30:06 | 显示全部楼层
lpc1788 发表于 2013-1-30 10:49
建议了解一下浮点运算就知道为什么不能这么做了。很多情况是除不尽,那内存能存得下嘛??比如1除3.然后在去 ...

你想说明什么?我的例子是整数除法啊

出0入0汤圆

发表于 2013-1-30 11:33:12 | 显示全部楼层
lpc1788 发表于 2013-1-30 10:49
建议了解一下浮点运算就知道为什么不能这么做了。很多情况是除不尽,那内存能存得下嘛??比如1除3.然后在去 ...

哈哈,微软的计算器程序已经可以1除3后,再乘3等于1了。

出0入4汤圆

发表于 2013-1-30 11:38:20 | 显示全部楼层
编译器会替你去优化的,不用担心

出0入0汤圆

发表于 2013-1-30 16:31:18 | 显示全部楼层
cestregle 发表于 2013-1-30 11:29
但是单片机的除法本来就是近似值吧

不但单片机,就是我们的PC也是一样的,只有精确到小数后面几万位或几千位。

出0入0汤圆

发表于 2013-1-30 16:31:54 | 显示全部楼层
KongQuan 发表于 2013-1-30 11:33
哈哈,微软的计算器程序已经可以1除3后,再乘3等于1了。

那是因为你程序里面做了舍入的处理,如果不做你看看会嘛???

出0入0汤圆

 楼主| 发表于 2013-1-30 20:23:15 | 显示全部楼层
这套源程序中有些是很有趣的。他的FOR循环,用的也很有意思,我是第一次遇到。
他是这样:
for (i=1; i<16; i++)
{ 赋值给某数租1}
for (i=1; i<16; i++)
{ 赋值给某数租2}

....
for (i=1; i<16; i++)
{ 赋值给某数租8}

不知道这样是何用意,为何不用一个FOR,多个并行的FOR,有什么好处呢?

出0入0汤圆

发表于 2013-1-31 05:14:37 | 显示全部楼层
cestregle 发表于 2013-1-30 20:23
这套源程序中有些是很有趣的。他的FOR循环,用的也很有意思,我是第一次遇到。
他是这样:
for (i=1; i ...

一般懂汇编,并有优化强迫症的人都是这么写:

do {

。。。。

}while (i--);

虽然现在的编译器多半能直接帮你把for之类的统统优化了。。。。

用多个for,如果每个循环的次数是由宏定义决定的,那也无可厚非,反正资源不吃紧,这样分开写也方便以后改参数。

用i=1开始,我觉得很多写C的人是无法忍受的,应该大家都习惯i=0吧?。。。这个变来变去不好,边界是bug的重要来源。。。。

出0入42汤圆

发表于 2013-1-31 07:58:56 | 显示全部楼层
cestregle 发表于 2013-1-30 20:23
这套源程序中有些是很有趣的。他的FOR循环,用的也很有意思,我是第一次遇到。
他是这样:
for (i=1; i ...

这样做在较大的数组赋值时会速度快一点,因为每个数据的地址只是初始化计算一次,然后是加一即可。若在同一for中,由每一次赋值的操作,都要对各个数组数据的地址计算一次,运算量大一点点。你可以看产生的汇编源码。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-29 20:04

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

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