OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16735|回复: 7

stm32计算浮点数的问题

[复制链接]

6

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2016-1-26
在线时间
51 小时
发表于 2016-5-7 10:49:35 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 望着你发槑 于 2016-5-7 17:46 编辑

昨天看到一个帖子说小数后面加个f就是单精度,大意就是a*1.01是a乘一个双精度的1.01,但是a*1.01f就是a乘单精度的1.01,速度快几十倍。问题:
1.如果我定义了一个float a=1.01(没有f),再a*a,CPU是单精度还是双精度运算?
2.定义a的时候不赋值,后面通过一系列计算比如a=(float)b/c;bc都是整型,强转b成为float,再赋给a,假如结果就是1.01,是双精度的1.01还是单精度的1.01?
3.单精度的数减去一个整型数,系统会不会自动转换类型?
4.突然想到总结性的一个问题,单精度的数与整型数做运算,CPU转换成双精度算还是单精度算?是不是只有一个不带f的立即数小数才转换成双精度?



怎么还没人回答。。。。。。

最佳答案

查看完整内容[请看2#楼]

1. 运算符两侧都是folat,不会转成double,另外,此时1.01和a已经没有任何关系了 2. 自始至终根本没有double的事, 3. 浮点数与整数运算会先把整数转成浮点数再计算,就好比short和int运算时会先把short转成int再计算 4. 究竟会两边都转成双精度还是只把右边转成单精度由编译器决定,这一点可以查一下C语言规范和编译器手册得到答案,另外STM32F103系列没有浮点运算单元,它只能计算整数,所以这一切都跟CPU无关,全都是keil的 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-5-7 10:49:36 | 显示全部楼层
1. 运算符两侧都是folat,不会转成double,另外,此时1.01和a已经没有任何关系了
2. 自始至终根本没有double的事,
3. 浮点数与整数运算会先把整数转成浮点数再计算,就好比short和int运算时会先把short转成int再计算
4. 究竟会两边都转成双精度还是只把右边转成单精度由编译器决定,这一点可以查一下C语言规范和编译器手册得到答案,另外STM32F103系列没有浮点运算单元,它只能计算整数,所以这一切都跟CPU无关,全都是keil的事

以上纯属个人猜测,

keil编译器的手册请点击菜单>>帮助>>μVision Help
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-5-7 22:06:00 | 显示全部楼层
帮顶
回复

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2253
金钱
2253
注册时间
2010-12-16
在线时间
204 小时
发表于 2016-5-8 20:25:51 | 显示全部楼层
xkwy 发表于 2016-5-8 18:42
1. 运算符两侧都是folat,不会转成double,另外,此时1.01和a已经没有任何关系了
2. 自始至终根本没有doub ...

1. 同意 . 另外 , 在现在版本的 Keil 里 , 赋值操作会生成一个 double 转 float 的转换操作 , 而不是内嵌成 float , 所以会花点时间 , 后面的乘法是单精度运算 .

2. 单精度运算 . 假设计算是强制用 double , 那也是除法使用双精度运算 , 算完的结果转换成单精度 .

3. 同意 .
4. 原理上参考 C 语言规范 , 实际上一些规范没有的内容会由各个编译器各自发挥 , 比如第一点 ,  还有一些是由于对规范的支持不完整导致行为差异 , 这个属于 bug , 可以看每个版本的 bugfix , 确认上一个版本存在什么问题 , 或者自己慢慢摸 .

技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

6

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2016-1-26
在线时间
51 小时
 楼主| 发表于 2016-5-9 10:10:31 | 显示全部楼层
谢谢两位
我又测试了一下我的程序,我发现耗时间的大头不在浮点数运算,就不深究这个了
关于第2个小问题,我记得我看过一个流程图
大概是   char、short-->int-->unsigned-->long int-->double<--float
我发现float和整型之间是通过double连接的
所以担心使用double会有浪费
回复

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2253
金钱
2253
注册时间
2010-12-16
在线时间
204 小时
发表于 2016-5-9 10:54:00 | 显示全部楼层
偷偷告诉你 , 测试一下 double 和 float 的运算时间 , 有惊喜哦 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

6

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2016-1-26
在线时间
51 小时
 楼主| 发表于 2016-5-10 09:48:50 | 显示全部楼层
shihantu 发表于 2016-5-9 10:54
偷偷告诉你 , 测试一下 double 和 float 的运算时间 , 有惊喜哦 .

看了帖子
里面说运算float  代码是double的40分之一
回复

使用道具 举报

1

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2015-10-5
在线时间
41 小时
发表于 2018-4-4 14:27:57 | 显示全部楼层
这个帖子顶起来!!!!
天是棺材盖,地是棺材底,无论闯哪里,总在棺材里
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 23:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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