OpenEdv-开源电子网

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

STM32F4浮点运算出错

[复制链接]

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
发表于 2018-11-2 14:38:23 | 显示全部楼层 |阅读模式
5金钱
单片机型号:STM32F415VGT6
我在程序中定义了一个u32类型的变量 a,然后通过串口给 a 一个值,然后在单片机中计算a/225000.0得到一个浮点数,但是这个浮点数比实际值大了1.8,也就是当 a 的值为12640500时,计算器算出来应该是56.18,但是单片机算出来是57.97..... 。这是为什么?我用 a 除以200000.0,218180.0,220000.0都没出现这样的情况,值都是比较准确的;只要除以225000.0就会出错。于是我打算在相除后直接减去多余的1.8,像这样(a/225000.0) - 1.8;但是结果还是57.97..... ,也就是减去1.8没起作用,根本就没做这个运算。实在是搞不懂了。

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

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
发表于 2018-11-2 16:20:26 | 显示全部楼层
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-11-2 16:24:13 | 显示全部楼层

汇编看不懂
回复

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
发表于 2018-11-2 16:46:45 | 显示全部楼层

看不懂没救,毕竟c不是u最终执行的东西,所以这种东西只有看汇编...
回复

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
发表于 2018-11-2 16:52:40 | 显示全部楼层
还有你确定一下a的值...说实话不应该这么大误差...
回复

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
发表于 2018-11-2 16:53:14 | 显示全部楼层
顺便可能的话把这段c贴出来看看...
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-11-2 18:02:44 | 显示全部楼层
sppz 发表于 2018-11-2 16:53
顺便可能的话把这段c贴出来看看...

a的值是正确的,就是如下程序的freq_val。
if((((freq_val%200000) > 10000)&&((freq_val%200000) < 40000))
           ||(((freq_val%200000) > 60000)&&((freq_val%200000) < 90000))
           ||(((freq_val%200000) > 110000)&&((freq_val%200000) < 140000))
           ||(((freq_val%200000) > 160000)&&((freq_val%200000) < 190000))
          )                           
        {
                LO1_Ref_Set(0x01);
                fpd = 0x00251C;                                    
                div = freq_val/200000.0;          //这里计算正确
        }
        else if((((freq_val%220000) > 10000)&&((freq_val%220000) < 45000))
                        ||(((freq_val%220000) > 65000)&&((freq_val%220000) < 100000))
                        ||(((freq_val%220000) > 120000)&&((freq_val%220000) < 155000))
                        ||(((freq_val%220000) > 125000)&&((freq_val%220000) < 210000))
                   )
        {
                LO1_Ref_Set(0x02);
                fpd = 0x00259C;
                div = freq_val/220000.0;          //这里也计算正确
        }
        else if((((freq_val%218180) > 10000)&&((freq_val%218180) < 44545))
                        ||(((freq_val%218180) > 64545)&&((freq_val%218180) < 99090))
                        ||(((freq_val%218180) > 119090)&&((freq_val%218180) < 153635))
                        ||(((freq_val%218180) > 173635)&&((freq_val%218180) < 208180))
                   )
        {
                LO1_Ref_Set(0x03);
                fpd = 0x00259C;
                div = freq_val/218180.0;          //这里也计算正确
        }
        else
        {
                LO1_Ref_Set(0x04);
                fpd = 0x00259C;
                div = freq_val/225000.0;            //就是这里计算出错
        }
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2018-11-7 16:14:15 | 显示全部楼层
建议把数据类型强制转换一下
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-10-18
在线时间
19 小时
发表于 2018-11-7 17:01:56 | 显示全部楼层
午夜狼嚎 发表于 2018-11-2 18:02
a的值是正确的,就是如下程序的freq_val。
if((((freq_val%200000) > 10000)&&((freq_val%200000) < 400 ...

Hello

//=====================//
u32 a;
a = 12640500;
a = (a/225000.0)*100;
printf("%d",a);
//=====================//

我用上方編碼去算,出來是5816喔,
所以我猜可能是你的"div"變數,但因你沒貼這個變數的定義,就留給你當參考方向了。
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-11-8 09:13:44 | 显示全部楼层
Electronic 发表于 2018-11-7 16:14
建议把数据类型强制转换一下

试过了的,不行
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-11-8 09:14:17 | 显示全部楼层
NickWu 发表于 2018-11-7 17:01
Hello

//=====================//

好的,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 09:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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