用C++编程求e^x的近似值,要求精确度<=10^(-8),以下是我的编程:

#include<iostream.h>
double pingfang(double x,double n);
double jiecheng(double n);
void main(void)
{
double x,a=1,n=1;
cin>>x;
do
{
a+=pingfang(x,n)/jiecheng(n);
n++;
}
while(a<10e-8);
cout<<a<<endl;
}
double pingfang(double x,double n)
{
double a,i;
a=x;
for(i=1;i<n;i++)
a*=x;
return(a);
}
double jiecheng(double n)
{
double a,i;
a=n;
for(i=1;i<n;i++)
a*=i;
return(a);
}
我用了两个函数,利用泰勒展开式,但为什么每次结果都不正确,求计算机高手解释下,我刚学完C++,希望给我指出问题所在,万分感谢。

判断条件出错,while(a<10e-8);泰勒展开的精度是指最后一项的精度,展开到某一项的精度达到某个值就可以停止了,而你的程序里面的a是指e的近似值,这没有意义,应改为:while(pow(x,n)/k>=10e-8),当然,为了提高程序的运行速度(从一开始就应该养成这个良好的习惯),可以用一个变量存储,不用再算一遍,修改后的代码如下:
#include<iostream.h>
#include <math.h>

void main(void)
{
double x,a=1,n=1,k=1,temp=0;
cin>>x;
do
{
temp=pow(x,n)/k;
a+=temp;
++n;
k=k*n;
}
while(temp>=10e-8);
cout<<"e^x="<<a<<'\t'<<"n="<<n<<endl;
}

pow(x,n)用来求x的n次方,该函数包含在math.h头文件里面,n的阶乘可以在主函数的循环里面完成,不用另外弄一个函数,这样计算机会很辛苦

另外尽量不要用n++,,尽量用++n,因为n++会另外开辟一个变量存储中间值,用++n效率会高一点,这些都是良好的编程习惯,为计算机节省空间跟运行时间追问

但是这道题要求不能用库函数里的函数,我就只能重新写一个函数,我的判断错在哪能给我一个具体的改正吗?关于精度我一直搞不懂怎么来弄,能给我教个具体方法吗?非常感谢您的回答。

追答

精度就是误差的大小,实际值跟准确值的误差小到一定程度就达到精度要求了,但是e的准确值无法知道,所以前人就弄了一个泰勒展开式来求e^x的估计值,根据这条式子求出的e^x值达到的精确度就由泰勒展开式的最后一项来决定,具体到哪一项就要看你的精度要求,比如你的10e-8,要求e^3的估计值的话就要求到第19项才能达到要求,求e^5的估计值就要加到到第25项!
你可以这样理解,前18项的和是精确值,第19项是估计的,这个估计值达到精度要求那这个e^x的估计值也达到要求了

一句话,就是用最后一项来跟精度比较

追问

精度我理解了,谢谢,那么在我这个程序里while(a<10e-8);应该怎么改才可以是我的程序可以运行得到我想要的结果那?

追答

前面已经说了,把条件改成pow(x,n)/k>=10e-8,如果pow(x,n)/k仍然比10e-8大,则继续算下一项,直到pow(x,n)/k比10e-8小就达到要求了

追问

我的意思是在我的程序的基础上该一下,谢谢。

追答

#include
double pingfang(double x,double n);
double jiecheng(double n);
void main(void)
{
double x,a=1,n=1,temp;//增加一个中间变量
cin>>x;
do
{
temp=pingfang(x,n)/jiecheng(n);//获取最后一项
a+=temp;//获取估计值
n++;
}
while(temp>=10e-8);//判断精度
cout<<a<<endl;
}
double pingfang(double x,double n)
{
double a,i;
a=x;
for(i=1;i<n;i++)
a*=x;
return(a);
}
double jiecheng(double n)
{
double a,i;
a=n;
for(i=1;i<n;i++)
a*=i;
return(a);
}

修改的地方注释已经说明

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-11
在头文件里加上这个:#include"iomanip.h"
最后一行改为:cout<<setprecision(11)<<"e="<<e<<endl;
注:setprecision(num),num是几,小数点后就保留num-1位!
另外我是一名软件工程专业的大学生,以后有问题可以问我,我的邮箱是[email protected]
第2个回答  2011-06-08
while(a<10e-8);
这个循环条件错啦,a是恒大于10e-8的啊
我觉得应该为:
do
{
n++;
a+=pingfang(x,n)/jiecheng(n);
}
while(pingfang(x,n)/jiecheng(n)>10e-8);
(n初值为0啊,上面改一下)
(泰勒记不得了,我猜的啊)
相似回答