OpenEdv-开源电子网

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

有关C语言疑惑

[复制链接]

1

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2012-12-2
在线时间
67 小时
发表于 2018-8-21 10:38:17 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 hwb_dream 于 2018-8-21 11:52 编辑

#include <stdio.h>

int main()
{
        float dat;
        int temp=999;
        dat=temp/10.0;
        if(dat<=99.9)
        {
        /* 我的第一个 C 程序 */
               printf("Hello,Me ! \n");
        }
        else
        {
              printf("Hello, World !%f\n",dat);
        }
   return 0;
}
结果为什么是"Hello, World !99.900002"?



应该是这个原因:两个浮点数之间不能用==来判断是否相等,因为浮点数是对实数的近似,所以计算机中两个浮点数不可能完全相等,最多也只能保证其差值小于用户规定的误差限度。




20180821103628.jpg
C语言自动类型转换.jpg

最佳答案

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

不是这个原因,而且int是32位,不是u8的8位,没有溢出(STM32是32位的,int是4字节)。 原因是浮点型的表示方法,类似于ADC,浮点型表示也是有类似最小分辨率的:大概就是可以勉强理解为给定的99.9无法用一个准确的浮点表示出来,只能用一个最接近的浮点型来表示。 你可以用 abs(n - m) < 0.0000001之类的运算来代替 == 运算。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8054
金钱
8054
注册时间
2014-8-13
在线时间
1597 小时
发表于 2018-8-21 10:38:18 | 显示全部楼层
胖子阳 发表于 2018-8-21 11:00
因为int temp是u8类型的数据,最大为256吧,这里你设置了999,溢出了。

不是这个原因,而且int是32位,不是u8的8位,没有溢出(STM32是32位的,int是4字节)。

原因是浮点型的表示方法,类似于ADC,浮点型表示也是有类似最小分辨率的:大概就是可以勉强理解为给定的99.9无法用一个准确的浮点表示出来,只能用一个最接近的浮点型来表示。

你可以用 abs(n - m) < 0.0000001之类的运算来代替 == 运算。
回复

使用道具 举报

18

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-27
在线时间
34 小时
发表于 2018-8-21 10:51:32 | 显示全部楼层
原因我不知道,但是你把dat = temp / 10.0换成dat = temp / 10,结果肯定是dat < 99.9
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2018-8-21 11:00:42 | 显示全部楼层
因为int temp是u8类型的数据,最大为256吧,这里你设置了999,溢出了。
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-21 11:19:14 | 显示全部楼层
浮点型这玩意 很容易出问题.............
建议用double
猪猪熊呢?
回复

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-7-12
在线时间
21 小时
发表于 2018-8-21 11:33:16 | 显示全部楼层
float dat

第一次遇到这种现象难免感觉疑惑,多碰几次就习以为常。

当声明了float类型的时候,计算机内部运作原理就是使用小数来表示。

如果需要再问为什么就要扯到底层原理。

回复

使用道具 举报

1

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2012-12-2
在线时间
67 小时
 楼主| 发表于 2018-8-21 11:46:12 | 显示全部楼层
323232 发表于 2018-8-21 11:19
浮点型这玩意 很容易出问题.............
建议用double

声明double dat;后,结果确实正常了
回复

使用道具 举报

1

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2012-12-2
在线时间
67 小时
 楼主| 发表于 2018-8-21 11:50:26 | 显示全部楼层
mack13013 发表于 2018-8-21 11:15
不是这个原因,而且int是32位,不是u8的8位,没有溢出(STM32是32位的,int是4字节)。

原因是浮点型 ...

应该是这个原因:两个浮点数之间不能用==来判断是否相等,因为浮点数是对实数的近似,所以计算机中两个浮点数不可能完全相等,最多也只能保证其差值小于用户规定的误差限度。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 03:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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