Funkcja obliczająca eksponentę

Awatar użytkownika
Harry Xin
Użytkownik
Użytkownik
Posty: 545
Rejestracja: 9 sie 2007, o 19:15
Płeć: Mężczyzna
Podziękował: 148 razy
Pomógł: 83 razy

Funkcja obliczająca eksponentę

Post autor: Harry Xin »

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

\(\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;
}
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

Funkcja obliczająca eksponentę

Post autor: spajder »

a po co te dwa przypadki? bez ifa funkcja działa bardzo dobrze
Awatar użytkownika
Harry Xin
Użytkownik
Użytkownik
Posty: 545
Rejestracja: 9 sie 2007, o 19:15
Płeć: Mężczyzna
Podziękował: 148 razy
Pomógł: 83 razy

Funkcja obliczająca eksponentę

Post autor: Harry Xin »

No faktycznie. Nie wiem jak to się stało, ale dopisałem go później bo mi coś nie chodziło. W każdym razie dzięki.
Ostatnio zmieniony 7 gru 2008, o 10:47 przez Harry Xin, łącznie zmieniany 1 raz.
Xitami

Funkcja obliczająca eksponentę

Post autor: Xitami »

Kod: Zaznacz cały

a=x; 
i=1;
e=1+x;
while(abs(a)>eps) {
	i++;
	a*= x/i;
	e+= a;
}
ODPOWIEDZ