使用循环计算e常量的C ++程序

时间:2016-10-02 05:43:26

标签: c++ loops constants factorial

我被要求创建一个简单的程序,通过询问值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;
}

1 个答案:

答案 0 :(得分:3)

有两个需要改进的方面:

  1. 你的&#34;不正确&#34;可能是由舍入错误引起的。在对正数的递减序列求和时,通过从最小值到最大值求和,您总是具有较少的舍入误差。您可以通过计算数字数组[1/1!,1 / 2,1 / 3!,...,1 / i!]并从末尾求和来完成此操作。同时,您可能希望查看用于补偿舍入误差的算法。关于Kahan summation algorithm

  2. 的维基百科文章是一个很好的参考
  3. 你正在做更多的计算阶乘的工作而不是你需要做的事情。每次通过外循环,您需要计算i的阶乘,但是(除了第一次)您刚刚完成计算前一个值的阶乘(i-1)。因此,不要将factorial重置为1并运行内循环,只需将前一个阶乘值乘以i即可。 (哦,并在程序开始时将factorial初始化为1而不是0。)

  4. 另外,我不确定&#34;准确度是否&#34;与&#34;扩展中的术语数量相同&#34;。您可能想要与任何要求您创建此程序的人一起澄清。