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

C++ Program to Calculate e constant using loops

我被要求创建一个简单的程序来通过询问值 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. 您的"not correct"可能是舍入误差造成的。对正数的递减序列求和时,从小到大求和总能减少舍入误差。您可以通过计算数字数组 [1/1!, 1/2!, 1/3!, ..., 1/i!] 并从末尾求和来实现。同时,您可能想要查看用于补偿舍入误差的算法。 Kahan summation algorithm.

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

此外,我不确定 "degree of accuracy" 是否与 "number of terms in the expansion" 相同。您可能想向要求您创建此程序的人澄清这一点。