Что не так с моим кодом: неверное значение выводится, когда я пытаюсь вычислить число Эйлера e в C?

Я пытаюсь приблизить число Эйлера в C, используя цикл, который заканчивается, когда разница между двумя последовательными значениями e меньше 0,0000001. Значение, которое я получаю, составляет 2,99. Я попытался настроить его так, чтобы на каждой итерации e сравнивалось с предыдущим собственным значением (содержащимся в e1), а если разница больше 0,0000001, добавляется еще один член 1/(п!). В чем проблема? Я новичок в программировании, поэтому любые советы / критические замечания приветствуются.

#include <stdio.h>
int main()
{
    float e1 = 0, e2 = 1;
    int n = 1, nfact; 

    while ((e2 - e1) > 0.0000001)         
    {
        e1 = e2;   
        nfact = 1;
        for (int count = 1; count < n; count++)     
        {
            nfact = n * count;
        }
        n = n + 1;
        e2 = e1 + (1.0 / nfact);
    }   

    printf("Approximated value of e = %f", e2);
    return 0;
}

3 ответа

Решение
nfact = 1;
for (int count = 1; count < n; count++)     
{
    nfact = n * count;
}

не рассчитать n!,
nfact получает абсолютно новое значение на каждой итерации. Конечно, вы имеете в виду

nfact = 1;
for (int count = 2; count <= n; count++)     
{
    nfact *= count;
}

Это не то, как вы вычисляете факториал числа:

for (int count = 1; count < n; count++)     
{
   nfact = n * count;
}

Обратите внимание, что вы всегда назначаете nfact на каждой итерации до значения n*count, стирая предыдущее значение nfact, Этот кусок кода эквивалентен:

nfact = n*(n-1);

Так как это последнее значение count,

Я думаю, что вы хотели это вместо этого:

nfact = n;
for (int count = n-1; count > 0; count--)     
{
    nfact = nfact * count;
}

Это мой код для оценки значения математической константы e по формуле: e = 1 + 1/1! + 1/2! + 1/3! +....

#include <stdio.h>

int main(void) {

    int n = 0;          /* loop counter for accuracy */
    int accuracy = 10;  /* current n factorial */
    int fact = 1;       /* degree of accuracy */
    double e = 0;       /* current estimated value of e */

/ * цикл до степени точности */

    while (n <= accuracy) {

        if (n == 0) {
            fact *= 1;
        } else {
            fact *= n;
        }
        e += 1.0 / fact;

        ++n;

    }

    printf("e is %f", e);

    return 0;
}
Другие вопросы по тегам