Вопрос

Я внедрил серию Мадхавы -Лейбниц для расчета PI в Python, а затем в цинтоне, чтобы улучшить скорость. Версия 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)

Версия цинтона:

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 с некоторыми более цифрами, которые я не помню (мой терминал разбился), но были неверными. Почему расчеты цинтона неверны?

Это было полезно?

Решение

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

Другие советы

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

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)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top