#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++,希望给我指出问题所在,万分感谢。
但是这道题要求不能用库函数里的函数,我就只能重新写一个函数,我的判断错在哪能给我一个具体的改正吗?关于精度我一直搞不懂怎么来弄,能给我教个具体方法吗?非常感谢您的回答。
追答精度就是误差的大小,实际值跟准确值的误差小到一定程度就达到精度要求了,但是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);
}
修改的地方注释已经说明