Программирование e^x бесконечной серии

Мне нужно найти значение 1+x/1!+x^2/2!+.....

Вот мой код:

void main()
{
  long int a, i = 0;
  double p, e, x, sum = 1, t = 1;

  printf("Enter desired number of decimal places\n");
  scanf("%d", &a);

  printf("Enter x\n");
  scanf("%d", &x);

  e = pow(10, -a);

  do
  {
    t = x * t / (double) (i + 1);
    sum = sum + t;
    p = fabs(t);
    i++;
    printf("Sum is %ld\n", sum);
  } while ((p > e) && (i < 10000));
}

Моя логика для программы такова:

Я позволяю пользователю вводить x и точность (a). Моя ошибка 10^(-a). я мой счетчик. сумма моя сумма ряда. t обозначает мои термины.

Я начинаю с t=1 и использую рекурсию t=(x*t)/(double)(i+1). [Примечание: поскольку i — это int, а t — это double, здесь я выполняю преобразование типов.]

Например, если я выбираю x=5, то инициализируется t=1. Затем я получаю t=5/1=5. Сумма инициализируется как 1. Таким образом, теперь сумма становится суммой = 1 + 5 = 6. Тогда я становится 1. Итак, t становится 5 * 5/2 = 12,5. Итак, моя сумма теперь должна быть 6 + 12,5.... Таким образом, теперь она должна идти в моей части do {}.

Теперь для части while p — это абсолютное значение t. Разница между суммой (n+1) терминов и n терминов составляет этот p. Итак, когда мое p будет меньше e, я должен получить желаемую сумму, верно? В случае, если ряд расходится, чтобы избежать бесконечного цикла, я позволяю части do {} работать только до тех пор, пока мой i‹10000.

Ошибка, которую я получаю каждый раз, когда запускаю эту программу, заключается в том, что я получаю сумму как 0. Как это вообще возможно, когда я инициализировал сумму как 1?

Пожалуйста, помогите мне, где я ошибаюсь. Я новичок в программировании.


person Diya    schedule 16.01.2015    source источник
comment
Этот scanf ("%d",&x); выглядит уродливо (потому что x является double).   -  person alk    schedule 16.01.2015
comment
Также вы можете скомпилировать с символами (-g для gcc) и запустить свой код в отладчике (gdb для gcc) и выполнить его построчно, проверяя значения любых соответствующих переменных, и вы можете получить просветление.   -  person alk    schedule 16.01.2015
comment
Также^2: Здесь не нужно приводить: t=x*t/(double)(i+1);   -  person alk    schedule 16.01.2015
comment
Что означает e в заголовке вашего вопроса?   -  person alk    schedule 16.01.2015
comment
@alk Конечно, e означает e (математическая константа)   -  person chux - Reinstate Monica    schedule 16.01.2015
comment
Что случилось с математическим образованием, что люди не знают, что такое «е» - en.wikipedia.org/ вики/МДМА   -  person Ed Heal    schedule 17.01.2015


Ответы (2)


Изменить это

scanf("%d", &x);

стать таким:

scanf("%lf", &x);

по крайней мере, использовать x, который вы намереваетесь, и не провоцировать неопределенное поведение.

Для prinf()ing sumвы также не должны использовать d, а f для double. Здесь нет необходимости в модификаторе длины l, так как вместо printf() f означает double. Странно, но это так.

printf("Sum is %f\n", sum);

Также вы подаете в суд на неправильный спецификатор преобразования для сканирования в a, which is along`, поэтому он должен быть:

scanf("%ld", &a);

Также^2 это (как минимум) int main(void).

Из стандарта C11:

5.1.2.2.1/1 Запуск программы

Функция, вызываемая при запуске программы, называется main. Реализация не объявляет прототип для этой функции. Он должен быть определен с возвращаемым типом int и без параметров:

int main(void) { /* ... */ }

или с двумя параметрами (обозначаемыми здесь как argc и argv, хотя можно использовать любые имена, поскольку они являются локальными для функции, в которой они объявлены):

int main(int argc, char *argv[]) { /* ... */ }


Также^3 в вашем фрагменте кода отсутствуют соответствующие заголовочные файлы.


И последнее замечание: компилируйте со всеми предупреждениями и относитесь к ним серьезно.

person alk    schedule 16.01.2015
comment
Вероятно, вы захотите сделать то же самое с оператором printf в конце. - person alarge; 16.01.2015
comment
Да, я добавил заголовочные файлы stdio, conio, math. Я внес изменения, но я все еще получаю сообщение об ошибке. Теперь это POW: Overflow. сумма=6.00000 для х=5. Кроме того, не могли бы вы объяснить, почему я должен использовать int main() вместо void main()? - person Diya; 17.01.2015
comment
почему [...] используйте int main () вместо void main ()? посмотрите мой обновленный ответ. @Дия - person alk; 17.01.2015

В этом ответе я использовал десятичные разряды как для форматирования терминов, так и для проверки сходимости ряда путем форматирования суммы в виде строки, которая в любом случае необходима для ее форматирования для вывода.

#include <stdio.h>
#include <string.h>

int main ()
{
    double sum=1, term=1;
    int n=1, x=1, dp=0;
    char current[50]="", previous[50]="";

    printf ("Enter number of decimal places: ");
    scanf ("%d", &dp);
    printf ("Enter x: ");
    scanf ("%d", &x);
    printf ("Series for x=%d to %d decimal places\n", x, dp);

    do {
        strcpy (previous, current);
        sprintf (current, "%-10.*f", dp, sum);
        printf ("Term = %-10.*f Sum = %s\n", dp, term, current);
        term = term * (double)x / (double)n;
        sum += term;
        n++;
    } while (strcmp(previous, current));
    return 0;
}

Я должен был проверить результат scanf(). Вывод программы

Enter number of decimal places: 2
Enter x: 2
Series for x=2 to 2 decimal places
Term = 1.00       Sum = 1.00
Term = 2.00       Sum = 3.00
Term = 2.00       Sum = 5.00
Term = 1.33       Sum = 6.33
Term = 0.67       Sum = 7.00
Term = 0.27       Sum = 7.27
Term = 0.09       Sum = 7.36
Term = 0.03       Sum = 7.38
Term = 0.01       Sum = 7.39
Term = 0.00       Sum = 7.39
person Weather Vane    schedule 16.01.2015