Расчеты Cython неверны - PullRequest
       9

Расчеты Cython неверны

7 голосов
/ 19 января 2011

Я реализовал серию Мадхава – Лейбница для вычисления числа пи в Python, а затем в Cython для повышения скорости.Версия Python:

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)

Версия 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)

Когда я остановил версию Python, он правильно вычислил pi до 3.141592.Версия Cython в итоге оказалась на 3.141597 с еще несколькими цифрами, которые я не помню (мой терминал потерпел крах), но были неверными.Почему расчеты версии Cython неверны?

Ответы [ 3 ]

18 голосов
/ 19 января 2011

Вы используете float в версии Cython - это одинарная точность ! Вместо этого используйте double, что соответствует Python float (как ни странно). Тип C float имеет только около 8 значащих десятичных цифр, тогда как double или Python float имеют около 16 цифр.

0 голосов
/ 19 января 2011

Если вы хотите увеличить скорость, обратите внимание, что вы можете упростить логику, развернув цикл один раз, например так:

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)

Также обратите внимание, что вам не нужно вызывать print внутри цикла -это, вероятно, занимает в десять раз больше времени, чем остальные вычисления.

0 голосов
/ 19 января 2011

Как вы узнаете, когда это закончится? Рассматривали ли вы, что значение для pi будет колебаться относительно истинного значения, и вы ожидаете, что, если вы остановите код в какой-то момент, вы можете получить значение, которое является слишком высоким (или слишком низким)?

...