6914|10

3404

帖子

6

TA的资源

裸片初长成(初级)

楼主
 

430计算64位乘除法问题 [复制链接]

用430算了一个64位除以16位的除法,发现代码一下增加了好多哦。没有加加这个除法之前代码长度为0x614,加了之后变成了0x1556.原因大概知道,应该是调用了库函数,可是增加的也太多了吧。
看《MCU工程师炼成记》上说为了降低功耗,应该尽量的少用浮点运算,所以才用的定点运算,为了保证不丢精度,用的64位的。
但是如果代码这么长,执行起来也会很费劲吧。


大家遇到这种情况下一般怎么办啊。我现在是用外部传感器读一个16位的温湿度数据,要做除法得出实际温度值和湿度值,用浮点运算好还是定点的,如果是定点的有没有其他办法。或者自己写除法函数等。

最新回复

本帖最后由 jishuaihu 于 2015-8-13 08:36 编辑 怎么解决的~ 最后不用64位乘法了呗,没有找到根本原因,应该是调用了库函数导致的!   详情 回复 发表于 2015-8-12 13:56
 
点赞 关注

回复
举报

103

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
闂傚倷绀侀幖顐ゆ偖椤愶箑纾块柛鎰嚋閼板潡鏌涘☉娆愮稇閻庢艾顦伴妵鍕箳閸℃ぞ澹曠紓鍌欑劍椤ㄥ棝鏁冮姀鐘垫殾婵°倕鎳庢儫闂佸疇妗ㄧ粈浣规叏閵堝鐓熼柣姗€浜跺鐑芥煕閺傝法绠绘い銏$懇楠炲鏁傞懞銉︾彨闁诲骸鍘滈崑鎾绘煕閹邦厼鍔ゆ繛鍫嫹闂傚倷娴囬惃顐﹀幢閳轰焦顔勭紓鍌氬€哥粙鍕箯閿燂拷闂傚倷鑳堕幊鎾绘偤閵娾晜鍋嬮柣鎰惈閻掑灚銇勯幒鎴敾閻庢熬鎷�濠电姷鏁搁崑娑⑺囬銏犵鐎光偓閸曨偉鍩為梺璺ㄥ櫐閹凤拷
 
 

回复

449

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
只是说尽量不用而已,下面是一个64位除以32位的无符号计算程序,你参考一下。比较一下直接用浮点数哪个运行更快,想要省电,就选那个运行最快的,而不是看代码量的多少。另外,你的16位数据要做什么处理?32位的范围还不够?

一个用减法和移位完成的除法
uint32 div(uint64 s,uint32 z) //return u/z         
{
    uint32 x=(uint32)(s>>32);         
    uint32 y=(uint32)s;          //y保存商 x保存余数         
    for (int i=0;i<32;++i)         
    {
        uint32 t=((int32)x) >> 31;               
        x=(x<<1)|(y>>31);              
        y=y<<1;              
        if ((x|t)>=z)              
        {
            x-=z;                  
            ++y;              
        }         
    }
    return y;      
}

 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

板凳
 
本帖最后由 jishuaihu 于 2015-5-19 13:21 编辑

这个是参考例程中的计算方法:humidityPercent = (double)temperature[1] / (16384-1) * 100;temperature[1]是16位的。实际可能是8位,10位,12位或者14位。除以14位的数。按说32位也够用了。


刚才又看一下资料。感觉例程这样写是为了跟公式的过程一模一样。先算乘法用32位数据就够了。精度也可可以满足了

humidityPercent = (double)temperature[1] / (16384-1) * 100;

改成

humidityPercent = (double)temperature[1] *100/ (16384-1) ;



不过应该讨论一下为什么调用库函数的时候一下增加了这么多代码。

点评

即便你的temperature是16位的,在32位数据下还有16位剩余,也就是说temperature最大可以剩以65535,这比100可大多了。 至于调用库函数增加这么多代码,没什么好讨论的。库函数代码不是集成在硬件芯片里面的,  详情 回复 发表于 2015-5-19 13:39
 
 
 

回复

449

帖子

0

TA的资源

纯净的硅(中级)

4
 
jishuaihu 发表于 2015-5-19 13:15
这个是参考例程中的计算方法:humidityPercent = (double)temperature[1] / (16384-1) * 100;temperature[1]是16位的。实际可能是8位,10位,12位或者14位。除以14位的数。按说32位也够用了。


刚才又看一下资料。感觉例程这样写是为了跟公式的过程一模一样。先算乘法用32位数据就够了。精度也可可以满足了

humidityPercent = (double)temperature[1] / (16384-1) * 100;

改成

humidityPercent = (double)temperature[1] *100/ (16384-1) ;



不过应该讨论一下为什么调用库函数的时候一下增加了这么多代码。

即便你的temperature是16位的,在32位数据下还有16位剩余,也就是说temperature最大可以剩以65535,这比100可大多了。



至于调用库函数增加这么多代码,没什么好讨论的。库函数代码不是集成在硬件芯片里面的,而是由编译器厂商编写代码编译形成的,你也可以编写自己的库函数。而且很多库函数还调用了其他库函数,这样所有用到的库函数都会被编译进来。

点评

我的意思是怀疑调用64位除法的时候包含进来其他的文件了,否则就一个除法运行就占用3K多的空间啊?这一点希望得到确认。  详情 回复 发表于 2015-5-19 14:46
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

