2011-03-03 62 views
3
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退出。我怎样才能避免这种情况?它为什么会崩溃?不能只是使用更多的内存或东西?pi计算中的段错误(python)

+0

gdb说什么? –

+0

什么是“gdb”? – tekknolagi

+0

[gnu debugger](http://www.gnu.org/software/gdb/) – NullUserException

回答

5

你似乎已经发现了一个bug在eval它不能处理疯狂长的表达式:

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

我使用短语“疯长”深思熟虑虽然。不要这样做,随着时间的推移计算碎片。在这种情况下没有理由使用eval

+0

哇谢谢:)现在我正在尝试返回seq作为int,得到一个语法错误,在飞行中计算 – tekknolagi

+0

我不能相信我没有用飞行而不是用eval来计算:O – tekknolagi

+0

我见过一些东西关于这之前,它并没有真正被认为是一个错误,因为程序员滥用eval。 –

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 

确实是一样的东西。