我被要求创建一个简单的程序来计算 e,方法是询问一个值 i(准确度),然后使用公式 1 +1/1! + 1/2! + 1/3! +⋯+1! 我得到一个非常接近的值,但它仍然不正确。我哪里出错了,有什么方法可以改进代码?
#include <iostream>
using namespace std;
int main()
{
double e=0.0;
double factorial=0;
int i=0;
int j,k=0;//counter variables
cout<<"Enter degree of accuracy: ";
cin>>i;
for(j=0;j<=i;j++) //for loop to calculate 'e'
{
factorial=1; //To reset factorial to 1 for every value of j
for(k=1;k<=j;k++)//for loop to calculate factorial
{
factorial*=k;
}
e+=(1/factorial);
}
cout<<"Value for e given i: "<<e<<endl;
system("pause");
return 0;
}
最佳答案
两个需要改进的地方:
您的“不正确”可能是由舍入误差引起的。对正数的递减序列求和时,从小到大求和总能减少舍入误差。您可以通过计算数字数组 [1/1!, 1/2!, 1/3!, ..., 1/i!] 并从末尾求和来实现。同时,您可能想要查看用于补偿舍入误差的算法。一个很好的引用是关于 Kahan summation algorithm 的维基百科文章.
您在计算阶乘方面所做的工作比您需要做的要多得多。每次通过外循环,您都需要计算
i
的阶乘,但是(除了第一次)您刚刚完成计算前一个值的阶乘 (i-1
)。因此,与其将factorial
重置为 1 并运行内部循环,不如将先前的阶乘值乘以i
即可完成。 (哦,在程序开始时将factorial
初始化为 1 而不是 0。)
此外,我不确定“准确度”是否与“扩展中的术语数”相同。您可能想向要求您创建此程序的人澄清这一点。
关于使用循环计算 e 常数的 C++ 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39814214/