简体   繁体   中英

segmentation fault in pi calculation (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

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?

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM