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

[复制链接]
 楼主| 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
定点数可以很方便的代表有小数点的数,只需要明白运算后结果的小数点位置变化。
老鱼探戈 发表于 2010-10-27 12:16 | 显示全部楼层
LZ用的什么IC    内存变化也太大了。
yx331447791 发表于 2010-10-27 12:21 | 显示全部楼层
可以试试换个编译器,编译器会用算法优化这种方面的计算
 楼主| areshan 发表于 2010-10-27 13:51 | 显示全部楼层
用的是AVR8 ,编译器是ICC的!!!
 楼主| areshan 发表于 2010-10-27 13:53 | 显示全部楼层
这样做能比浮点数快吗????你用那么多除法,估计也不会比浮点数运算快!!! 4# wh6ic
wh6ic 发表于 2010-10-27 15:21 | 显示全部楼层
本帖最后由 wh6ic 于 2010-10-27 15:25 编辑

65536 = 2^16,小数点移位或者简单丢弃后两个字节就行,无需任何计算,仅需你脑子里记住。同理除128 = 乘2 除 256,左移一位丢一字节。
全面考虑前后运算、小数点位置,可能可以取消除128,取决于你的数学模型设计。
 楼主| areshan 发表于 2010-10-27 16:25 | 显示全部楼层
谢谢你,还是不太明白。。。我在想想! 9# wh6ic
波波来了哦 发表于 2010-10-27 20:26 | 显示全部楼层
浮点运算并不是单片机的强项,8位单片机只有8位的运算的能力,一般C语言处理浮点运算是用4个字节来替代一个浮点数的,LZ可以试试汇编,书上讲的都是3个字节替代一个浮点数。不用浮点数运算又要实现浮点运算,我有个办法,只能编个表了,不过你的表要64K了,哈哈
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...
shell.albert 发表于 2010-10-28 11:01 | 显示全部楼层
我写程序时尽量不用浮点数,由于不是很精确也没事,我使用的是移位操作。这样应该比浮点运算快多了吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

728

帖子

0

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