Python中计算圆周率出现段错误

3 投票
2 回答
660 浏览
提问于 2025-04-16 12:53
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 个回答

2

为什么要使用 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

它的功能完全一样。

5

看起来你发现了一个关于eval的bug,它无法处理超长的表达式:

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

不过我说“超长”这个词是很谨慎的。其实不应该这样做,应该分段计算。这个情况下没有必要使用eval

撰写回答