Wyliczanie liczby Pi

0

Cześć
Czy macie jakiś pomysł na wyliczanie liczby Pi z nieskończoną dokładnością, ale w ten sposób, żeby dzialić pracę pomiędzy kilka komputerów tzn. jest komputer 1 (serwer), komputer 2, komputer 3 i komputer 4 - klienci?
Klienci podłączają się do serwera, a serwer wysyła do klienta, który się do niego (serwera) podłącza, którą część liczby Pi ma wyliczyć ten komputer.
Właśnie jest głównie problem z tym, że jak policzyć trzecie i czwarte miejsce po przecinku liczby Pi nie znając pierwszego i drugiego miejsca po przecinku liczby Pi tzn. np. komputer 2 ma wykonać obliczenie 3,xx gdzie xx oznacza dwie liczby po przecinku, a w tym samym czasie serwer przydzela komputerowi 3 wyliczenie liczby 3,yyxx gdzie yy jest nie znaną liczbą, a xx jest liczbą do wyliczenia przez ten komputer, który dostaje zadanie wyliczenia xx (yy wylicza w tym czasie inny komputer).
Dryobates rownież myśli nad tym projektem, ale jak na razie mamy problem z rozwiązaniem tego "zadania" więc liczymy na Waszą pomoc
Z góry dzięki za odpowidzi.
:)

Jakby ktoś nie wiedział to chodzi tu o projekt typu [email protected] Wykorzystanie klastrów. Problem statnowi też ograniczony rozmiar rejestrów procesora.

0

Ja proponuję tak:

  1. liczymy PI z rozwinięcia pewnego nieskończonego ciągu (nie pamietam go, ale Dryo na pewno zna)
  2. używamy na przykład stringów zamiast liczb
  3. wysyłamy do kompów odpowiednie dane:
    klient 1
0

Ja proponuję tak:

  1. liczymy PI z rozwinięcia pewnego nieskończonego ciągu (nie pamietam go, ale Dryo na pewno zna)

Po uproszczeniu i przerobieniu dla strawnej postaci dla praktycznie każdego procesora (a przy tym dosyć szybkie):
Pi := 4;
y := 1; x := 1;
while True do
{
z := y

0

hmm rozwiazanie jesli nie zwróci, jest proste dwa lub więcej kompów liczą to samo, a program serwerowy sprawdza wyniki, i ewentualnie daje czas jakiś względny na dokonanie obliczeń, jesli po przekroczeniu tego czasu nic nie dostanie znaczy ze cos jest nie tak ...

0

<font color="darkblue">Ja bym proponował:
Aby każdy "człon" był liczony <font color="red">conajmniej</span> 2* przez <font color="red">rórzne</span> kompy (tak dla sprawdzenia :-) )
Zapisywać liczby w postaci <font color="red">dwóch</span> stringów (ułamek) gdzie w jednym stringu byłby licznik a w drugim mianownik.
Należało by zacząć od zrobienia odpowiednich typów i funkcji na nich <font color="red">operójących</span> [stuk] </span>

0

Troszkę czytałem ostatnio na ten temat. Jeżeli chodzi o rozwinięcie w systemie binarnym (lub 16), to bardzo łatwo można wyznaczyć pojedyncze n-te cyfry rozwinięcia. Wystarczy wykorzystać algorytm BBP. Okazuje się jednak, że jak na razie nie ma sprawnie działającego algorytmu wyznaczającego takie rozwinięcie dziesiętne.
Trzeba sumować różne części (ew. mnożyć). Metod wyznaczania Pi jest wiele, ale praktycznie wszystkie wymagają możliwości wykonywania operacji na liczbach nieskończonych, a co najgorsze, to wśród tych operacji zawsze jest dzielenie, które dość cieżko jest przerobić na dzielenie dowolnej precyzji.
Tak więc na razie trzeba skupić się na operacjach na liczbach o nieskończonej precyzji (jest taki moduł do Delphi, więc chyba będę musiał go przeanalizować).

0

Dobra. Najlepszy algorytm jaki znalazłem to BBP (przy 6 iteracjach już 9 miejsc po przecinku jest poprawnych). Cały problem ograniczas się tutaj do liczenia na dużych liczbach. A najgorsze z tego to dzielenie.

for i := 0 to inf do
Pi := Pi + (4/(i shl 3 + 1)-2/(i shl 3 + 4)-1/(i shl 3 + 5)-1/(i shl 3 + 6))/(1 shl (i shl 2));

Dodawanie, odejmowanie oraz przesunięcia bitowe nieskończonej precyzji zaimplementować jest bardzo łatwo. Największy problem jest z dzieleniem.
Jeżeli ktoś ma pomysł jak to wydajnie robić to proszę zgłaszać pomysły w tym temacie: http://4programmers.net/Forum/viewtopic.php?id=38133

Taka mała uwaga: jakby komuś zechciało to się wkleić do Delphi to niech zmieni (1 shl (i shl 2)) na Power(16, i), ponieważ typ Integer jest zbyt mało dokładny i nie uzyskacie większej dokładności niż do 3 miejsc po przecinku. Z funkcją Power można uzyskać dokładność do 14 miejsc po przecinku (inf >= 9)

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