2011-01-19 15 views
7

Implementé la serie Madhava-Leibniz para calcular pi en Python, y luego en Cython para mejorar la velocidad. La versión de Python:Los cálculos de Cython son incorrectos

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) 

la versión 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) 

Cuando se detuvo la versión de Python que se había calculado correctamente pi a 3.141592. La versión de Cython finalmente terminó en 3.141597 con algunos dígitos más que no recuerdo (mi terminal se bloqueó) pero eran incorrectos. ¿Por qué los cálculos de la versión Cython son incorrectos?

Respuesta

18

Estás utilizando float en la versión Cython - ¡eso es single precision! Use double en su lugar, que corresponde a float de Python (curiosamente). El tipo C float solo tiene aproximadamente 8 dígitos decimales significativos, mientras que double o Python float tienen alrededor de 16 dígitos.

-1

¿Cómo sabes cuándo está terminado? ¿Ha considerado que el valor de pi oscilaría sobre el valor verdadero, y esperaría que si detuvo el código en algún momento, podría tener un valor que es demasiado alto (o demasiado bajo)?

0

Si desea aumentar la velocidad, tenga en cuenta que puede simplificar la lógica desenrollando su bucle una vez, así:

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) 

También tenga en cuenta que usted no tiene que llamar a imprimir dentro del bucle - es probablemente tome diez veces más que el resto del cálculo.

Cuestiones relacionadas