一个浮点数相加的小问题,却难道一帮人!

quiton 2010-11-14 10:19:49
各位好,好久没来这里。有这样一个问题:

#include"iostream"
#include"iomanip"
using namespace std;
int date;//日期
int ran;//随机数
int arrive;//到达数
int wait;//需要卸货数
int unload;//卸货数
int defer;//推迟卸货数
void calculator(int& arrive,int & defer)
{
wait=arrive+defer;
if(wait<2)
{
unload=wait;
defer=0;
}
else
{
unload=2;
defer=wait-2;
}
}
void print()
{
cout<<setw(5)<<ran<<setw(5)<<arrive<<setw(5)<<wait<<setw(5)<<unload<<setw(5)<<defer<<endl;
}
main()
{
int ar=-1;
int array[10];
float prob,total=0;
cout<<"输入概率分布:"<<endl;
cout<<"到达车数 概率 累计概率"<<endl;
while(total<1)
{
ar++;
cout<<ar<<" ";
cin>>prob;
total=total+prob;
array[ar]=total*100;
cout<<" "<<total<<endl;
}
if(total>1)
{
cout<<"输入错误!"<<endl;
exit(0);
}



cout<<"(1)日期(2)随机数(3)到达数(4)需要卸货数(5)卸货数(6)推迟卸货数"<<endl;
cout<<"--------------------------------------------------------------"<<endl;
for(int count=0;count<53;count++)
{
if(count<3)
{
date=0;
cout<<"x";
}
else
{
date++;
cout<<date;
}
ran=rand()%100;
for(int i=0;i<=ar;i++)
{
if(ran>=0&&ran<array[0])
arrive=0;
if(ran>=array[i]&&ran<array[i+1])
arrive=i+1;
}
if(count==0)

{
wait=arrive;
if(arrive>2)
{
unload=2;
defer=arrive-2;
}
else
{
unload=arrive;
defer=0;
}
cout<<setw(5)<<ran<<setw(5)<<arrive<<setw(5)<<wait<<setw(5)<<unload<<setw(5)<<defer<<endl;
}
else
{
calculator(arrive,defer);
print();
}
}
}

/*
0.23
0.3
0.3
0.1
0.05
0.02*/

/*
0.2
0.3
0.3
0.13
0.05
0.02
*/

上面的两组数作为程序的输入值,第一组相加之后大于1,而后一组等于1。

请各位赐教!

...全文
392 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zchl25 2010-11-20
  • 打赏
  • 举报
回复
说不好,不好说~~~~~~
無_1024 2010-11-19
  • 打赏
  • 举报
回复
浮点数不能直接比较的 要考虑精度的问题
龙哥依旧 2010-11-15
  • 打赏
  • 举报
回复
难倒的是哪的一帮人?
qq120848369 2010-11-14
  • 打赏
  • 举报
回复
double a=1.00001;

if(fabs(a-1)<1e-6)
{
cout<<"相等"<<endl;
}
  • 打赏
  • 举报
回复
建议楼主改个double类型试试~~~~~
quiton 2010-11-14
  • 打赏
  • 举报
回复
问题是为什么有的数加起来等于1,而有的则不是?
Zeilone 2010-11-14
  • 打赏
  • 举报
回复
浮点数的表示存在精度问题
并不是所有的浮点数都能精确表示的

比较两个浮点数相等应该这么用:
fabs(f1-f2) < 1e-5 -> f1==f2
1e-5是一个很小的数,一般取比f1,f2小4到5个数量级
  • 打赏
  • 举报
回复
看看浮点数在计算机中的表示
浮点数加减根本不会精确地
建议用double
luciferisnotsatan 2010-11-14
  • 打赏
  • 举报
回复
浮点数并不是精确的
liu163169 2010-11-14
  • 打赏
  • 举报
回复
看来就是多看啊~
FrankHB1989 2010-11-14
  • 打赏
  • 举报
回复
目前常用的float和double等浮点数是基于IEEE-754的二进制有限小数。一个有理数,除非分母是足够小的2的整数次幂,否则它就不能被精确表示。因此,有些十进制有限位数的小数,到二进制里面可能会变成无限循环小数,在浮点数中不能表示而损失精度。
漫步者、 2010-11-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qq120848369 的回复:]
C/C++ code
double a=1.00001;

if(fabs(a-1)<1e-6)
{
cout<<"相等"<<endl;
}
[/Quote] 嗯,是的,float的确是不精确的类型,后面保留6-7位小数,其它的就e来表示了,有时候省略第6-7位小数后面的数据!

#include <iostream>
using namespace std;
int main()
{
float x=1.00000001; //**换成double又不一样了,double比float的精度要高!
if( x == 1)
{
cout<<"Y"<<endl;
}
else
{
cout<<"N"<<endl;
}
return 0;
}
zhiji 2010-11-14
  • 打赏
  • 举报
回复
自己的代码都不想看, 更不愿意看别人的代码!
xspace_time 2010-11-14
  • 打赏
  • 举报
回复
太多,看不懂
Zeilone 2010-11-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 quiton 的回复:]
楼上各位都给出了解决的方法,不过不清楚的是,为什么有的时候就可以等于1,而有的时候不可以,为什么会出现同样是浮点数运算,结果却不同?
[/Quote]
问题出现在运算的过程中,而不是结果
运算过程中有的数不能精确表示,比原来的数大了(或者小了)
最终运算的结果就不等于1了
quiton 2010-11-14
  • 打赏
  • 举报
回复
楼上各位都给出了解决的方法,不过不清楚的是,为什么有的时候就可以等于1,而有的时候不可以,为什么会出现同样是浮点数运算,结果却不同?

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