我被要求创建一个简单的程序,通过询问值i(准确度)然后使用公式1 +1/1来计算e! + 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;
}
答案 0 :(得分:3)
有两个需要改进的方面:
你的&#34;不正确&#34;可能是由舍入错误引起的。在对正数的递减序列求和时,通过从最小值到最大值求和,您总是具有较少的舍入误差。您可以通过计算数字数组[1/1!,1 / 2,1 / 3!,...,1 / i!]并从末尾求和来完成此操作。同时,您可能希望查看用于补偿舍入误差的算法。关于Kahan summation algorithm。
你正在做更多的计算阶乘的工作而不是你需要做的事情。每次通过外循环,您需要计算i
的阶乘,但是(除了第一次)您刚刚完成计算前一个值的阶乘(i-1
)。因此,不要将factorial
重置为1并运行内循环,只需将前一个阶乘值乘以i
即可。 (哦,并在程序开始时将factorial
初始化为1而不是0。)
另外,我不确定&#34;准确度是否&#34;与&#34;扩展中的术语数量相同&#34;。您可能想要与任何要求您创建此程序的人一起澄清。