可能的Python整数溢出错误

时间:2016-06-28 14:22:11

标签: python numpy

以下是我尝试运行以解决最大优先级产品问题的代码,即返回列表中两个数字的乘积的最大值。我的问题是,当输入列表中的数字很大时,正在计算的产品是不正确的。我认为错误中没有整数溢出,结果产品会自动长,但这种情况不会发生,因为我的乘法会返回某种垃圾。

#"python2"
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 28 17:12:38 2016

@author: pvatsa
"""
import numpy as np

n = int(raw_input())
alist = np.random.randint(100000, size = n)
print alist
assert(len(alist) == n)
alist = sorted(alist)
print alist
max_no = max(alist)
second_largest_no = alist[n-2]
print max_no*second_largest_no
#print long(product)
#print type(product)

1 个答案:

答案 0 :(得分:2)

使用np.random.randint将创建一个32位整数的数组:

>>> alist = np.random.randint(100000, size = n)
>>> alist.dtype
dtype('int32')

对它进行排序将保留该类型,创建一个numpy.int32对象列表,而不是将它们转换回Python(溢出安全)整数:

>>> foo = sorted(alist)
>>> type(foo[-1])
<type 'numpy.int32'>

因此,乘法可以溢出:您可以通过以下方式解决:

  • 将您的号码转换回Python数字
  • 首先有一长串

第一种情况只是转换感兴趣的价值:

>>> foo[-1] * foo[-2]
1386578402
>>> int(foo[-1]) * int(foo[-2])
9976512994L

第二种方法可以通过randint dtype=np.int64调用(对于numpy&gt; = 1.11)或之后转换数组来完成:

>>> llist = np.array(alist, dtype=np.int64)
>>> llist.sort()
>>> np.prod(llist[-2:])
9987503750