ошибка сегментации в вычислениях пи (python) - PullRequest
3 голосов
/ 03 марта 2011
def pi(times):
    seq = []
    counter = 0
    for x in range(times):
        counter += 2
        seq.append("((%f**2)/(%f*%f))*"%(float(counter), float(counter-1), float(counter+1)))
    seq.append("1.0")
    seq = "".join(seq)
    seq = eval(seq)
    return seq*2

В любом случае после 85000 сроков я получаю ошибку сегментации и Python завершает работу.Как я могу избежать этого?Почему это сбой?Разве это не может пожалуйста использовать больше памяти или что-то еще?

Ответы [ 2 ]

5 голосов
/ 03 марта 2011

Вы, кажется, нашли ошибку в eval, когда она не может обработать безумно длинные выражения:

>>> eval("1.0*"*10000+"1.0")
1.0
>>> eval("1.0*"*100000+"1.0")
# segfault here

Я все же осторожно использую фразу "безумно долго". Не делай так, просчитывай куски по ходу дела. Нет смысла использовать eval в этой ситуации.

2 голосов
/ 03 марта 2011

Зачем вообще использовать eval()?

def pi(times):
    val = 1
    counter = 0
    for x in range(times) :
        counter += 2
        val *= float(counter)**2/(counter**2 - 1)
    return val * 2

Делает одно и то же.

...