打印

单片机浮点数的处理!!!

[复制链接]
13839|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
areshan|  楼主 | 2010-10-27 09:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在用单片机,要计算像是n=0.005893*x;(1<x<65536)这样的计算,用C可以直接写,但是还耗单片机空间,原来是33%,有这样4个浮点数计算就上升到55%了,而且我还发现单片机反应变慢了,需不需要在计算浮点数是把中断给关掉????????怎样能够不用浮点数计算呢???????

相关帖子

沙发
ayb_ice| | 2010-10-27 09:24 | 只看该作者
一次浮点运算一般在2000左右的周期(8051),标准也就2~3个MS,一般应用是没有问题的

使用特权

评论回复
板凳
areshan|  楼主 | 2010-10-27 09:32 | 只看该作者
谢谢ayb_ice,明白! 2# ayb_ice

使用特权

评论回复
地板
wh6ic| | 2010-10-27 12:01 | 只看该作者
0.005893 = 0.005893 * 65536 * 256 / 65536 / 256
                = 98868.133888 / 65536 / 256
                = 49434.066944 / 65536 / 128
用49434 * x,得到的32Bit整数结果小数点位置在D22、D23之间t。比如 x = 10000,乘49434 = 0x1D7707A0, 0x1D77 / 128 =  0x3A.EE = 58.9297
定点数可以很方便的代表有小数点的数,只需要明白运算后结果的小数点位置变化。

使用特权

评论回复
5
老鱼探戈| | 2010-10-27 12:16 | 只看该作者
LZ用的什么IC    内存变化也太大了。

使用特权

评论回复
6
yx331447791| | 2010-10-27 12:21 | 只看该作者
可以试试换个编译器,编译器会用算法优化这种方面的计算

使用特权

评论回复
7
areshan|  楼主 | 2010-10-27 13:51 | 只看该作者
用的是AVR8 ,编译器是ICC的!!!

使用特权

评论回复
8
areshan|  楼主 | 2010-10-27 13:53 | 只看该作者
这样做能比浮点数快吗????你用那么多除法,估计也不会比浮点数运算快!!! 4# wh6ic

使用特权

评论回复
9
wh6ic| | 2010-10-27 15:21 | 只看该作者
本帖最后由 wh6ic 于 2010-10-27 15:25 编辑

65536 = 2^16,小数点移位或者简单丢弃后两个字节就行,无需任何计算,仅需你脑子里记住。同理除128 = 乘2 除 256,左移一位丢一字节。
全面考虑前后运算、小数点位置,可能可以取消除128,取决于你的数学模型设计。

使用特权

评论回复
10
areshan|  楼主 | 2010-10-27 16:25 | 只看该作者
谢谢你,还是不太明白。。。我在想想! 9# wh6ic

使用特权

评论回复
11
波波来了哦| | 2010-10-27 20:26 | 只看该作者
浮点运算并不是单片机的强项,8位单片机只有8位的运算的能力,一般C语言处理浮点运算是用4个字节来替代一个浮点数的,LZ可以试试汇编,书上讲的都是3个字节替代一个浮点数。不用浮点数运算又要实现浮点运算,我有个办法,只能编个表了,不过你的表要64K了,哈哈

使用特权

评论回复
12
wh6ic| | 2010-10-28 09:49 | 只看该作者
1,000,000,000 = 0x3B9A CA00, 20,000 = 0x4E20, 50,000 = 0xC350。 定点运算中小数点在最后面的很容易理解,比如前面几个数: 0x4E20 * 0xC350 = 0x3B9A CA00,也就是2万乘5万等于10亿;
乘数各缩小100倍,十进制也好理解:200.00 * 500.00 = 100,000.0000,十六进制麻烦点:0xC8.00 * 0x1F4.00 = 0x186A0.0000;
如果各缩小256倍,十六进制就比十进好理解:0x4E.20 * 0xC3.50 = 0x3B9A.CA00, 78.125 * 195.3125 = 15,258.7890625,
78 = 0x4E, 195 = 0xC3; 0.125 = 2/16 = 0x0.2 = 0x0.20, 0.3125 = 0.625 / 2 = 5/16 = 0x0.5 = 0x0.50,这就是定点小数的运算和小数点位置变化,于十进制的其实是一样的。
你的0.005893 = 0x0.0182 3422...,取前24Bit = 0x0182 34,除2为:0xC11A = 49434,分辨率为15Bit,有效位数高于你的万分之一;
另外十进制小数转为十六进制有个办法,电脑的计算器中科学计算器功能中有十六进转十进,先十进制下输入小数,然后每乘一次65536,得到小数点后16Bit, 0.005893 *65536 -> 386.203648  -> * 65536 -> 25,310,242.275328 .= 0x0182 3422. 467B...

使用特权

评论回复
13
shell.albert| | 2010-10-28 11:01 | 只看该作者
我写程序时尽量不用浮点数,由于不是很精确也没事,我使用的是移位操作。这样应该比浮点运算快多了吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

728

帖子

0

粉丝