OpenEdv-开源电子网

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

STM32F103ZET6开发板测试程序 float 输出异常

[复制链接]

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2019-4-13
在线时间
34 小时
发表于 2020-6-24 17:46:13 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 hyuxi2005 于 2020-6-24 18:07 编辑

keil版本 5
cpu: STM32F103ZET6
程序:
int main(void)
{        
        float f_a = 1.1f;
        delay_init();         
        uart_init(115200);
         
        while(1)
        {
                f_a += 0.1f;
                printf("f_a = %f\r\n", f_a);
                delay_ms(1000);                                                                                                                                                   
        }   
}

本意输出
1.200000
1.300000
1.400000
直到
2.600000
再加0.1f 输出为
2.799999

一开始发现此现象实在ucos任务里,各方查找 有说堆栈8字节对齐问题,有说f103没有浮点计算单元的。既如此回归到最简化的环境,在原子哥的led示例程序改动如上测试截图



fb.png
fa.png

最佳答案

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

这不是异常,是正常的。float和double浮点数的表示范围不同,在一般系统中float 在内存中占4个字节,提供7位有效数字,而double占8八个字节,提供15-16位有效数字,数值的范围因编译器不同而不同。因此,你例程中2.799999和2.800000是相等的数值,在MCU中二者的浮点数编码是一样的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2020-6-19
在线时间
11 小时
发表于 2020-6-24 17:46:14 | 显示全部楼层
这不是异常,是正常的。float和double浮点数的表示范围不同,在一般系统中float 在内存中占4个字节,提供7位有效数字,而double占8八个字节,提供15-16位有效数字,数值的范围因编译器不同而不同。因此,你例程中2.799999和2.800000是相等的数值,在MCU中二者的浮点数编码是一样的。
回复

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2019-4-13
在线时间
34 小时
 楼主| 发表于 2020-6-24 17:49:05 | 显示全部楼层
float变成double,并且把小数后面的f去掉,计算与输出都是对的。这个问题怎么解决
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-6-24 19:09:22 | 显示全部楼层
正常现象
回复

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2019-4-13
在线时间
34 小时
 楼主| 发表于 2020-6-24 19:50:55 | 显示全部楼层

什么原因呢?
经过测试
printf("f_a = %.4f\r\n", f_a); // 2.79999没有了,输出正常
printf("f_a = %.5f\r\n", f_a); // 2.79999没有了,输出正常
printf("f_a = %.6f\r\n", f_a);// 2.79999出现了,输出不正常
我理解float精度确保小数点后四位,用于人类阅读可以满足日常多数需求。

到底是为什么呢?有谁清楚愿闻其详
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-6-25 00:40:23 | 显示全部楼层
你想深究就得去研究float在mcu内部存储的形势,决定了他是有精度范围的。
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-6-26 18:11:30 | 显示全部楼层
用sprintf函数格式化一下试试
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 18:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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