首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个浮点数相加的小疑点,却难道一帮人

2012-04-27 
一个浮点数相加的小问题,却难道一帮人!各位好,好久没来这里。有这样一个问题:#includeiostream#includei

一个浮点数相加的小问题,却难道一帮人!
各位好,好久没来这里。有这样一个问题:

#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类型试试~~~~~
[解决办法]

C/C++ code
double a=1.00001;if(fabs(a-1)<1e-6){   cout<<"相等"<<endl;}
[解决办法]
探讨
楼上各位都给出了解决的方法,不过不清楚的是,为什么有的时候就可以等于1,而有的时候不可以,为什么会出现同样是浮点数运算,结果却不同?

[解决办法]
太多,看不懂
[解决办法]
自己的代码都不想看, 更不愿意看别人的代码!
------解决方案--------------------


探讨
C/C++ code
double a=1.00001;

if(fabs(a-1)<1e-6)
{
cout<<"相等"<<endl;
}

[解决办法]
目前常用的float和double等浮点数是基于IEEE-754的二进制有限小数。一个有理数,除非分母是足够小的2的整数次幂,否则它就不能被精确表示。因此,有些十进制有限位数的小数,到二进制里面可能会变成无限循环小数,在浮点数中不能表示而损失精度。

[解决办法]
看来就是多看啊~
[解决办法]
难倒的是哪的一帮人?
[解决办法]
浮点数不能直接比较的 要考虑精度的问题
[解决办法]
说不好,不好说~~~~~~

热点排行