2012-01-25 10 views
12

Myślałem o tym problemie i nie mogę tego rozgryźć. Być może możesz mi pomóc. Problem polega na tym, że mój kod nie pracuje nad wyprowadzeniem 1000 cyfr pi w języku programowania Pythona.1000 cyfr pi w pytonie

Oto mój kod:

def make_pi(): 
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3 
    while True: 
     if 4 * q + r - t < m * t: 
      yield m 
      q, r, t, k, m, x = (10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x) 
     else: 
      q, r, t, k, m, x = (q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2) 

digits = make_pi() 
pi_list = [] 
my_array = [] 
for i in range(1000): 
    my_array.append(str("hello, I'm an element in an array \n")) 
big_string = "".join(my_array) 

print "here is a big string:\n %s" % big_string 

wiem, kod ten można przymocować do pracy, ale nie jestem pewien, co do ustalenia ... Instrukcja print mówiąc tutaj jest duży ciąg i my_array.append(str("hello, im an element in an array \n)) jest tylko wypełniacz na teraz. Wiem, jak cały kod jest używany do pracy, ale jak już powiedziałem wcześniej, nie mogę zrobić tego, by strzelać z tego kodu.

+1

że wygląda jak wersja algorytmu bosego Pi, to jest w rzeczywistości? –

+2

Czy możesz być trochę bardziej zrozumiały, na czym polega problem; jak zachowanie różni się od tego, czego się spodziewałeś? –

+4

Kod wygląda podejrzanie [jak tutaj kod] (http://www.daniweb.com/software-development/python/code/216718) i [tutaj] (http://mail.python.org/pipermail/edu -sig/2006-July/006810.html). –

Odpowiedz

13

Run to

def make_pi(): 
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3 
    for j in range(1000): 
     if 4 * q + r - t < m * t: 
      yield m 
      q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x 
     else: 
      q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2 


digits = make_pi() 
pi_list = [] 
my_array = [] 

for i in make_pi(): 
    my_array.append(str(i)) 

my_array = my_array[:1] + ['.'] + my_array[1:] 
big_string = "".join(my_array) 
print "here is a big string:\n %s" % big_string 

i przeczytać yield operatora stąd: What does the "yield" keyword do in Python?

Oto odpowiedź:

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337 
+1

Mam szalony pomysł, aby zmienić Raspberry Pi w obliczanie liczby pi w wielu milionach miejsc, pozwalając jej działać przez 24 godziny na dobę przez 7 dni w tygodniu. Informacje przedstawione w tym pytaniu/odpowiedzi wydają się bardzo pomocne. Dzięki za zamieszczenie tego. Uruchomiłem kod w zakresie 50000 i zakończyłem, ale nie wiem, czy jest on dokładny. Nie wygenerowano błędów. Konieczne jest ustalenie, jak radzić sobie z ładowaniem częściowych wyników na dysk, zamiast utrzymywać je w pamięci. – WyomingGeezer

+2

"dla j w zakresie (1000)" powoduje, że generuje on mniej niż 1000 cyfr. To powinno zostać zmienione z powrotem na "while True" lub inny warunek. –

+1

Naprawdę nie podoba mi się ten kod, fist - zmieniasz funkcję "make_pi" z pewnymi ograniczeniami, nawet nie próbując wyodrębnić jej do parametrów, ale nawet to nie jest potrzebne - make_pi() zwraca generator i możesz go odczytać za pomocą. next() tyle razy, ile chcesz, po drugie, dlaczego wywołać make_pi dwa razy? – Jerzyk

0

Nie znam twojego algorytmu. Czy jest to implementacja BBP?

W każdym przypadku twój make_pi jest generatorem. Spróbuj użyć go w pętli for:

for digit in make_pi(): 
    print digit 

pamiętać, że ta pętla jest nieskończona: make_pi() nigdy rzuca StopIteration

0

robi tego, czego chcesz?

i = 0; 
pi_str = "" 
for x in make_pi(): 
    pi_str += str(x) 
    i += 1 
    if i == 1001: 
     break 

print "pi= %s.%s" % (pi_str[0],pi_str[1:]) 
25

Jeśli nie chcą wprowadzić własny algorytm, możesz użyć mpmath.

try: 
    # import version included with old SymPy 
    from sympy.mpmath import mp 
except ImportError: 
    # import newer version 
    from mpmath import mp 
mp.dps = 1000 # set number of digits 
print(mp.pi) # print pi to a thousand places 

Reference

Aktualizacja:. Kod obsługuje starsze i nowsze instalacje SymPy (patrz comment) *

+0

woot! Dziękuję Ci! – necromancer

+2

Po zainstalowaniu programu sympy w środowisku takim, jak te utworzone przez anakondę, zainstalowana zostanie osobno 'mpmath', a instrukcja importu stanie się' from mpmath import mp'. Kod w tej odpowiedzi nie działa już w przypadku współczesnych wersji 'sympy'. Nie ma już "sympy.mpmath". – Zelphir

1

Tutaj możesz sprawdzić, czy Twoje wyjścia programu poprawne 1000 cyfry: http://spoj.com/CONSTANT

Oczywiście możesz używać także diff lub tc, ale musisz je skopiować 1000 cyfr skądś i tam właśnie przesyłasz swój program i sprawdzasz, czy wynik jest większy niż 999.

Możesz spróbować wydrukować jeszcze więcej cyfr i zdobyć więcej punktów. Być może spodoba ci się to.

-1

Oto inny sposób, który znalazłem tutaj ->Python pi calculation? w celu przybliżenia Pythona na podstawie formuły braci Chudnovsky'ego do generowania Pi, które mam zmodyfikowane do mojego programu.

def pifunction(): 
    numberofdigits = int(input("please enter the number of digits of pi that you want to generate")) 
    getcontext().prec = numberofdigits 

def calc(n): 
    t = Decimal(0) 
    pi = Decimal(0) 
    deno = Decimal(0) 
    k = 0 
    for k in range(n): 
     t = (Decimal(-1)**k)*(math.factorial(Decimal(6)*k))*(13591409+545140134*k) 
     deno = math.factorial(3*k)*(math.factorial(k)**Decimal(3))*(640320**(3*k)) 
     pi += Decimal(t)/Decimal(deno) 
    pi = pi * Decimal(12)/Decimal(640320**Decimal(1.5)) 
    pi = 1/pi 
    return str(pi) 
print(calc(1)) 

Mam nadzieję, że to pomoże, ponieważ można wygenerować dowolną liczbę cyfr pi, które chcesz wygenerować.

+0

Jeśli usunę pierwsze "def pifunction():", aby działało bez błędu składni, odpowiedź jest dokładna tylko do około 13 miejsc: 3.1415926535897342076 –

0

Formularz wallis można uzyskać do 3.141592661439964, ale aby rozwiązać ten problem, potrzebna jest bardziej wydajna metoda.

https://www.youtube.com/watch?v=EZSiQv_G9HM

and now my code 
x = 2 
y = 3 
summing = 4 
for count in range (0,100000000): 
    summing *= (x/y) 
    x += 2 
    summing *= (x/y) 
    y += 2 
print (summing)