打印

8位机浮点的运算

[复制链接]
1946|13
手机看帖
扫描二维码
随时随地手机跟帖
沙发
cnb12345| | 2016-4-26 16:32 | 只看该作者

使用特权

评论回复
板凳
l科科1987| | 2016-4-26 17:26 | 只看该作者
不要用浮点,尽量用移位操作代替除法

使用特权

评论回复
地板
Dennis-Zhou| | 2016-4-26 19:35 | 只看该作者
给你一段代码看看,8位机的开方
unsigned long sqrt_16(unsigned long M)  
{  
unsigned long N;  
int  i;  
unsigned long tmp, ttp; // 结果、循环计数  
if (M == 0) // 被开方数,开方结果也为0  
return 0;  
N = 0;  
tmp = (M >> 30); // 获取最高位:B[m-1]  
M <<= 2;  
if (tmp > 1) // 最高位为1  
{  
N ++; // 结果当前位为1,否则为默认的0  
tmp -= N;  
}  
for (i=15; i>0; i--) // 求剩余的15位  
{  
N <<= 1; // 左移一位  
tmp <<= 2;  
tmp += (M >> 30); // 假设  
ttp = N;  
ttp = (ttp<<1)+1;  
M <<= 2;  
if (tmp >= ttp) // 假设成立  
{  
tmp -= ttp;  
N ++;  
}  
}  
return N;  
}   

使用特权

评论回复
5
z_no1| | 2016-4-26 20:53 | 只看该作者
要快就别用浮点。查表,移位都行。

使用特权

评论回复
6
playergatsby| | 2016-4-27 15:42 | 只看该作者
一次浮点运算一般在2000左右的周期(8051),标准也就2~3个MS,一般应用是没有问题的

使用特权

评论回复
7
rmbass| | 2016-4-29 16:33 | 只看该作者
用定点数代替浮点数就可以了。

使用特权

评论回复
8
yysforever| | 2016-4-29 18:02 | 只看该作者
可以试试换个编译器,编译器会用算法优化这种方面的计算

使用特权

评论回复
9
喵喵小星人| | 2016-4-29 18:12 | 只看该作者
65536 = 2^16,小数点移位或者简单丢弃后两个字节就行,无需任何计算,仅需你脑子里记住。同理除128 = 乘2 除 256,左移一位丢一字节。
全面考虑前后运算、小数点位置,可能可以取消除128,取决于你的数学模型设计。

使用特权

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

使用特权

评论回复
11
magicoctoy| | 2016-4-30 22:46 | 只看该作者
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...

使用特权

评论回复
12
chrise23| | 2016-4-30 22:48 | 只看该作者
C8051在KEIL、50MHz下的浮点运算速度(理论平均值,不考虑等待):
加:3.46us
减:3.58us
乘:4.5us
除:17.54us

使用特权

评论回复
13
tomyoct| | 2016-4-30 22:54 | 只看该作者
百度搜索下大数定理,可以转换为字符串进行计算,很快的

使用特权

评论回复
14
aqua2013| | 2016-5-2 21:59 | 只看该作者
不如实现实现64位数运算,然后移位将浮点变成整数操作

使用特权

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

本版积分规则

22

主题

224

帖子

1

粉丝