Python的总和()返回负值,因为总和是32位整数太大(Python sum() returns

2019-09-23 11:09发布

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 *

Answer 1:

为什么你这个无效值的原因是,你使用np.sumint32 。 没有什么能阻止你使用np.int32np.int64np.int128 dtype来表示你的数据。 例如,您可以只使用

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

在一个侧面说明,请确保你永远不会使用from numpy import * 。 这是一个可怕的做法,你必须得到尽快摆脱尽可能的习惯。 当您使用from ... import * ,你可能会覆盖一些Python内置插件,这使得调试变得非常困难。 典型的例子,你像功能覆盖summax ...



Answer 2:

二十quatloos说你正在使用numpy的SUM函数:

>>> 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'>

编辑:有人欠我二十quatloos! 要么不使用进口星(最好),手动设置的dtype

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

或参考内置sum明确地(可能赋予它一个更方便的结合):

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


Answer 3:

Python的处理具有任意精度的大数:

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

只是总结起来!

为了确保您不使用numpy.sum ,尝试__builtins__.sum()来代替。



文章来源: Python sum() returns negative value because the sum is too large for 32bit integer