Аппроксимация степенного ряда с использованием цикла do-while - C - PullRequest
0 голосов
/ 10 сентября 2018

Название почти самоочевидно. Я пытался приблизить ряд, который мог бы быть записан как f (x) = x¹ / (1x2) -x³ / (3x4) + x ^ (5) / (5x6) + ... с условием, что сумма должна прекратиться когда модуль термина ниже допуска, введенного пользователем. Так, например, если x = 0,5 и допуск = 0,01, результат должен быть 0,239583, потому что это сумма первых двух слагаемых (оба выше 0,01). Код ниже вычисляет только первый член, а затем останавливает цикл по какой-то причине, которую я не смог понять. Как поступить?

int main()
{
    double x, e, result=0, term;
    int i=1;

    printf("Write some value to x: ");
    scanf("%lf", &x);

    if(x<-1 || x>1)
    {
        printf("Invalid number");
    }

    else
    {
        printf("Write the tolerance: ");
        scanf("%lf", &e);

        do
        {
            term=(pow(x, 2*i-1)*pow(-1, i+1))/((2*i-1)*(2*i));
            result+=term;
            i+=1;
        }
        while(abs(term)>=e);

        printf("The result is: %.6lf", result);
    }

    return 0;
}

1 Ответ

0 голосов
/ 10 сентября 2018
Функция

abs() взята из stdlib.h и имеет подпись int abs(int x).Поскольку вы вызываете его с плавающей точкой, номер усекается.В этом случае усеченное число равно 0, что меньше допуска, поэтому цикл завершается преждевременно.

Вы хотите использовать fabs(), версию с плавающей запятой abs(), которая приходитот math.h.Имеет подпись double fabs(double x)

...