注册 登录
编程论坛 C++教室

关于输出结果问题

eastern210 发布于 2013-07-05 10:00, 443 次点击
弱弱的问一个问题,我用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");
}  
求解释,多谢!
4 回复
#2
rjsp2013-07-05 12:13
你要学会怎么提问呀,要点就两个
a. 该交代的信息,一个都不能少
b. 无关的信息,一个都不能说

如果我是,我会这么问:
对于如下代码,前者输出为 2.22045e-016,后者输出为 0.000000,怎么才能使之一致?
程序代码:
#include <iostream>
#include <cstdio>

int main()
{
    double d = 2.22045e-016;

    std::cout << d << std::endl;
    printf( "%f\n", d );

    return 0;
}

别人就不需要看你那一大段无关的代码(你提的这个极度简单的问题,却一直没什么人回答,你自己有没有感觉到肯定是哪里出了问题?),直接回答:
你想让 printf 的输出和 cout 一致,那就得让 printf 用科学计数法输出;若想反过来,那就得让 cout 以固定位输出,代码
程序代码:
#include <iostream>
#include <iomanip>
#include <cstdio>

int main()
{
    double d = 2.22045e-016;

    std::cout << d << std::endl;
    printf( "%g\n", d );

    printf( "%f\n", d );
    std::cout <<  std::fixed << std::setprecision(6) << d <<std::endl;

    return 0;
}
输出为:
2.22045e-016
2.22045e-016
0.000000
0.000000
#3
love云彩2013-07-05 15:12
这里面有好几条printf,cout输出语句,不知道楼主对哪些不明白
#4
Susake2013-07-05 19:07
...
#5
eastern2102013-07-06 10:11
回复 2楼 rjsp
谢谢版主!我是纯新手一枚,以后希望多多指教。
1