加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

stm32 浮点数问题

(2015-12-01 19:13:45)
分类: 嵌入式软件
来源于: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;  
        
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有