5
 
Aragorn 发表于 2015-5-19 13:39
即便你的temperature是16位的,在32位数据下还有16位剩余,也就是说temperature最大可以剩以65535,这比100可大多了。



至于调用库函数增加这么多代码,没什么好讨论的。库函数代码不是集成在硬件芯片里面的,而是由编译器厂商编写代码编译形成的,你也可以编写自己的库函数。而且很多库函数还调用了其他库函数,这样所有用到的库函数都会被编译进来。

我的意思是怀疑调用64位除法的时候包含进来其他的文件了,否则就一个除法运行就占用3K多的空间啊?这一点希望得到确认。
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

6
 
进入调试,看看算这个除法的时候执行了什么指令,不就知道有没有包含进其他文件咯
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

7
 
闂傚倷绀侀幖顐ゆ偖椤愶箑纾块柛鎰嚋閼板潡鏌涘☉娆愮稇閻庢艾顦伴妵鍕箳閸℃ぞ澹曠紓鍌欑劍椤ㄥ棝鏁冮姀鐘垫殾婵°倕鎳庢儫闂佸疇妗ㄧ粈浣规叏閵堝鐓熼柣姗€浜跺鐑芥煕閺傝法绠绘い銏$懇楠炲鏁傞懞銉︾彨闁诲骸鍘滈崑鎾绘煕閹邦厼鍔ゆ繛鍫嫹闂傚倷娴囬惃顐﹀幢閳轰焦顔勭紓鍌氬€哥粙鍕箯閿燂拷闂傚倷鑳堕幊鎾绘偤閵娾晜鍋嬮柣鎰惈閻掑灚銇勯幒鎴敾閻庢熬鎷�濠电姷鏁搁崑娑⑺囬銏犵鐎光偓閸曨偉鍩為梺璺ㄥ櫐閹凤拷
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

8
 
闂傚倷绀侀幖顐ゆ偖椤愶箑纾块柛鎰嚋閼板潡鏌涘☉娆愮稇閻庢艾顦伴妵鍕箳閸℃ぞ澹曠紓鍌欑劍椤ㄥ棝鏁冮姀鐘垫殾婵°倕鎳庢儫闂佸疇妗ㄧ粈浣规叏閵堝鐓熼柣姗€浜跺鐑芥煕閺傝法绠绘い銏$懇楠炲鏁傞懞銉︾彨闁诲骸鍘滈崑鎾绘煕閹邦厼鍔ゆ繛鍫嫹闂傚倷娴囬惃顐﹀幢閳轰焦顔勭紓鍌氬€哥粙鍕箯閿燂拷闂傚倷鑳堕幊鎾绘偤閵娾晜鍋嬮柣鎰惈閻掑灚銇勯幒鎴敾閻庢熬鎷�濠电姷鏁搁崑娑⑺囬銏犵鐎光偓閸曨偉鍩為梺璺ㄥ櫐閹凤拷
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

9
 
闂傚倷绀侀幖顐ゆ偖椤愶箑纾块柛鎰嚋閼板潡鏌涘☉娆愮稇閻庢艾顦伴妵鍕箳閸℃ぞ澹曠紓鍌欑劍椤ㄥ棝鏁冮姀鐘垫殾婵°倕鎳庢儫闂佸疇妗ㄧ粈浣规叏閵堝鐓熼柣姗€浜跺鐑芥煕閺傝法绠绘い銏$懇楠炲鏁傞懞銉︾彨闁诲骸鍘滈崑鎾绘煕閹邦厼鍔ゆ繛鍫嫹闂傚倷娴囬惃顐﹀幢閳轰焦顔勭紓鍌氬€哥粙鍕箯閿燂拷闂傚倷鑳堕幊鎾绘偤閵娾晜鍋嬮柣鎰惈閻掑灚銇勯幒鎴敾閻庢熬鎷�濠电姷鏁搁崑娑⑺囬銏犵鐎光偓閸曨偉鍩為梺璺ㄥ櫐閹凤拷
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
闂傚倷绀侀幖顐ゆ偖椤愶箑纾块柛鎰嚋閼板潡鏌涘☉娆愮稇閻庢艾顦伴妵鍕箳閸℃ぞ澹曠紓鍌欑劍椤ㄥ棝鏁冮姀鐘垫殾婵°倕鎳庢儫闂佸疇妗ㄧ粈浣规叏閵堝鐓熼柣姗€浜跺鐑芥煕閺傝法绠绘い銏$懇楠炲鏁傞懞銉︾彨闁诲骸鍘滈崑鎾绘煕閹邦厼鍔ゆ繛鍫嫹闂傚倷娴囬惃顐﹀幢閳轰焦顔勭紓鍌氬€哥粙鍕箯閿燂拷闂傚倷鑳堕幊鎾绘偤閵娾晜鍋嬮柣鎰惈閻掑灚銇勯幒鎴敾閻庢熬鎷�濠电姷鏁搁崑娑⑺囬銏犵鐎光偓閸曨偉鍩為梺璺ㄥ櫐閹凤拷
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播 | AI之眼——安森美图像传感器 报名中
直播时间:2025年4月25日(周五)上午10:00-11:30
直播主题:AI之眼——安森美图像传感器
报名观看直播、直播间提问、填写问卷均有机会获得精美礼品!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 4

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表