Python内存错误,浮点溢出?
我正在做一个作业,要通过计算当 n
趋近于无穷大时的 (1+1/n)^n
来求出 e
的值。我知道这种方法很笨,但我必须这么做。
我需要测试的 n
的值可以大到 n = 10 ^20
。
但是我的程序在 10^7
时就因为内存错误崩溃了,我不太明白为什么。这是我的代码:
def pow(n):
p = (1.0 + 1.0/n)
for _ in range(1,n+1):
p = p * (1.0 + 1.0/n)
return p
def e(k):
print 'e with k =', k, 'is', pow(10**k)
map(e, range(1,21))
所以我想问的是,这里发生了什么?是我让 Python 存储 p
变量的地方溢出了?如果是这样的话,那得是非常大的,10^6
的长度是 1344
位。Python 是怎么处理浮点数的呢?
我还不能回答我自己的问题,所以我把它写出来了。
问题在于 range(10**7)
生成的列表对 Python 来说太大了。现在它的写法是这样的:
def pow(n):
p = (1.0 + 1.0/n)
c = 0
while (c < n):
p = p * (1.0 + 1.0/n)
c += 1
return p
def e(k):
print "e with k =", k, 'is', pow(10**k)
map(e, range(1,21))
1 个回答
0
你可能在用 Python 2,这时候 range
会生成一个列表。所以当你写 range(1,10**20)
的时候,其实是在试图创建一个有 10**20 个元素的列表,这个列表太大了,超出了你的内存承受能力。
相反,你可以用 xrange(1, n+1)
。然后去吃个午饭吧,因为这个循环要运行一段时间才能完成。(另外,你也可以改一下你的 pow
函数,让它用 (1.0+1.0/n)**n
来计算,而不是通过重复乘法手动计算指数。)