Python中计算圆周率出现段错误
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
。