一个浮点数相加的小问题,却难道一帮人!
各位好,好久没来这里。有这样一个问题:
#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。
请各位赐教!
[解决办法]
浮点数并不是精确的
[解决办法]
看看浮点数在计算机中的表示
浮点数加减根本不会精确地
建议用double
[解决办法]
浮点数的表示存在精度问题
并不是所有的浮点数都能精确表示的
比较两个浮点数相等应该这么用:
fabs(f1-f2) < 1e-5 -> f1==f2
1e-5是一个很小的数,一般取比f1,f2小4到5个数量级
[解决办法]
建议楼主改个double类型试试~~~~~
[解决办法]
double a=1.00001;if(fabs(a-1)<1e-6){ cout<<"相等"<<endl;}
[解决办法]