| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 443 人关注过本帖, 1 人收藏
标题:关于输出结果问题
只看楼主 加入收藏
eastern210
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-7-5
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:4 
关于输出结果问题
弱弱的问一个问题,我用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");
}  
求解释,多谢!
搜索更多相关主题的帖子: include double return 源程序 
2013-07-05 10:00
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:7 
你要学会怎么提问呀,要点就两个
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
2013-07-05 12:13
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:7 
这里面有好几条printf,cout输出语句,不知道楼主对哪些不明白

思考赐予新生,时间在于定义
2013-07-05 15:12
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:7 
...

仰望星空...........不忘初心!
2013-07-05 19:07
eastern210
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-7-5
收藏
得分:0 
回复 2楼 rjsp
谢谢版主!我是纯新手一枚,以后希望多多指教。
2013-07-06 10:11
快速回复:关于输出结果问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017393 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved