2011-01-19 10 views
7

Zaimplementowałem serię Madhava-Leibniz, aby obliczyć pi w Pythonie, a następnie w Cython, aby poprawić prędkość. Wersja Python:Obliczenia w języku Cython są niepoprawne

from __future__ import division 
pi = 0 
l = 1 
x = True 
while True: 
    if x: 
     pi += 4/l 
    else: 
     pi -= 4/l 
    x = not x 
    l += 2 
    print str(pi) 

wersja Cython:

cdef float pi = 0.0 
cdef float l = 1.0 
cdef unsigned short x = True 
while True: 
    if x: 
     pi += 4.0/l 
    else: 
     pi -= 4.0/l 
    x = not x 
    l += 2 
    print str(pi) 

Kiedy zatrzymał wersji Pythona to było poprawnie obliczoną PI 3.141592. Wersja Cythona ostatecznie zakończyła się 3.141597 z kilkoma dodatkowymi cyframi, których nie pamiętam (mój terminal się zawiesił), ale były niepoprawne. Dlaczego obliczenia wersji Cythona są nieprawidłowe?

Odpowiedz

18

Używasz float w wersji Cython - to jest single precision! Zamiast tego użyj double, co odpowiada float Pythona (co jest zabawne). Typ C float ma tylko około 8 cyfr dziesiętnych, podczas gdy double lub float Pythona ma około 16 cyfr.

-1

Skąd wiadomo, kiedy to się skończy? Czy uważasz, że wartość dla pi oscyluje wokół wartości rzeczywistej i można by się spodziewać, że jeśli zatrzymasz kod w pewnym momencie, możesz mieć wartość, która jest zbyt wysoka (lub zbyt niska)?

0

Jeśli chcesz zwiększyć prędkość, trzeba pamiętać, że można uprościć przez logikę rozwijając swoją pętlę raz, tak jak poniżej:

cdef double pi = 0.0 
cdef double L = 1.0 

while True: 
    pi += 4.0/L - 4.0/(L+2.0) 
    L += 4.0 
    print str(pi) 

Należy również pamiętać, że nie trzeba zadzwonić drukować wewnątrz pętli - go prawdopodobnie zabiera dziesięć razy więcej czasu niż pozostałe obliczenia.

Powiązane problemy