我正在使用python3和numpy版本1.8.2(与numpy 1.10.4和python2相同的问题)并尝试做一些非常基本的事情:乘以两个整数。
import numpy as np
a = 9223372036854775808
type(a)
b = np.int64(0)
type(b)
type(b*a)
然而输出是:
builtins.int
numpy.int64
numpy.float64
所以两个整数的乘法返回一个浮点数!有没有合理的解释呢?
请注意,如果我改为
a = 9223372036854775807
type(b*a)
返回
numpy.int64
如果我把它提升到
a = 92233720368547758100
type(b*a)
返回(在python3中)
builtins.int
和(在python2中)
long
据我所知,必须有一些溢出,但为什么?
答案 0 :(得分:1)
实际上这是非常好的观察和质疑。这是一个快速类比:
import numpy as np
a = 9223372036854775808
请注意,您越过int
限制,它正在进入long int
范围
的输出
a
将生成9223372036854775808L
的输出
type(a)
将生成<type 'long'>
在下面的情况中,我们将继续int
限制
a = 9223372036854775807
此处
a
将输出返回为9223372036854775807
type(a)将输出返回为
<type 'int'>
让我们假设b = np.int64(1)
。我将解释为什么我采用np.int64(1)
代替np.int64(0)
b*a
返回9.2233720368547758e+18
,如您所见,它以欧拉形式的小数表示。
type(b*a)
返回np.float64
因此,由于上述原因,它被转换为float,即np.float(64)。 Euler形式的数字总是需要其表示的浮点/小数点
将b
视为np.int64(1)
的原因:如果是np.int64(0)
,您将永远不会注意到输出,因为结果将全部为0
答案 1 :(得分:0)
这个答案并不是真正的答案:试图更好地理解这个问题!
使用Python 2.7.13我得到了
In [24]: a = 9223372036854775808; type(a)
Out[24]: long
在python 3.6.0中我得到了
In [24]: a = 9223372036854775808; type(a)
Out[24]: int
这与以下事实是一致的:即使在Python3中表现得像long一样,long仍被称为int。
这可能是报告错误问题的一部分吗?如果我们继续使用Python2,那么你在执行乘法时可以查看存储在变量中的值类型的numpy错误吗? 考虑
In [11]: type(int(9223372036854775807))
Out[11]: int
In [12]: type(int(9223372036854775808))
Out[12]: long
In [13]: a = 9223372036854775808
In [14]: b = np.int64(0)
In [15]: type(9223372036854775808 * np.int64(0))
Out[15]: long
In [16]: type(b*a)
Out[16]: numpy.float64
In [17]: type(long(9223372036854775808) * np.int64(0))
Out[17]: long
In [18]: type(int(9223372036854775808) * np.int64(0))
Out[18]: long
In [19]: type(np.int64(9223372036854775808) * np.int64(0))
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-18-93a64125698a> in <module>()
----> 1 type(np.int64(9223372036854775808) * np.int64(0))
OverflowError: Python int too large to convert to C long
号码9223372036854775808存储时间长。
第15行处理器说&#34;很长一段时间int64很长,因为它是最大的容器&#34;。
第16行处理器看到一个as int并且说&#34; int次np.int64是np.int64因为我喜欢将它存储为numpy类型,因为你调用它,但是等等...... 9223372036854775808不能留在int64,所以我现在遇到了麻烦(意想不到的麻烦,因为它只在使用numpy类型时才会发生 - 第19行)。然后我把自己置于&#34;麻烦模式&#34;默认情况下将结果存储在我拥有的最大numpy容器中,即float64&#34; 。
在Python3中,第15行和第16行的行为有所不同:numpy始终处于&#34;故障模式&#34;因为long类型总是被检测为int:
In [10]: type(9223372036854775808 + np.int64(0))
Out[10]: numpy.float64
In [11]: type(a*b)
Out[11]: numpy.float64