Что не так с моим кодом: неверное значение выводится, когда я пытаюсь вычислить число Эйлера 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;
}