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:
- obliczającą sumę szeregu w oparciu o standardową funkcję podnoszenia do potęgi pow;
- 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