stm32 浮点数问题

http://www.openedv.com/posts/list/40175.htm

由于我后面的课题需要涉及较多的浮点运算,只熟悉f103,它不带FPU,所以软件浮点算法就显得很重要了。这几天在做些小研究和测试。
今天又仔细研读了谭浩强的C语言书的数据类型章节,上面有说到c编译系统总将float类型转换成double类型来进行浮点运算,然而一般应用中7位有效数字的占32位的float类型已基本满足需求,若转为16位有效数字64位double类型岂不是没什么必要?速度岂不是会降低?
今天将原子哥的内部温度传感器实验的浮点运算的代码作了个小小的改动,却是大大的改善,结果如下:
温度计算公式原代码为: temp=(1.43-temp)/0.0043+25; // 这句产生的代码量为1584字节
改为单精度: temp=(1.43f-temp)/0.0043f+25; //这句产生的代码量仅为40字节!
代码量减为原来的1/40,单从这个角度来看的话意味着计算速度有接近40倍的提升!!!具体速度未测试,但数十倍的提升应该有的。
哦,尼玛!太兴奋了!
可能有些同学还不知道1.43f的用法,c语言书中说了这是将浮点常量指定为单精度,若不加后缀f,将作双精度来处理。
速度能提升这么多,我想部分原因是因为stm32是32位的MCU,32位及其以下的数据处理时间差别不大,但对于大于32位的64位double类型肯定慢很多了~
欢迎验证~~~

呵呵,不错,楼主一定收获很大吧,这种用法我都用了几年了,其实,C语言里面数据处理很重要的,但也是C语言基础,其实不仅仅是这些,还有很多细要注意的,我也分享一下曾经写过的一个函数,里面就有这样的方法:

//  ------------------------------------------------------------------------  
//  
//  
void calcPTMS5541(float *pressure, float *temperature,u32 *p0, u32 *p1) 
{ 
        float dt, off, sens; 
        *p0 = *p0 & 0xFFFF; 
        *(p0+1) = *(p0+1) & 0xFFFF; 
        dt = -10000.0f + *(p0+1) - (8.0f * (*(p1+8))); 
        off = 10000.0f + (*(p1+5)) + ( ( ( *(p1+7)-250.0f) * dt ) / 4096.0f); 
        sens = 3000.0f + (*(p1+4) / 2.0f) + ( ( ( *(p1+6)+200.0f) * dt ) / 8192.0f); 
        if(pressure!=NULL) 
                *pressure = 1000.0f + (( sens * (*p0- off)) / 4096.0f);   
        if(temperature!=NULL) 
        { 
                if(dt<0.0f) 
                {  
                        dt=dt-(dt/128*dt/128)/2; 
                } 
                else 
                {  
                        dt=dt-(dt/128*dt/128)/8; 
                } 
                *temperature = ( 200.0f + (( dt * ( *(p1+9)+100.0f) ) / 2048.0f)) / 10.0f;  
        } 
}
  • 17
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值