2011-03-03 54 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 

確實是一樣的東西。