szukanie zaawansowane
 [ Posty: 4 ] 
Autor Wiadomość
Mężczyzna Offline
PostNapisane: 25 wrz 2009, o 18:11 
Użytkownik

Posty: 30
Lokalizacja: Kraków
Dostałem zadanie specjalne od nauczyciela informatyki, oczywiście się wywiązałem, za co zostałem nagrodzony. Dla własnej satysfakcji miałem jeszcze dopisać jedną funkcję. Ma ona sprawdzić dla ilu punktów stosunek równać się będzie faktycznej wartości Pi (przybliżyłem do 3.14159). Oczywiście tą funkcje też napisałem, ale pojawił się problem. Nie chce się ona zakończyć! Nawet przy kilkuset tysiącach punktów stosunek nie chce się równać liczbie pi. Dziwne... mam zatem pytanie czysto matematyczne: czy to w ogóle możliwe w sensie praktycznym, aby tym sposobem uzyskać liczbę Pi w zaokrągleniu 3.14159? Załączam mój kod. Chodzi konkretnie o funkcję "xxx".

//OBLICZANIE LICZBY PI METODĄ MONTE CARLO

#include <iostream>
#include <cstdlib>

using namespace std;

void wylicz(long licznik_kwadr, long licznik_kol, double x, double y, int n);
int xxx(long licznik_kwadr, long licznik_kol, double x, double y);
//***************************************************************
int main()
{
srand(time(NULL));
long licznik_kwadr, licznik_kol;
int n, ile;
double x, y;

cout<<"Ile razy wykonac operacje?\t";
cin>>ile;

for(int i=0; i<ile; i++)
wylicz(licznik_kwadr, licznik_kol, x, y, n);

cout<<endl<<"Pi rowne jest 3.14159 dla : "
<<xxx(licznik_kwadr, licznik_kol, x, y)<<" punktow.";

cout<<"\n\n\n";
system("PAUSE");
return EXIT_SUCCESS;
}
//**************************************************************
void wylicz(long licznik_kwadr, long licznik_kol, double x, double y, int n)
{
licznik_kwadr = 0;
licznik_kol=0;
n=rand();
for( ; licznik_kwadr<n; licznik_kwadr++)
{
x=(double)rand()/(RAND_MAX);
y=(double)rand()/(RAND_MAX);

if((x*x)+(y*y)<=1)
licznik_kol++;
}
cout<<endl<<"Dla "<<n<< " punktow liczba pi wynosi "<<(double)(4*licznik_kol)/licznik_kwadr<<endl;
}
//***************************************************************
int xxx(long licznik_kwadr, long licznik_kol, double x, double y)
{
const double pi = 3.14159;
licznik_kwadr = 0;
licznik_kol=0;
do {
x=(double)rand()/(RAND_MAX);
y=(double)rand()/(RAND_MAX);
licznik_kwadr++;

if((x*x)+(y*y)<=1)
licznik_kol++;
}while ((double)(4*licznik_kol)/licznik_kwadr != pi);
return licznik_kwadr;
}
Góra
Mężczyzna Offline
PostNapisane: 25 wrz 2009, o 18:31 
Gość Specjalny
Avatar użytkownika

Posty: 4613
Lokalizacja: Wrocław
Jeśli nie działa dla kilkuset tysięcy to sprawdź dla kilku milionów, aż do skutku. To nie jest zbyt dokładna metoda. Sprawdź jaką dokładność osiąga dla tej ilości punktów którą stosujesz. Może też być kłopot z błędami zaokrągleń itp.
Góra
Mężczyzna Offline
PostNapisane: 27 wrz 2009, o 14:27 
Użytkownik

Posty: 4
Lokalizacja: Kraków
Kod:
1
}while ((double)(4*licznik_kol)/licznik_kwadr != pi);


Ta linijka psuje Ci wszystko. Pamiętaj, że operujesz na liczbach zmiennoprzecinkowych, i że chcesz przerwać w momencie, w którym wynik będzie się zgadzał na pierwszych 5-6 pozycjach po przecinku. Ja bym ten warunek zamienił na jakiś taki:

Kod:
1
2
3
4
#include <cmath>
...
}while(fabs( aktualny_wynik - pi) > 1e-6);


P.s Ten kod który wrzuciłeś może się nie kończyć także z powodu linjki:
Kod:
1
n=rand();

w funkcji wylicz:)
Góra
Mężczyzna Offline
PostNapisane: 29 wrz 2009, o 21:01 
Użytkownik

Posty: 30
Lokalizacja: Kraków
kalq, dzięki wielkie, zmieniłem na ten warunek z "fabs" i działa. Cholera, że ja na to nie wpadłem :D Jeszcze raz dzięki.
Góra
Utwórz nowy temat Odpowiedz w temacie  [ Posty: 4 ] 


 Zobacz podobne tematy
 Tytuł tematu   Autor   Odpowiedzi 
 liczby pierwsze
