【问题标题】:Python sum() returns negative value because the sum is too large for 32bit integerPython sum() 返回负值,因为总和对于 32 位整数来说太大了
【发布时间】:2012-10-03 19:48:10
【问题描述】:
x = [1, 2, 3, ... ]
y = sum(x)

x之和为2165496761,大于32位整数的限制 所以sum(x) 返回 -2129470535。

如何通过将其转换为长整数来获得正确的值?

这是我的进口清单:

import math, csv, sys, re, time, datetime, pickle, os, gzip
from numpy import *

【问题讨论】:

  • Python 可以处理任意大的数字;你的代码是什么?
  • x=[1,2,....] 是一长串整数,加起来是 2165496761。
  • 另一个不使用import *的理由...
  • @notilas 不,import * 是原因!你被它咬过一次,现在再也不要这样做了。

标签: python integer long-integer


【解决方案1】:

20 个 quatloos 说你正在使用 numpy 的求和函数:

>>> sum(xrange(10**7))
49999995000000L
>>> from numpy import sum
>>> sum(xrange(10**7))
-2014260032

所以我敢打赌你使用了from numpy import * 或者正在使用一些具有相同功能的界面。

要验证这一点,请尝试

print type(sum(x))

关于此线程其他地方发布的示例:

>>> sum([721832253, 721832254, 721832254])
-2129470535
>>> type(sum([721832253, 721832254, 721832254]))
<type 'numpy.int32'>

编辑:有人欠我 20 个 quatloos!要么不使用星号导入(最好),手动设置dtype

>>> sum([721832253, 721832254, 721832254],dtype=object)
2165496761L

或显式引用内置的sum(可能给它一个更方便的绑定):

>>> __builtins__.sum([721832253, 721832254, 721832254])
2165496761L

【讨论】:

  • ...似乎不是我们可以投票赞成的任何 quatloos 计数器...可能是对 SO 的值​​得改进。
【解决方案2】:

您获得此无效值的原因是您在int32 上使用了np.sum。没有什么能阻止您使用np.int32 而是使用np.int64np.int128 dtype 来表示您的数据。例如,您可以使用

x.view(np.int64).sum()

附带说明,请确保您从不使用from numpy import *。这是一种可怕的做法,你必须尽快改掉这种习惯。当您使用from ... import * 时,您可能会覆盖一些 Python 内置函数,这使得调试变得非常困难。典型的例子,你覆盖 summax 之类的函数...

【讨论】:

  • 我认为这里的问题可能适用于其他领域,例如 reduce(mul,[1,2,3,4,5...] ) ?在处理大型列表中的产品问题时如何解决此问题?
【解决方案3】:

Python 以任意精度处理大量数字:

>>> sum([721832253, 721832254, 721832254])
2165496761

总结一下吧!

为确保您不使用numpy.sum,请尝试使用__builtins__.sum()

【讨论】:

  • 我的回报是-2129470535。 Windows 64 机器
  • @notilas:那么您的x 不是您所期望的那样。 Python 整数支持与平台无关。
  • 我已将您的文本复制并粘贴到我的机器上。 “sum([721832253, 721832254, 721832254])”,它返回一个负值。
猜你喜欢
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
相关资源
最近更新 更多