Расчет серии в C - PullRequest
       9

Расчет серии в C

0 голосов
/ 21 ноября 2018

Это изображение - задача, которую я должен выполнить:

i should calculate this serie

Независимо от того, что я ввожу между -1 и 1, выходные значения всегда равны 1.0000 или 2.0000.Как я могу решить эту проблему?Ниже я приложил свой код.

#include <stdio.h>
#include <math.h>


int main() {

    int i;
    float x;
    float sum=0;


    printf ("enter an x\n");
    scanf ("%f",&x);

    if ((x>-1)&&(x<1))
    {
         for (i=0;i<101;i++)
         sum= sum + (pow(x,i));
    }    

    printf ("result=%f",sum);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Даже при использовании типа, подобного double, вам не хватает числовой точности для суммирования всех степеней до 100.

Выполнив следующий фрагмент, вы заметите,что, в то время как правильный (численно говоря) результат оценивается, цикл останавливается задолго до 100-й итерации, обычно в 16:

#include <stdio.h>
#include <math.h>
#include <float.h>

// Analytically calculates the limit for n -> inf of the series of powers
double sum_of_powers_limit(double x)
{
    return 1.0 / (1.0 - x);
}

int main(void)
{
    double x = 0.1;
    const int N = 100;
    double sum = 1.0;

    for (int i = 1; i <= N; ++i)
    {
        double old_sum = sum;
        sum = sum + pow(x,i);

        if (old_sum == sum)
        {
            fprintf(stderr, "Numerical precision limit reached at i = %d\n", i);
            break;
        }
    }

    printf("  result = %.*e\n", DBL_DECIMAL_DIG, sum);
    printf("expected = %.*e\n", DBL_DECIMAL_DIG, sum_of_powers_limit(x));

    return 0;
}

Также обратите внимание, что более эффективным способом оценки этого вида полиномов является метод Хорнера :

// Evaluates the sum s(x) = 1 + x + x^2 + ... + x^n using Horner's method
// It stops when it cannot update the value anymore
double sum_of_powers(double x, int n)
{
    double result = 1.0;
    for (int i = 0; i < n; ++i)
    {
        double old_result = result;
        result = 1.0 + x * result;

        if (old_result == result)
        {
            fprintf(stderr, "Numerical precision limit reached at i = %d\n", i);
            break;
        }
    }
    return result;
}
0 голосов
/ 21 ноября 2018
if ((x>-1)&&(x<1))

В этом случае ваш код будет работать только в том случае, если x равен нулю, поэтому попробуйте удалить оператор if и упомянуть, какой вывод вы ожидаете для данного конкретного ввода, будет немного полезнее ответить на него.

Попробуйте этот код:

#include <stdio.h> 
#include <math.h> 
int main() { 
    int i; float x; 
    float sum=0; 

    printf ("enter an x\n"); 
    scanf ("%f",&x); 
    for (i=0 ;i<101; i++) 
        sum+= (pow(x,i)); 

    printf ("result=%f",sum); 
    return 0;
}
...