Policzenie wartości matematycznej liczby Pi według wzoru

0

Mam takie zadanko:
Policzyć wartość matematycznej liczby Pi według wzoru
Pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - …
Sumowanie wykonywać do momentu, gdy ostatni dodany (odjęty) wyraz
postaci 1/n jest mniejszy niż wprowadzona liczba epsilon.

I wymodziłem coś takiego:

#include <iostream>

using namespace std;

double epsilon, n, pi=0;
int i, j;


int main()
{
    n=1.0/epsilon;
    cout<<"Obliczanie wartosci liczby Pi."<<endl;
    cout << "Podaj epsilon (im mniejszy, tym z wieksza dokladnoscia obliczona zostanie liczba Pi): " << endl;
    cin>>epsilon;

for (i=1, j=0;  i>n; i=i+2, j=j+1)
{
    if ((j%2)==0) pi=pi+(1.0/i); else pi=pi-(1.0/i);
}
    cout<<"Pi wynosi: "<<4*pi;
    return 0;
}

Niestety, wywala mi, że Pi=0. Natomiast gdy wpiszę do for np. i<10000 zamiast i>n, to wyskakuje dobry wynik (3,14139). Tak więc domyślam się, że coś jest nie tak z tym moim warunkiem, ale dlaczego?

wstawienie kodu do posta - @furious programming

1

Masz zmienną globalną

epsilon 

która jest inicjalizowana zerem, a w main robisz n=1.0/epsilon

1

Jeszcze nie wiesz jaki jest epsilon a już robisz

n = 1.0 / epsilon;

Do tego

for (i=1, j=0;  i>n; i=i+2, j=j+1)

mówi: póki i większe od n zwiększ i.

Poza tym wklej kod bezpośrednio do posta.

0

Nadal nie działa :(. Jeśli wpiszę do epsilon wartość "1", to wyskakuje, że pi=4, czyli git. A jak wpiszę "0,1" albo "0,01" to kursor przechodzi do nowej linii.

#include <iostream>

using namespace std;

double epsilon, pi=0;
int i, j;


int main()
{
    cout<<"Obliczanie wartosci liczby Pi."<<endl;
    cout << "Podaj epsilon (im mniejszy, tym z wieksza dokladnoscia obliczona zostanie liczba Pi): " << endl;
    cin>>epsilon;

for (i=1, j=0;  (1.0/i)>=epsilon; i=i+2, j=j+1)
{
    if ((j%2)==0) pi=pi+(1.0/i); else pi=pi-(1.0/i);
}
    cout<<"Pi wynosi: "<<4*pi;
    return 0;
}
0

W warunku pętli jest coś w stylu: "Jeśli x jest większe od y, to zwiększaj x". To chyba tak nie działa.

1

Polecam kropkę zamiast przecinka: 0.001

0

Hm, to jak inaczej można to zrobić?

@up
Działa z kropką :D dzięki za pomoc.

Mam jeszcze jedno pytanko. Na necie znalazłem tak zrobiony program (tylko tutaj wykonuje się pętla tyle razy, ile zazyczy sobie uzytkownik, ale to nvm):

#include <iostream>

using namespace std ;

int main( void ) {
  int n; double pi=0 ;
  cin >> n ;
  for( int i=1, j=0 ; i<n+1; i+=2, j+=1 ) {
    j%2 ? pi-=1.0/i : pi+=1.0/i ;
  }
  cout << 4*pi << endl ;
  return 0 ;
}
 

Tutaj jest zrobione tak, że jak "j" jest podzielne przez 2 to wtedy odejmie, a przeciez powinno chyba dodać? Bo nie wiem, czy ja mam nie do końca dobrze zrobiony program, czy ten przykład jest źle (no, jest jeszcze opcja, że czegoś tu nie czaję :)). Ale pętla zaczyna się od j=0 (podzielne przez 2), nie inkrementuje się od razu do j=1, prawda? Więc najpierw powinno dodać (rownanie zaczyna się od "1" a nie "-1"). Dobrze rozumuję? :)

1

j % 2 ? jest równoważne (j % 2) != 0 ?, czyli warunek jest odwrotny do tego w Twoim programie.

0

Wszystko jasne i wszystko działa. Dzięki :).

0

A tak (wg mnie) to powinno wyglądać:

#include <iostream>
using namespace std;
 
int main()
  {
   double epsilon=1E-7,four=-4,pi=0;
   for(unsigned i=1;epsilon*i<1;i+=2) pi+=(four*=(-1))/i;
   cout<<"Pi wynosi: "<<pi<<endl;
   return 0;
  }

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