x=4.0时,为什么4*x>16 在循环里面结果总是为随机的?有时候为TRUE?
coyer 2004-04-30 10:08:49 邪门了,我好歹也写了5年多的C代码了,怎么这个问题今天搞了一晚上还是没有搞明白啊?
留下邮箱,我把工程代码发给你,帮我调调,谢谢。
/*
* 函数说明:开始搜索过程
* 输入:x1,x2的范围和结果输出指针
* 本函数对于x1和x2的搜索间隔都使用interval,实际使用中可以对x1,x2都单独创建搜索间隔
* 输出:如果返回false,则说明没有找到一个合适约束条件的值,否则则求出该范围内的最合适的值。
*/
BOOL CSimplexDlg::StartSearching(double x1min, double x1max, //x1 range
double x2min, double x2max, //x2 range
double interval, //interval
double * x1Res,double *x2Res, //save x1,x2 fit value
double *maxz) //save result
{
double i,j;
double res;
BOOL finded=FALSE;
double x1,x2,maxres=0.0;
x1=*x1Res;
x2=*x2Res;
//循环检查测试所有约束范围内的值
for(i=x1min;i<=x1max;i=i+interval)
{
for(j=x2min;j<=x2max;j=j+interval)
{
//只对符合约束条件的值进行检测
if (CheckCondition(i,j))
{
res=2.0*i+3.0*j;
//如果当前值计算结果比所有的值都好,则记录下来
if (res>=maxres)
{
x1=i;
x2=j;
maxres=res;
finded=TRUE;
}
}
}
}
//记录结果
if (finded)
{
*x1Res=x1;
*x2Res=x2;
*maxz=maxres;
}
return finded;
}
/*
* 函数说明:约束条件检测
* 输入:x1,x2分别为检测值,本例子为示例程序,约束条件没有化简
* 输出:符合约束条件返回TRUE,otherwise return FALSE;
* 注意点:double类型的相等判断不能使用==,而应该使用fabs(val)<0.000001等自定义的精度。
*/
BOOL CSimplexDlg::CheckCondition(double x, double y)
{
TRACE("\nx=%6.2f,y=%6.2f",x,y);
//保证x1,x2都大于等于0
if (x*y<0.0)
{
TRACE("x*y<0");
return FALSE;
}
//其他各个分限制条件
if ((2*x+2*y)>12.0)
{
TRACE("\nError:(2*%f+2*%f)>12.0",x,y);
return FALSE;
}
if ((x+2*y)>8.0)
{
TRACE("\nError:(%f+2*%f)>8.0",x,y);
return FALSE;
}
if (4*x>16.0)
{
TRACE("\nError:4*%f>16.0",x);
return FALSE;
}
if (4*y>12)
{
TRACE("\nError:4*%f>12",y);
return FALSE;
}
TRACE("\nOK!!!!");
return TRUE;
}
测试条件:
x1: 0~6
x2: 0~4
在间隔为1.0的时候,能得出正确答案:x1=4,x2=2,res=14
在间隔为0.1的时候,得不出正确答案:x1=3.9,x2=2,res=13.8
x1=3.0 ~4.2
x2=1.7~2.2
间隔为1.0 时:得不出正确答案:x1=4,x2=1.7, res=13.1
间隔为0.1时:也得不出正确答案:x1=3.8,x2=2.1, res=13.9
真是邪门了。