Kto mi przedstawi najszybszy algorytm na sprawdzenie czy liczba x jest liczba pierwsza. ...
 Anonymous  4
 Obliczanie wyznacznika macierzy (z def.)
Witam... mam niestety mały problem ostatnio. Od niedawna w javie pracuje i jeszcze gubie się. Czy ktoś może mi nasunąc pomysł lub pomóc w napisaniu programu. Niestety matematyka nie jest moją mocną stroną!! Obliczanie wyznacznika macierz...
 Anonymous  1
 [MPI] Metoda Cannona
Witam. Poszukuje programu w C, pracujacego w MPI, ktory mnozy dwie macierze metoda Cannona. Sama metoda mnozenia jest latwa, ale nie moge poradzic sobie z implementacja. Moze ktos to pisal dla siebie lub na zaliczenie? Jak ktos nie chce zapodac za ...
 Anonymous  0
 ZAMIANA systemow liczbowych, liczby niecalkowite.
witam, mamy na infie zamiane systemow liczbowych i tlumaczy go emerytowana babcia na zastepstwie z kartki tak ze nikt tego nie rozumie, moglby ktos to wyjasnic w 3 slowach ? bo kiedys wiem ze to kumałem, wystarczy ze chociaz poda 3 przyklady np po bi...
 bisz  1
 Liczby binarne...wartosci po przecinku
Moze mi ktos wyjasnic jak zamienia sie liczbe 51,27 na binarna jaka jest metoda czy wpierw zamieniamy 57 na binarne a pozniej 27 bo nie mam pojecia jak to zrobic...
 moczul  5
 dziwne liczby ?
Na studiach mam przedmiot o nazwie arytmetyka komputerów. Moje pytania nie dotyczą elektroniki tylko rachunków. Co to są liczby zmiennoprzecinkowe. Jak wykonuje się działania na liczbach zmniennoprzecinkowych? Co to jest i jak wykonać dzielenie bez ...
 vip_9999_vip  5
 pierwiastek n stopnia z liczby rzeczywistej dodatniej
Chciałbym wiedzieć jak ktoś rozwiąże następujące zadanie: Napisać funkcję(funkcja napisana w pascalu), która oblicza pierwiastek stopnia n(n naturalne i niezerowe) z liczby rzeczywistej dodatniej(chodzi tu o algorytm)....
 kwadrat1  1
 liczby zmienno i stałoprzecinkowe
mam gorąca prośbę, czy może mi ktoś tak krótko i prosto napisać co to sa liczby stało i zmiennoprzcinkowe. Too jest jedno z zagadnień do opracowania na egzamin z informatyki a nie rozumiem definicji które do tej pory znalazłem... Za wszelką pomoc se...
 =jazzownik=  3
 [Pascal] sprawdzanie czy p jest kwadratem liczby nat.
To co w temacie czyli po prostu nie wiem jak napisac taki algorytm ktory sprawdzalby czy dana liczba p jest kwadratem innej liczby naturalnej. Prosiłbym o jakis kod źródłowy albo przynajmniej o wskazowki ...
 matti  2
 Co to są liczby zmiennopozycyjne?
jak w temacie proszę o szybką odpowiedz...
 piotrzed  2
 Algorytm obliczania liczby Fibonacciego
Narysuj schemat blokowy algorytmu opartego na programowaniu dynamicznym dla obliczenia liczby Fibonacciego. F(n)= dla n...
 petro  1
 Minimalizacja liczby przecięć krawędzi przy rysowaniu gra
Witam, Czy zajmował się ktoś badaniem planarności grafów lub minimalizacją liczby przecięć krawędzi grafu? Jesli tak, to bardzo prosze o jakieś namiary na materiały na ten temat. Szczególnie przydatne byłyby kody źródłowe C, C++ lub Java. Przeglądałe...
 UNIX_admin  0
 metoda Newtona
podaj 3 przybliżenia \sqrt{3} metodą Newtona dla x_{0}=1...
 Hania_87  9
 metoda Newtona - zadanie 2
zadania 1 Zastosuj metodę Newtona do równania 4x - sin&#40;x&#41; = 4 w przedziale i wyznacz przyblizone rozwiazanie z dokładnoscia do czterech miejsc dziesietnych. zadanie 2[...
 Hania_87  1
 Liczby zmiennoprzecinkowe w delphi.
Mam do napisania taki oto program: Liczby rzeczywiste zakodowane w formacie zmiennoprzecinkowym należą do skończonego zbioru wartości. Czyli jest tak mała liczba dodatnia, że mniejsza od niej jest zerem. Program wyznacza metodą numeryczną (trzeba ją...
 pover  4
 
Atom [Regulamin Forum] [Instrukcja LaTeX-a] [Poradnik] [Reklama] [Kontakt]
Copyright (C) ParaRent.com