[C] Obliczanie eksponenty przy użyciu szeregu

Michal99
Użytkownik
Użytkownik
Posty: 95
Rejestracja: 12 wrz 2010, o 17:27
Płeć: Mężczyzna
Podziękował: 49 razy

[C] Obliczanie eksponenty przy użyciu szeregu

Post autor: Michal99 »

Witam. Mam za zadanie porównać wyniki z wartością zwracaną przez funkcję exp() z modułu math.h z szeregiem potęgowym.

\(\displaystyle{ e ^{x}=1+ \frac{x}{1!}+ \frac{x^2}{2!} +...+ \frac{x^n}{n!}}\)

Mój kod wygląda tak:

Kod: Zaznacz cały

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int silnia(int n)
{
	if(n==0)
		return 1;
	else
		return silnia(n-1)*n;
}
float funkcja(float x, float n)
{
	int t, v=0, suma=0, a;
	for(t=0; t<=n; t++)
	{
		for(a=0; a<=n; a++)
		{
			v=pow(x,t)/(silnia(a));
			suma=suma+v;
			
		}
	}
		return suma;
}
int main(void)
{
	float n, x, w, p;
	printf("Podaj x i n 
");
	scanf("%f %f" ,&x ,&n);
	w=exp(x);	
	printf("Exponenta do potegi %f wynosi %f 
",x , w);
	p=silnia(n);
	printf("Silnia z %f wynosi;% f 
",n, p);
	printf("Exponenta przedstawiona za pomoca szeregu potegowego wynosi %f
", funkcja(x,n));

	system("pause");
	return(0);
}
Proszę o wskazówki, dlaczego po wpisaniu wartości x=1, n=1 funkcja zwraca mi wartość 4.
Ostatnio zmieniony 14 cze 2014, o 15:50 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Obliczanie eksponenty przy użyciu szeregu

Post autor: kalwi »

bo źle przemyślałeś program. Dla (1,1) funkcja zwraca:

\(\displaystyle{ \frac{1^0}{0!} + \frac{1^1}{0!} + \frac{1^0}{1!} + \frac{1^1}{1!}}\)


stąd owy wynik. Dla innych danych też będzie zły wynik, bo masz

Kod: Zaznacz cały

int suma
a funkcja zwraca wartość typu float, więc dochodzi do utraty danych

-- 14 cze 2014, o 15:39 --

wystarczy drobna poprawka:

Kod: Zaznacz cały

float funkcja(float x, float n)
{
	float v = 0, suma = 0, a;
		for (a = 0; a <= n; a++)
		{
			v = pow(x, a) / (silnia(a));
			suma = suma + v;
	}
	return suma;
}
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C] Obliczanie eksponenty przy użyciu szeregu

Post autor: Dasio11 »

Przy okazji, nie warto wydzielać silni do osobnej funkcji, bo wtedy każda wartość musi się liczyć od początku. A przecież można byłoby obliczać je po kolei, następna z poprzedniej. Podobnie z pow(x, t).
ODPOWIEDZ