注册 登录
编程论坛 C++教室

[求助]一个关于2.1/1.9和1.9/2.1的问题

neufcl 发布于 2007-10-27 19:56, 923 次点击

今天遇到这样一个问题

#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时就会死循环。

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

11 回复
#2
neufcl2007-10-27 20:47
高手、大侠们帮帮小弟呗!
#3
雨中飞燕2007-10-27 20:51
浮点数本来就不应该用==或者!=来判断



by 雨中飞燕 C/C++学习讨论群:46520219
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge)论坛:[/url] 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" target="_blank">https://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]
#4
neufcl2007-10-27 21:10
回复:(雨中飞燕)浮点数本来就不应该用==或者!=来判...

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

#5
雨中飞燕2007-10-27 23:46
合法那又如何?



by 雨中飞燕 C/C++学习讨论群:46520219
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge)论坛:[/url] 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" target="_blank">https://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]
#6
neufcl2007-10-28 08:33
回复:(雨中飞燕)合法那又如何?[img]http://bbs.bc...
避免自己没有权威。我可以声明:这是迅雷的笔试题
#7
永夜的极光2007-10-28 08:37

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

#8
永夜的极光2007-10-28 08:42
哦。2.1和1.9这两个数是故意选的,刚好能等于1,换成别的数就不行了
#9
neufcl2007-10-28 08:53
回复:(永夜的极光)哦。2.1和1.9这两个数是故意选的...
好像不是这样的。按道理说如果给出的两个浮点数相除小数的精度比double或float低的话。
一定输出21.如果它被截断。应该是死循环
#10
永夜的极光2007-10-28 09:27
我认为是这样的

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

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

但是因为选择了2.1 1.9和循环21次这么一组搭配,刚好可以使截断误差相互抵消,所以才能得到21
#11
neufcl2007-10-28 12:32
回复:(永夜的极光)我认为是这样的两个小数无论如何...
你说的有道理但是我觉得不完全正确。
你试下每一步的输出。最后一个值可第一个。倒数第二个值和正数第二个值。依次类推。
它们每一组值都是正好相等的。和21没有任何关系!
#12
king862007-11-05 14:10
float类型有个四舍五入引起误差使后来的数达不到1.0
1