请问StatData[i]==0.00这样的语句为什么经常“Floating Point Overflow”

uhian 2006-05-13 08:25:42
StatData为float类型的数组,其数据是从数据库中读取然后计算所得,代码如下:
//注:所有数组已经分配好内存
int RecCount=tbl->RecordCount;
int FdCount=tbl->Fields->Count;
//获得原始数据
tbl->Next();
for(int i=0;i<RecCount;++i)
{
for(int j=0;j<FdCount;++j)
{
if(tbl->Fields->Fields[j]->IsNull)
{
OriginalData[i][j]=0.00;
}
else
{
OriginalData[i][j]= tbl->Fields->Fields[j]->AsFloat;
}
}
tbl->Next();
}
//求和
for(int j=0;j<FdCount;++j)
{
TotalData[j]=0.00;
for(int i=0;i<RecCount;++i)
{
TotalData[j]=TotalData[j]+OriginalData[i][j];
}
}
//求百分比
for(int j=0;j<FdCount;++j)
{
for(int i=0;i<RecCount;++i)
{
// try
// {
if(TotalData[j]==0.00) //这句,经常提示“Floating Point Overflow”
{ //我跟踪了一下,发现比较之前,有时候值是
PercentData[i][j]=0.00; //7.*****E-74,然后就出错。
} //不明白,float的范围有那么大么?
else //这个值是怎么出现的?
{
PercentData[i][j]=OriginalData[i][j]/TotalData[j];
}
// }
// catch(...)
// {
// PercentData[i][j]=0.00;
// }
}
}
问题rt或者,看代码注释。
...全文
457 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
donwmufromdying 2006-06-27
  • 打赏
  • 举报
回复
你定义的数组大小会超界吗?
我的修改意见!
1、读原始数据
tbl->Next();--〉错,要改成tbl->First();否则从第二条开始了
for(int i=0;i<RecCount;++i) --〉错,++i改成i++,否则你的数组下标从1开始,很可能数组
超界,下面++j也一样。
{
for(int j=0;j<FdCount;++j)
{
if(tbl->Fields->Fields[j]->IsNull)
{
OriginalData[i][j]=0.00;
}
else
{
OriginalData[i][j]= tbl->Fields->Fields[j]->AsFloat;
}
}
tbl->Next();
}
2、浮点数是不能这么跟0.00比较大小的,改成:
if(ABS(TotalData[j])<0.0000001))
peter2108 2006-06-27
  • 打赏
  • 举报
回复
按照你的程序,++i和++j应该为i++和j++才合理吧
daydayup234 2006-06-27
  • 打赏
  • 举报
回复
有个上社区起始点的帖子
uhian 2006-06-27
  • 打赏
  • 举报
回复
人工提前一下,没有定论就结帖了。
Waiting4you 2006-06-27
  • 打赏
  • 举报
回复
我有一次把float数据赋值给double数据,结果OverFlow了,当场晕了好久,而且半天没反应过来
uhian 2006-06-27
  • 打赏
  • 举报
回复
数据表里的数据都是不超过100的。
我来看看CB 2006-06-27
  • 打赏
  • 举报
回复
OriginalData赋值结果不对,也就是说
OriginalData[i][j]= tbl->Fields->Fields[j]->AsFloat;
可能有问题,使得到的FLOAT数值超出范围
uhian 2006-06-27
  • 打赏
  • 举报
回复
执行顺序是先int i=0;,然后判断i<RecCount;成立则执行循环体,然后++i;不成立则出循环。所以++i和i++是一样的吧。
原先我本来都是用后缀++的,后来看了本书,忘了哪本了,知道后缀的++要产生临时副本用作返回值,前缀的++不产生,所以后来全改用前缀++了,虽然只是个整数变量,估计也不能省多少效率,但已经习惯了,哈哈。
至于那个一开始的next,我看了看原先的代码,确实是First(),也不知道我怎么粘贴的,ft。
话说回来,会出现错误,我感觉一定是代码有的地方有问题,内存泄露之类的,否则调试的时候应该是0的值不会变成7.*****E-74,要变也是变成?.******E-38之类的,float的范围没到74次方吧!?
Maconel 2006-06-27
  • 打赏
  • 举报
回复
1、符点数的比较应该像楼上所说的,用abs的方法比,因为计算机中存储的符点数由于进制的问题,和你预料的值一般都会有误差,你可以看看林锐《高质量c++编程》(名字记不很清了,大致是这样),里边写得比较详细。

2、++i那里,我认为是没问题的。

3、tbl->Next();这里不知道楼主的目的是什么,如果想从头开始遍历,应该是First()才对。
另外我听说tbl->Fields->Count有时候会不准确,虽然我没碰到过,但是我想这样遍历要更好些:
for (tbl->First(); !tbl->Eof; tbl->Next())
{
...
}
uhian 2006-05-31
  • 打赏
  • 举报
回复
我觉得就算这个语句不该这么写,但也不该出错吧??望大家指点我一下啊。!
uhian 2006-05-26
  • 打赏
  • 举报
回复
难道浮点数的比较都要这样么?我看有些书上也不是这样哦。
stevenjscn 2006-05-15
  • 打赏
  • 举报
回复
在头文件中
加入#include <Math.hpp>

不要用float直接与0.00比较。
用RoundTo(TotalData[j],-2)==0.00
试试
uhian 2006-05-15
  • 打赏
  • 举报
回复
上学的时候?虾米意思?我不是计算机系毕业的。
janboy 2006-05-13
  • 打赏
  • 举报
回复
不明白,怎么可以与float类型的量判断相等呢?上学的时候老师就教我们要通过fabs(A-B)<0.00...1来判断A==B的啊!
uhian 2006-05-13
  • 打赏
  • 举报
回复
汗,标题和开头说错了,应为TotalData,为了发帖改了下代码,没想到标题和开头的字忘记改了。

13,872

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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