| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1886 人关注过本帖
标题:[奇怪]简单的C++程序,疑问
只看楼主 加入收藏
maxlea
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2006-12-7
收藏
 问题点数:0 回复次数:11 
[奇怪]简单的C++程序,疑问


#include <iostream>
using namespace std;
int main()
{
float a=50.25,b=11.17;
cout.setf(ios_base::fixed,ios_base::floatfield);
cout << \"a = \" << a << endl
<< \"b = \" << b << endl
<< \"a + b = \" << a + b
<< endl ;
return 0;
}

结果是61.41998,float 是精确到6位的,为什么会出现这样的结果呢?我们口算是61.42,这个才4位啊?

[此贴子已经被作者于2007-1-27 22:39:41编辑过]

搜索更多相关主题的帖子: 疑问 贴子 作者 
2007-01-24 17:00
csight
Rank: 1
等 级:新手上路
威 望:1
帖 子:293
专家分:0
注 册:2006-6-11
收藏
得分:0 
这个可能和计算机的内部数据的二进制表示有关;
LZ有疑问的话可以去查阅一些这方面的书,定有收益!

头可断,发型不可乱;血可流,皮鞋不可不擦油;
2007-01-24 17:11
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
换double 就应该没事了吧

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-01-24 18:06
maxlea
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2006-12-7
收藏
得分:0 
我只是想知道为什么这样,不是为了实现,这是C++PRIMER里面的一个例子,它又说float是六位精确,这个事实和他自己矛盾了,所以偶郁闷啊

work~work
2007-01-24 18:52
tyc611
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-1-21
收藏
得分:0 
以下是引用maxlea在2007-1-24 17:00:00的发言:


#include <iostream>
using namespace std;
int main()
{
float a=50.25,b=11.17;
cout.setf(ios_base::fixed,ios_base::floatfield);
cout << \"a = \" << a << endl
<< \"b = \" << b << endl
<< \"a + b = \" << a + b
<< endl ;
return 0;
}

结果是61.41998,float 是精确到6位的,为什么会出现这样的结果呢?我们口算是61.42,这个才4位啊?

首先,50.25和11.17是浮点型字面值,其类型是double,而你把它赋值给float类型,这样可能会损失精度;
其次,再来分析为什么会损失精度?由于在计算机中数据是按二进制存储的(相信你也会这种计算),所以本身在存储时就有精度损失(当然,这种损失很小)。当把double型转换成float型,损失的精度位数更多了,所以才出现了你的结果。另外,float型一般情况下在C++中没用,直接用double型就行了,并且,现在机器上double可能运算更快(以前之所以用float而不是double,速度是一个原因)


2007-01-25 01:16
maxlea
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2006-12-7
收藏
得分:0 

谢谢楼上的


work~work
2007-01-25 14:27
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
#include<iostream.h>
void main()
{
for(float x=0; x<=1.0; x=x+0.1)
cout<<x<<",";
cout<<endl;
}
还有有趣的呢

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-01-25 18:27
一二三四五
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:856
专家分:0
注 册:2006-11-13
收藏
得分:0 
什么有趣的?

hey,di va la
2007-01-25 19:09
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
你输出是什么

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-01-25 20:33
monkeyzhen
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-1-27
收藏
得分:0 

[QUOTE] 0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,[/QUOTE]

可是没有看出来什么有意思的啊...

2007-01-27 19:30
快速回复:[奇怪]简单的C++程序,疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017064 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved