硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1309|回复: 8
收起左侧

[STM32H7] STM32 字符串转浮点型异常

[复制链接]

7

主题

22

回帖

43

积分

新手上路

积分
43
发表于 2022-7-21 15:54:16 | 显示全部楼层 |阅读模式
调用atof()函数进行转化时 float a = atof(str)出现了问题,只要当字符串str的值超过99999992时,转化后的变量就是10000000了,小于这个值就没问题。
查了下单片机的浮点范围,这个99999999才8位数,应该是没问题的啊,难道是atof()函数的限制吗,哪位大佬能帮忙解释下不?

image.png

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2022-7-22 01:52:41 | 显示全部楼层
float a的话,这个结果是可以的。因为单精度浮点有效位数是7-8个。

image.png
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2022-7-22 10:10:52 | 显示全部楼层
那看来我发的那个表里的float应该是指double float了。
之前还发现如果浮点型越大,小数点后面的精确位数就越小,对于要保持6位及以上小数的,还是得用double类型,float满足不了
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
发表于 2022-7-22 10:44:37 | 显示全部楼层
这个函数应该没问题,上代码看看。
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2022-7-22 10:47:23 | 显示全部楼层
浮点转换会丢失部分精度的。 这个结果应该是对的
回复

使用道具 举报

210

主题

1045

回帖

1685

积分

至尊会员

More we do, more we can do.

积分
1685
发表于 2022-7-22 10:56:21 | 显示全部楼层
是2楼说的原因,超float表示范围了,损失了末位
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2022-7-22 14:43:30 | 显示全部楼层
庄永 发表于 2022-7-22 10:44
这个函数应该没问题,上代码看看。

就是float精度损失的原因,以前只发现数值过大会损失小数点后的精度,这次才发现值到8位以后,整数部分精度也会丢失
回复

使用道具 举报

1

主题

72

回帖

75

积分

初级会员

积分
75
发表于 2022-7-22 16:26:34 | 显示全部楼层
因为是浮点数啊
根据IEEE754标准,float型(32位)有8位是阶码,有23位是尾数
99999992对应的float型机器码是4C BE BC 1F
阶码是10011001=153,对应的指数是153-127=26,也就是你的尾数部分每增加1整个数字就会增加2^(26-23)=8,刚好和你测试的结果一致
屏幕截图 2022-07-22 162415.png
屏幕截图 2022-07-22 162437.png

总结下来就是浮点数的绝对值越大精度越低,如果要存放绝对值较大的浮点数又有精度要求那就上double
回复

使用道具 举报

1

主题

72

回帖

75

积分

初级会员

积分
75
发表于 2022-7-22 16:40:35 | 显示全部楼层
float(32位)能表示的范围也是非常大的,能到3x10^38这个量级,但这个时候的精度也是最低的,尾数部分每增加1整个数字就会增加2^(127-23)=2^104
屏幕截图 2022-07-22 163625.png
屏幕截图 2022-07-22 163554.png
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 16:49 , Processed in 0.278119 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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