优化在 C 中逼近欧拉数 (e) 的算法

Optimizing an algorithm that approximates the euler number (e) in C

首先,我在这里重新发明轮子。我知道欧拉数在 C 中有一个常数。因为我发现创建科学程序比任何其他类型的问题都容易,所以我用这些问题来练习并成为一名优秀的开发人员。

/* calculating euler number */

#include <stdio.h>
int fat(int x);
int main(void)

{
    int n; int y; double en = 1.0; //en = euler number
    
    printf("Entre com o valor de n para a aproximação do número de Euler: \n");//prompt
    scanf("%d", &n);//read n
    //n big enough -> aproximation for en is close of real value of euler number
    if (n < 0){ //if the user input a negative value
        printf("Error!\n");
    }
    else {//if the user is not a troll and enter a positive integer
        for (y = 1; y <= n; y++){ 
            en = en + (1.0/(fat(y))); // en = summation(1/fat(y))
            //printf("y = %d and en = %.9lf\n", y, en); this line is for studying when en return 'inf'

        }
        printf("O valor aproximado de e é aproximadamente %.9lf\n", en);//print euler number aproximation
    }
}
int fat(int x){//defining the factorial function
    int factorial = 1;
    int f;
    for (f = 1; f <= x; f++){
        factorial = factorial * f;
    }
    return factorial;
}

我编译和运行代码几次,我注意到近似值超过欧拉值n=19,en=2.718281835(最后两位数应该是28)。对于 n 大于 33,程序 returns en = inf。可能是因为 34 的阶乘对于我的代码来说已经太大了。

我的问题是:如何利用这段代码背后的思想,做出更优化的程序,例如不超过的算法欧拉数的值.

我知道,我的代码不是很好,但这是我在没有咨询任何东西的情况下设法构建的,除了一本关于如何获得欧拉数的数学书。提前致谢!

如果将此 1.0/(fat(y)) 存储在一个变量中,并按 ys 进行除法,则可以完全避免计算阶乘。
这样你应该只在你的数据类型的精度开始失败时遇到障碍。

double term = 1.0;
for (y = 1; y <= n; ++y){
    term /= y;
    en += term; // en = summation(1/fat(y))
}

否则通常的步骤会有所帮助,使用 wider/preciser 数据类型,例如 long int。但我想这不是您在这里寻找的优化方面。

请您尝试以下操作:

#include <stdio.h>
#include <stdlib.h>

int
main()
{
        int i, n;
        long double en = 1.0;   // Euler's number
        long double f = 1.0;    // factorial number

        printf("Enter the value of n to approximate Euler's number: ");
        scanf("%d", &n);

        if (n < 1) {
                printf("Error\n");
                exit(1);
        }

        for (i = 1; i <= n; i++) {
                f *= i;
                en += 1 / f;
        }
        printf("n = %d and en = %.9Lf\n", n, en);

        return 0;
}

它输出 n = 12:

n = 12 and en = 2.718281828

并为较大的 n 保持相同的 en 值。