OpenEdv-开源电子网

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

C语言浮点数运算问题

[复制链接]

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2015-5-17 16:04:53 | 显示全部楼层 |阅读模式
5金钱

int   main(void)

{

       float        A=0.18;

       if(x==0.18)

              printf(“Equal”);

       else

              printf(“Not Equal”);

       return  0;

}
代码运行的结果是什么??
a.输出依赖于编译器 b.Equal ??   c.Not Equal  ???       d.运行出错          

最佳答案

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

浮點數有精度問題啊~~不一定能夠正確表示出 A實際上有可能多一點(0.1800001) 或少一點(0.1799999)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2015-5-17 16:04:54 | 显示全部楼层
浮點數有精度問題啊~~不一定能夠正確表示出

A實際上有可能多一點(0.1800001) 或少一點(0.1799999)
回复

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
 楼主| 发表于 2015-5-17 16:05:31 | 显示全部楼层
xp  32位  系统下的VC6.0运行结果是c
回复

使用道具 举报

2

主题

102

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2014-12-21
在线时间
0 小时
发表于 2015-5-17 22:29:37 | 显示全部楼层
要用绝对值的方法写:
if  ( fabs(A)  < 1e-06);
回复

使用道具 举报

3

主题

2166

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5552
金钱
5552
注册时间
2013-11-22
在线时间
1167 小时
发表于 2015-5-17 22:31:48 | 显示全部楼层
变量x 都没定义  运行出错
回复

使用道具 举报

0

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2014-3-5
在线时间
65 小时
发表于 2015-5-18 17:04:16 | 显示全部楼层
在CodeBlocks中用gcc编译了下该代码结果如下(if(x==0.18)应该是if(A==0.18)吧)


同意4楼的观点,应该是精度的问题,而且float和double类型精度不一样。
而if(A==0.18) 中编译器应该把0.18当成double了,而0.18不能用二进制精确表示出来,0.18用float和double分别存在机器中应该是不同的。
我先把程序改了下如下图:把float A=0.18改成了double A=0.18运行结果是Equal



我再改了下程序,把if(A==0.18)修改为if(A==0.18f),结果是Equal,请看下图



最后我把判断的值改成了0.5,0.5这个数是能用二进制精确表示的,请看最后的一个图,这个的结果是Equal



急不来总有障碍客观的存在...
回复

使用道具 举报

81

主题

1004

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-5-18 20:17:23 | 显示全部楼层
浮点数不能精确存储,只能限定范围判断。不能==。
如4楼所说。
小小蜗牛
回复

使用道具 举报

0

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2014-3-5
在线时间
65 小时
发表于 2015-5-18 21:16:35 | 显示全部楼层
回复【7楼】jiutianshenjian:
---------------------------------
受教了,谢谢!
以前确实从未思考过用==来判断两个浮点数是否相等所涉及到的问题。
我上面的帖子也只是根据之前了解到的浮点数存储知识的推断,不严谨!!!
急不来总有障碍客观的存在...
回复

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
 楼主| 发表于 2015-5-20 17:45:14 | 显示全部楼层
回复【6楼】文刀言身寸:
---------------------------------
a.输出依赖于编译器 b.Equal ??   c.Not Equal  ???       d.运行出错 
选择哪个?
回复

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
 楼主| 发表于 2015-5-20 17:45:32 | 显示全部楼层
回复【5楼】civic7366:
---------------------------------
a.输出依赖于编译器 b.Equal ??   c.Not Equal  ???       d.运行出错 
选择哪个?
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2015-5-21 11:14:28 | 显示全部楼层
回复【10楼】1375917982gxut:
---------------------------------
真不知道答案...只能肯定不是d. (如果不考慮變數X沒宣告..)

你這麼堅持要人作選項...最後有要公布答案嗎XD

5F講得非常詳細...
事實上就算是64位的浮點數也沒辦法正確表示出0.18 
http://www.h-schmidt.net/FloatConverter/IEEE754.html 
把0.18丟上去看 double表示0.18000000715255737







回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-11-20
在线时间
21 小时
发表于 2015-12-2 14:31:11 | 显示全部楼层
A=0.18f 就输出相等吧
人没有梦想和咸鱼有什么区别!
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-11-20
在线时间
21 小时
发表于 2015-12-2 14:33:38 | 显示全部楼层
C语言默认将小数存储为双精度类型
人没有梦想和咸鱼有什么区别!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-3-28 18:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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