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

标签 c++ loops constants factorial

我被要求创建一个简单的程序来计算 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!, 1/2!, 1/3!, ..., 1/i!] 并从末尾求和来实现。同时,您可能想要查看用于补偿舍入误差的算法。一个很好的引用是关于 Kahan summation algorithm 的维基百科文章.

  2. 您在计算阶乘方面所做的工作比您需要做的要多得多。每次通过外循环,您都需要计算 i 的阶乘,但是(除了第一次)您刚刚完成计算前一个值的阶乘 (i-1 )。因此,与其将 factorial 重置为 1 并运行内部循环,不如将先前的阶乘值乘以 i 即可完成。 (哦,在程序开始时将 factorial 初始化为 1 而不是 0。)

此外,我不确定“准确度”是否与“扩展中的术语数”相同。您可能想向要求您创建此程序的人澄清这一点。

关于使用循环计算 e 常数的 C++ 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39814214/

相关文章:

c - 修改 const char 数组引用的非常量 char 数组

c++ - std::function 作为 sighandler_t

c++ - 从模板成员类型派生模板化类的成员变量类型

loops - D语言循环计数器

c# - 异步循环等待完成再继续

javascript - ES6 值声明后如何判断它是否为 var/const/let?

opencv - OpenCV 中的 const Mat 引用有意义吗?

c++ - 使用 SWIG 处理 std::function

c++ - 为什么在另一个案例中允许在 block 内使用 case 语句?

javascript - 在继续循环之前让 SetTimeout 完成