Obliczanie szeregu - przypomnienie czystego C

0

Cześć,

ostatnio chcę sobie przypomnieć programowanie w czystym C i postanowiłem robić listy zadań z laboratorium z uczelni. Zadanie brzmi tak:

Opracować funkcję, która dla 'x' rzeczywistego oblicza sumę szeregu:

E(x) = 1 + x1/1! + x2/2! + x3/3! + ... +xi /i! + ... .

Obliczenia należy zakończyć dla wyrazu o numerze 'i', dla którego | xi / i! | < EPS, gdzie EPS=1E-8 jest stałą w programie (obliczanie ex z dokładnością EPS=10-8).

Zrealizować dwa warianty funkcji:

  1. obliczającą sumę szeregu w oparciu o standardową funkcję podnoszenia do potęgi pow;
  2. obliczającą sumę szeregu bez użycia funkcji pow.

Porównać wyniki z wartościami otrzymanymi za pomocą standardowej funkcji exp(x).
Prototyp funkcji: double E(double x, double eps);

I zrobiłem to tak:

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

//  Funkcja potegi systemowa
double E(double x, double eps){
    unsigned long long int i=1,s=1;
    double w=1,a=0;

    do{
        s=s*i;
        w=w+pow(x,i)/s;
        a=fabs(pow(x,i)/s);
        i++;
    }while(a>=eps);
    return w;
}

//  Bez funkcji systemowej potegi
double E_noPow(double x, double eps){
    unsigned long long int i=1,s=1;
    double w=1,a=0,p=1,j;
    do{
        s=s*i;
        for(j=1;j<=i;j++)p=p*x;
        w=w+p/s;
        a=fabs(p/s);
        i++;
        p=1;
    }while(a>=eps);
    return w;
}

int main(void)
{
    double x,e;
    const double EPS=1E-8;
    printf("Podaj 'x':"); scanf("%lf",&x);
    e=E_noPow(x,EPS);
    printf("Wynik: %.10lf\n",e);
    printf("Exp:   %.10lf\n\n",exp(x));
    
    return 0;
}

Pytanie moje jest takie: Czy da się to zrobić tak, żeby silnia liczona powyżej nie przekraczała zakresu typu? Ustawiłem już unsigned long long int ale to jest za mało. Czy w ogóle dobrze zrozumiałem zadanie i autor też mógł liczyć się z przepełnieniem zakresu typu?

Do x<=3 działa. Dla 4 już niestety silnia przekracza zakres typu.

Pozdrawiam
Grzegorz

0

Zadanie jest bez sensu. Kolejny wyraz ciągu to poprzedni wyraz * x/i ? Tak powinieneś to liczyć. Bez żadnych silni i cudów na kiju.

1 użytkowników online, w tym zalogowanych: 0, gości: 1