Python内存错误,浮点溢出?

0 投票
1 回答
588 浏览
提问于 2025-04-17 22:35

我正在做一个作业,要通过计算当 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 来计算,而不是通过重复乘法手动计算指数。)

撰写回答