wzór Wallisa na obliczanie liczby PI

0

Witam!

Mam do napisania program:

Liczbę PI
2 można wyznaczyć stosując wzór Wallisa będący iloczynem nieskończonym, danym wzorem:

http://imageshack.us/f/535/wzorx.png/

Napisać funkcję pi wyznaczającą przybliżoną wartość liczby PI przy pomocy iloczynu n (gdzie n jest parametrem
funkcji) kolejnych czynników ze wzoru Wallisa.
W funkcji main wywołać funkcję pi dla n=1000. Wynik zwrócony przez funkcję wypisać na konsolę.
Prawidłowo napisana funkcja, dla n=1000 przybliża wartość PI z dokładnością do 2 miejsc po przecinku.

No i robie coś takiego:


#include <iostream>
#include <cstdlib>

using namespace std;

long PI(long iloczyn)
{
	long mianownik, licznik, n,j;
	
	licznik = ((2*i)*(2*i));
	mianownik = ((2*i-1)*(2*i+1));
	
	for (j=1; j < n; j++)
	{
		iloczyn= licznik/mianownik;
	
	}



	return iloczyn;
}





int main()
{
	int n;
	
	cout << "Podaj parametr funkcji: ";
	cin >> n;
	
	cout << PI(n);





system("PAUSE");
}

Jak ten program doprowadzić do użyteczności?

0

pi nie jest liczbą całkowitą, więc wypadałoby żeby funkcja też nie zwracała ani nie obliczała liczby całkowitej jako wyniku :P

0

raz policzyłeś licznik i mianownik (z nie wiadomo jakiego i) , a w pętli nic się z nimi nie dzieje
pętla kręci się do n
iloczyn ten zbiega się bardzo wolno, uwaga na zakres int, bo już 46341^2 == -2147479015 (minus!!)

0

Spoko juz udało mi się to zrobić:) Załączam kod:

#include <cstdlib>
#include <iostream>
#include <math.h>

using namespace std;

double PI(double n)
{
    double mianownik, licznik, i;
    
    double iloczyn= 1;
    
    
    for ( i= 1; i<=n; i++)
    {
        licznik =  (4*i*i);
        mianownik = ((2*i)-1)*((2*i)+1);
       iloczyn *= (licznik/mianownik);
        
        
    }
    
    
    
    
    return (2*iloczyn);
};





int main()
{
    cout << "Wzor Wallisa na PI" << endl << endl;
    
    unsigned int n = 1000;
    cout.precision(3);
    cout << endl;
    cout << PI(n) << endl;
    
    
    
    
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
0

ups

0

chyba zbyt dosłownie potraktował moją uwagę :P to co jest liczbą całkowitą powinno być całkowitą (licznik np.)

0

Hehehe no lepiej tutaj pasuje liczba podwójnej precyzji xd ważne ,że działa i nie bedziemy się tu rozdrabniać nad tym ;d jutro musze kolejne milion programów ogarnąć ;/

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