我知道有很多这个问题的例子,但我试着自己写一个不同的问题。 这是使用泰勒系列e ^ x = 1 + x / 1! + x ^ 2/2! + x ^ 3/3! + ...... 我的代码编译并运行,但它不会输出正确的答案,我不知道为什么。这是甚至可用的代码还是应该废弃它?
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double final,power,end_n = 1.0,e=1.0,x=2.0, n;
cout<< "n: ";
// usually enter 5 for test
cin>> n;
while (n>1){
power = pow(x,n);
end_n = end_n*n;
e= (power/end_n)+e;
n--;
}
final =e+x;
cout<< final;
return 0;
}
答案 0 :(得分:1)
老实说,我根本不知道你的推理是什么。特定扩展的代码非常简单:
double x;
cin >> x;
double oldres, res=1, top=1, bottom=1;
int iter=1;
do {
oldres=res; // to calculate the difference between iterations
++iter; // next iteration
top*=x; // multiply by one x for each iteration
bottom*=(iter-1); // multiply by the iteration number for each iteration
res+=top/bottom; // and add the fraction to the result
} while(fabs(res-oldres)>.1); // while the difference is still large
cout << res; // done, show the result
答案 1 :(得分:1)
要非常清楚别人暗示的事情:如果你的循环计算 up 从1到n,那么end_n
将等于n!在每一步。但倒计时,它并没有。看一下1到5的例子:
n | n!
1 | 1
2 | 2
3 | 6
4 | 24
5 | 120
n | end_n
5 | 5
4 | 20
3 | 60
2 | 120
1 | 120
由于绝对没有一个分母是正确的,如果你的代码只对某些输入错误,那就太惊讶了 - 实际上它可能只适用于x = 0。
最后,我希望这只是一次学习练习。如果你真的需要e ^ x的值,你应该使用exp(x)
。
答案 2 :(得分:0)
我认为你很亲密。也许你想要更像这样的东西:
#include <iostream>
#include <cmath>
using namespace std;
double factorial(long n)
{
double result = n;
while(--n) result*=n;
}
int main()
{
long n, power;
double final, e=1.0, x=2.0;
cout<< "n: ";
// usually enter 5 for test
cin>> n;
while (n>1)
{
power = pow((double)x, (double)n);
end_n = factorial(n);
e = (power/end_n)+e;
n--;
}
final = e+x;
cout<< final;
return 0;
}
答案 3 :(得分:0)
你实际上可以采用类似Horner的方案,以一种基本的方式使用倒计时
1 + x / 1! + x ^ 2/2! + x ^ 3/3! + ... + x ^ n / n! =(((((x / n + 1)* x /(n-1)+1)* x /(n-2)+ ...)* x / 1 + 1
e = 1.0;
while (n>0){
e = e*x/n + 1;
n--;
}
将e^x
和1/(e^-x)
的近似值与正x
进行比较,以确定其准确性。
探索(e^(x/4))^4
以获得更好的准确性。