关于输出结果问题
弱弱的问一个问题,我用printf和cout编同一个问题时,为什么输出结果不一样?printf输出的是六位的小数,而cout是用科学计数法出来的小数?源程序如下:
这个是用cout输出的:
#include <iostream>
#include <iostream.h>
#include <stdio.h>
#include <math.h>
double x1=2,x2=2;
double E=pow(10,-6); /*给定起始点的值为x1,x2,并定义精度为E*/
double fun1(double x1,double x2) /*定义函数fun1为目标函数*/
{double y;
y=pow(x1,2)+25*pow(x2,2);
return y;
}
double fun2(double g[],double x1,double x2) /*定义函数fun2为求步长的函数*/
{
double buchang;
buchang=-(g[0]*x1+25*g[1]*x2)/(pow(g[0],2)+25*pow(g[1],2));
return buchang;
}
void gtd1()
{ double t, beta, d[2],g[4], y, m;
int k=1;
g[0]=2*x1; /*目标函数对x1求偏导*/
g[1]=50*x2; /*目标函数对x2求偏导,求梯度*/
m=(sqrt(g[0]*g[0]+g[1]*g[1])); /*对g[0]*g[0]+g[1]*g[1]求开方,将值赋给m*/
while(m>E&&k<=10) /*判断,当m>E时进行以下循环*/
{
if (k==1)
{
d[0]=-g[0];
d[1]=-g[1];
beta=0;
} /*计算因子beta*/
else
{
beta=(g[0]*g[0]+g[1]*g[1])/(g[2]*g[2]+g[3]*g[3]); /*计算因子beta*/
d[0]=-g[0]+beta*d[0];
d[1]=-g[1]+beta*d[1];
}
t=fun2(d,x1,x2); /*计算步长*/
x1=x1+d[0]*t; /*根据步长和搜索方向求出新的x1,x2*/
x2=x2+d[1]*t;
cout<<"----------------------------------------------------"<<"\n";
cout<<"迭代次数为:"<<k<<"\n";
cout<<"梯度为:"<<g[0]<<'\t'<<g[1]<<"梯度的模"<<m<<"\n";
cout<<"搜索方向为:"<<d[0]<<'\t'<<d[1];
cout<<"\n"<<"计算因子"<<beta<<"步长"<<t<<"\n";
cout<<"x的值"<<x1<<'\t'<<x2;
g[2]=g[0];
g[3]=g[1];
g[0]=2*x1; /*根据得到的x1,x2求出新的梯度,并将值*/
g[1]=50*x2; /*赋给g[0],g[1],*/
m=double(sqrt(g[0]*g[0]+g[1]*g[1])); /*计算新的m*/
cout<<"\n"<<"新的负梯度的模"<<m<<"\n";
k++;
}
y=fun1(x1,x2); /*当m不满足m>E的时候退出循环,并计算fun1,*/
cout<<"最优解为x1,x2"<<x1<<'\t'<<x2<<"\n"; /*将值赋给y,并输出。*/
cout<<"极小值为y="<<y<<endl;
}
void main()
{
gtd1();
system("pause");
}
这个是用printf输出的:
#include <iostream>
#include "stdio.h"
#include "math.h"
double x1=2,x2=2;
double E=pow(10,-6); /*给定起始点的值为x1,x2,并定义精度为E*/
double fun1(double x1,double x2) /*定义函数fun1为目标函数*/
{double y;
y=x1*x1+25*x2*x2;
return y;
}
double fun2(double g[],double x1,double x2) /*定义函数fun2为求步长的函数*/
{
double buchang;
buchang=-(g[0]*x1+25*g[1]*x2)/(g[0]*g[0]+25*g[1]*g[1]);
return buchang;
}
void main()
{ double t, beta, d[2],g[4], y, m;
int k=1;
g[0]=2*x1; /*目标函数对x1求偏导*/
g[1]=50*x2; /*目标函数对x2求偏导,求梯度*/
m=(sqrt(g[0]*g[0]+g[1]*g[1])); /*对g[0]*g[0]+g[1]*g[1]求开方,将值赋给m*/
while(m>E&&k<=10) /*判断,当m>E时进行以下循环*/
{
if (k==1)
{
d[0]=-g[0];
d[1]=-g[1];
beta=0;
} /*计算因子beta*/
else
{
beta=(g[0]*g[0]+g[1]*g[1])/(g[2]*g[2]+g[3]*g[3]); /*计算因子beta*/
d[0]=-g[0]+beta*d[0];
d[1]=-g[1]+beta*d[1];
}
t=fun2(d,x1,x2); /*计算步长*/
x1=x1+d[0]*t; /*根据步长和搜索方向求出新的x1,x2*/
x2=x2+d[1]*t;
printf("迭代次数为%d\n",k);
printf("梯度%f,%f,梯度的模%f\n",g[0],g[1],m);
printf("搜索方向%f,%f,计算因子 %f,步长%f\n",d[0],d[1],beta,t);
printf("x的值%f,%f\n",x1,x2);
g[2]=g[0];
g[3]=g[1];
g[0]=2*x1; /*根据得到的x1,x2求出新的梯度,并将值*/
g[1]=50*x2; /*赋给g[0],g[1],*/
m=double(sqrt(g[0]*g[0]+g[1]*g[1])); /*计算新的m*/
printf("新的负梯度的模%f\n",m);
k++;
}
y=fun1(x1,x2); /*当m不满足m>E的时候退出循环,并计算fun1,*/
printf("分别输出x1,x2 %f,%f\n",x1,x2); /*将值赋给y,并输出。*/
printf("极小值y %f",y);
system("pause");
}
求解释,多谢!