segmentation fault in pi calculation (python)

梦想的初衷 提交于 2019-12-02 00:07:07

问题


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

Anywhere past 85000 terms I get a segmentation fault and python quits. How can I avoid this? Why is it crashing? Can't it just please use more memory or something?


回答1:


You appear to have found a bug in eval where it can't handle insanely long expressions:

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

I use the phrase "insanely long" advisedly though. Don't do it that way, calculate the pieces as you go. There is no reason to be using eval in this situation.




回答2:


Why use eval() at all?

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

Does the exact same thing.



来源:https://stackoverflow.com/questions/5177432/segmentation-fault-in-pi-calculation-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!