OpenEdv-开源电子网

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

三个浮点数相加不能用吗?a+a+a不行,a+a可以。

[复制链接]

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-12-23 17:27:12 | 显示全部楼层 |阅读模式
1金钱
我在用浮点数,只是个简单的相加或是printf,现在看float a = 1.234;

float b;
b = a+a;
printf("%f",b);
这个是可以的。

但是一旦出现b=a+a+a;或是printf("%f,%d,%d",a,b,c);之类的就不行,因为它是连加或连输出了3个。重点是大于3个就不行了,输出也不对了,算了算不了了。。。为啥呢?

最佳答案

自在随心
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-12-23 17:27:13 | 显示全部楼层
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2016-12-23 17:27:51 | 显示全部楼层
额,不好意思,发错区了,是STM32F407的板子
自在随心
回复

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2013-11-4
在线时间
112 小时
发表于 2016-12-24 14:56:49 | 显示全部楼层
float b, 为啥用%d, printf呢
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5779
金钱
5779
注册时间
2013-11-22
在线时间
1211 小时
发表于 2016-12-24 22:20:37 | 显示全部楼层
设置里面有么有勾选 Use MicroLIB?如果没有,那勾选上试试。
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2016-12-26 09:15:56 | 显示全部楼层
lycreturn 发表于 2016-12-24 22:20
设置里面有么有勾选 Use MicroLIB?如果没有,那勾选上试试。

不行的,勾选上就所有输出都没了。
自在随心
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2016-12-26 09:16:33 | 显示全部楼层
一棵葱 发表于 2016-12-24 14:56
float b, 为啥用%d, printf呢

笔误,都是%f,有时候也用.15%f
自在随心
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2016-12-26 09:22:00 | 显示全部楼层

这几天试了些,a = sin(PI/4) + cos(PI/4) + tan(PI/4) 这三个在一个式子里相加是不行的,但是强制转换成a =(float32_t) sin(PI/4) + (float32_t) cos(PI/4) + (float32_t) tan(PI/4) 就可以了。为什么呢?本身sin不就是支持输出浮点型吗?而且试了一下,a = (float32_t)b + (float32_t)c + (float32_t)也是可以的,但是b c d 本身就是float32_t型的,为什么非要强转一次呢?
printf还是只能打印一个或俩,强转也不行。
自在随心
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2016-12-26 09:26:28 | 显示全部楼层
对了,以上这些个问题应该是和arm_math.h这个库有关,不用它就没事。用math.h没问题。
本想用arm_math.h内部的矩阵运算的,但是矩阵运算精度似乎只能到小数点后7位,不能满足我的精度要求,没办法用。
自在随心
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2908
金钱
2908
注册时间
2016-5-13
在线时间
184 小时
发表于 2016-12-26 10:51:57 | 显示全部楼层
printf输出多个参数的时候有时候确实很奇怪。估计是编译器的问题。你如果用的是keil的话,那么建议你卸载然后重装下keil试试看。
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2908
金钱
2908
注册时间
2016-5-13
在线时间
184 小时
发表于 2016-12-26 10:53:39 | 显示全部楼层
我一般都是用的math.h 这个头文件。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2016-12-26 11:25:41 | 显示全部楼层
电脑小白 发表于 2016-12-26 10:53
我一般都是用的math.h 这个头文件。

应该就是arm_math.h的问题,精度只有32位float,而我所有变量都定义成了double ,所以不管是运算还是输出都挂了。
自在随心
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 05:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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