为什么 np.array([1e5])**2 和 np.array([100000])**2 在 Python 中结果不同?
有人能告诉我为什么 np.array([1e5])**2
和 np.array([100000])**2
不是一样的吗?我来自Matlab,觉得这很困惑!
>>> np.array([1e5])**2
array([ 1.00000000e+10]) # correct
>>> np.array([100000])**2
array([1410065408]) # Why??
我发现这种情况从1e5开始,下面的代码给出了正确的结果:
>>> np.array([1e4])**2
array([ 1.00000000e+08]) # correct
>>> np.array([10000])**2
array([100000000]) # and still correct
2 个回答
2
你的系统默认使用的是np.int32,这种类型无法处理100000**2
这个计算结果。如果你使用64位的精度,就没问题了:
In [6]: np.array([100000], dtype=np.int32)**2
Out[6]: array([1410065408], dtype=int32)
In [7]: np.array([100000], dtype=np.int64)**2
Out[7]: array([10000000000])
默认使用的是32位还是64位,取决于你安装的numpy版本。
7
1e5
是一个浮点数,而 10000 是一个整数:
In [1]: import numpy as np
In [2]: np.array([1e5]).dtype
Out[2]: dtype('float64')
In [3]: np.array([10000]).dtype
Out[3]: dtype('int64')
但是在 numpy 里,整数的位数是固定的(和 Python 自身的整数不同,Python 的整数可以是任意长度的),所以当整数的值超过了允许的最大值时,它们就会“溢出”。
(注意,在你的情况下,你使用的是 32 位的版本,所以实际上后者会给你 dtype('int32')
,它的最大值是 2**32-1=2,147,483,647,大约是 2e9,这个值小于 1e10。)