| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 918 人关注过本帖
标题:[求助]一个关于2.1/1.9和1.9/2.1的问题
只看楼主 加入收藏
neufcl
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-23
收藏
 问题点数:0 回复次数:11 
[求助]一个关于2.1/1.9和1.9/2.1的问题

今天遇到这样一个问题

#include<iostream>
#include<iomanip>
#include<cstring>
using namespace std;
void main()
{
int i,n=0;
double x=1,y1=2.1/1.9,y2=1.9/2.1;
for(i=1;i<22;i++)
x=x*y1;
while(x!=1.0)
{
x*=y2;
n++;
}
cout<<n<<endl;
}
输出结果为21.
实验证明当将所有的double改成long double时,结果还是21
但是改成float时就会死循环。

我觉得是和机器内的浮点数的最多小数位数有关。但是不甚理解
请大侠们指点

搜索更多相关主题的帖子: double include 小数 机器 
2007-10-27 19:56
neufcl
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-23
收藏
得分:0 
高手、大侠们帮帮小弟呗!

学好C++
2007-10-27 20:47
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
浮点数本来就不应该用==或者!=来判断



by 雨中飞燕 C/C++学习讨论群:46520219
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge)论坛:[/url] http://yzfy.org/
Blog: http://yzfy.programfan.com

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url] [url=http://blog.programfan.com/article.asp?id=24801]请不要写出非int声明的main函数[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
2007-10-27 20:51
neufcl
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-23
收藏
得分:0 
回复:(雨中飞燕)浮点数本来就不应该用==或者!=来判...

我们写程序时是应该避免这样
但是这样也是合法的啊
这里考的就是浮点数和1.0的关系


学好C++
2007-10-27 21:10
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
合法那又如何?



by 雨中飞燕 C/C++学习讨论群:46520219
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge)论坛:[/url] http://yzfy.org/
Blog: http://yzfy.programfan.com

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url] [url=http://blog.programfan.com/article.asp?id=24801]请不要写出非int声明的main函数[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
2007-10-27 23:46
neufcl
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-23
收藏
得分:0 
回复:(雨中飞燕)合法那又如何?[img]http://bbs.bc...
避免自己没有权威。我可以声明:这是迅雷的笔试题

学好C++
2007-10-28 08:33
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 

奇怪,double怎么就不会死循环呢?


从BFS(Breadth First Study)到DFS(Depth First Study)
2007-10-28 08:37
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
哦。2.1和1.9这两个数是故意选的,刚好能等于1,换成别的数就不行了

从BFS(Breadth First Study)到DFS(Depth First Study)
2007-10-28 08:42
neufcl
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-23
收藏
得分:0 
回复:(永夜的极光)哦。2.1和1.9这两个数是故意选的...
好像不是这样的。按道理说如果给出的两个浮点数相除小数的精度比double或float低的话。
一定输出21.如果它被截断。应该是死循环

学好C++
2007-10-28 08:53
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
我认为是这样的

两个小数无论如何都要被截断的,因为即使你用long double,精度也是有限,

而2.1/1.9是一个无限循环小数,所以肯定会有截断误差,

但是因为选择了2.1 1.9和循环21次这么一组搭配,刚好可以使截断误差相互抵消,所以才能得到21

从BFS(Breadth First Study)到DFS(Depth First Study)
2007-10-28 09:27
快速回复:[求助]一个关于2.1/1.9和1.9/2.1的问题
数据加载中...
 
   



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

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