数码之家

 找回密码
 立即注册
搜索
查看: 1183|回复: 6

[STM] 发现IAR编译器运算浮点数时为什么变量数值不对总带个尾巴

[复制链接]
发表于 2023-1-27 22:34:26 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
STM32最近用到小数,发现IAR编译器运算浮点数时为什么float变量数值不对总带个尾巴,网上只查到printf函数不能输出浮点数,没说变量数值就不对的

Snipaste_2023-01-27_22-13-04.png

循环多次累加后,会影响精度,咋设置去除小数后边的尾巴啊,
003.png



发表于 2023-1-28 09:35:28 | 显示全部楼层
哪个编译器都一样吧。这是小数在计算机系统里的表示方法。
回复 支持 反对

使用道具 举报

发表于 2023-1-28 10:51:34 | 显示全部楼层
如果只要保留2位,那你就放大100倍当long计算不就行了。
回复 支持 反对

使用道具 举报

发表于 2023-1-28 13:26:37 | 显示全部楼层
这是浮点数表示方法和位数导致的,编译器使用IEEE754标准处理浮点数,微软文档描述浮点数表示方法:
“值”存储格式
单精度 (single-precision)符号位,8 位指数,23 位有效数
双精度符号位,11 位指数,52 位有效数

IEEE754标准浮点数存储转换可以在这个网站在线转换
https://www.binaryconvert.com/convert_float.html

以12.1为例,
float型转换值=0x4141999A,值≈1.21000003814697265625E1=12.1000003814697265625
double型转换值=0x4028333333333333,值≈1.20999999999999996447286321199E1=12.0999999999999996447286321199
转换结果都不等于12.1。

Keil MDK编译结果
Keil_MDK_Test-03.png Keil_MDK_Test_V2-01.png
从编译结果看,浮点数已正确按标准转换。

用Visual Studio编译相同的程序,结果比较接近12.1,查看内存发现,其转换精度比Keil AC5编译器更高,float型使用64位存储,double型使用128位存储。
VS2010_Test-03.png VS2010_Test_V2-01.png

本以为精度高是因为64位系统的原因,在Windows XP + VC6环境测试发现,早就是这个精度了,可能PC软件的编译器都是这个转换精度。
VC6_Test.png


回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-2-17 21:20:06 来自手机浏览器 | 显示全部楼层
mmxx2015 发表于 2023-1-28 13:26
这是浮点数表示方法和位数导致的,编译器使用IEEE754标准处理浮点数,微软文档描述浮点数表示方法:



keil不存在浮点数计算错误,IAR就会出错,不知咋回事
回复 支持 反对

使用道具 举报

发表于 2023-2-17 21:39:53 | 显示全部楼层
dcdzwx 发表于 2023-2-17 21:20
keil不存在浮点数计算错误,IAR就会出错,不知咋回事

应该不存在这个问题,观察窗口中显示的值是近似值,近似值的显示方法看IDE的喜好。
你可以看看变量的原始值,比如我的前两张截图的变量c、d以混合方式显示,左边是原始值,右边的小数是近似值,也可以在memory窗口中输入变量地址就可以显示变量的原始值。

回复 支持 反对

使用道具 举报

发表于 2023-2-18 10:24:13 | 显示全部楼层
mmxx2015 发表于 2023-1-28 13:26
这是浮点数表示方法和位数导致的,编译器使用IEEE754标准处理浮点数,微软文档描述浮点数表示方法:

这个回复是最专业的,表示方法就决定了float型变量存在尾巴,我以前做PLC项目也发现这样的问题,不过一般浮点数取到小数点后3位就够用了。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-28 22:17 , Processed in 0.140400 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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