\(\displaystyle{ E(x)=1+ \frac{x^{1}}{1!}+ \frac{x^{2}}{2!}+ \frac{x^{3}}{3!}+...+ \frac{x^{i}}{i!}+...}\).
Obliczenia należy zakończyć dla wyrazu o numerze \(\displaystyle{ i}\), dla którego \(\displaystyle{ \left| \frac{x^{i}}{i!} \right| < EPS}\), gdzie \(\displaystyle{ EPS=1E-8}\) jest stałą w programie (obliczanie \(\displaystyle{ e^{x}}\) z dokładnością \(\displaystyle{ EPS=10^{-8}}\)).
Zrealizować dwa warianty funkcji:
a) obliczający sumę szeregu w oparciu o standardową funkcję podnoszenia do potęgi pow (to zrobiłem);
b) 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);
Mam problem z podpunktem b (przepisałem a, żeby było widać że mam sobie poradzić bez pow). Mój program działa dla \(\displaystyle{ [-1, )}\). No ale nie wiem czemu szwankuje dla ujemnych. ;/
Proszę o jakieś wskazówki.
Oto kod:
Kod: Zaznacz cały
#include<iostream.h>
#include<conio.h>
#include<math.h>
double E(double x, double eps);
void main()
{
clrscr();
double x;
const double eps=1E-8;
cout << "Podaj x: ";
cin >> x;
cout << "Suma szeregu wynosi: " << E(x,eps) << endl;
cout << "Standardowa funkcja exp(x) podaje nastepujacy wynik: " << exp(x) << " .";
}
double E(double x, double eps)
{
double e=1;
int k;
if(x>=0)
{
for(double a=x,i=1,silnia=1,licznik=x;fabs(a)>=eps;i++)
{
silnia*=i;
licznik=x;
for(k=1;k<i;k++) licznik*=x;
a=licznik/silnia;
e+=a;
}
}
else
{
for(double a=1.0/x,i=1,silnia=1,mianownik=x;fabs(a)>=eps;i++)
{
silnia*=i;
mianownik=x;
for(k=1;k<i;k++) mianownik*=x;
a=1.0/(mianownik*silnia);
cout << "a: " << a << endl;
e+=a;
}
}
return e;
}