登陆

整数溢出是怎么回事?Python和Numpy的整数为何不一样?

admin 2019-10-28 220人围观 ,发现0个评论

某位 A 同学发了我一张截图,问为何成果中呈现了负数?

问题截图

看了图,我榜首感觉便是数据溢出了。数据超出能表明的最大值,就会呈现奇古怪怪的成果。

然后,他持续发了张图,内容是 print(100000*208378),便是直接打印上图的 E[0]*G[0],成果是 20837800000,这是个正确的成果。

所以新的问题是:如果说上图的数据溢出了,为何直接相乘的数却没有溢出?

因为我一向忽视数据的表明规矩(整型的上限是多少?),并且对 Numpy 了解不多,还错看了图中成果,误以为每一个数据都是过错的,所以就答复不出来。

最终,经过学习群里的一番评论,我才总算理解是怎么整数溢出是怎么回事?Python和Numpy的整数为何不一样?回事,所整数溢出是怎么回事?Python和Numpy的整数为何不一样?以本文把相关知识点做个整理。

在正式开端之前,先总结一下上图会引出的论题:

  • Python 3 中整数的上限是多少?Python 2 呢?
  • Numpy 中整数的上限是多少?呈现整数溢出该怎么办?

关于榜首个问题,先看看 Python 2,它有两种整数:

  • 一种是短整数,也即常说的整数,用 int 表明,有个内置函数 int()。其巨细有限,可经过sys.maxint() 检查(取决于渠道整数溢出是怎么回事?Python和Numpy的整数为何不一样?是 32 位仍是 64 位)
  • 一种是长整数,即巨细无限的整数,用 long 表明,有个内置函数 long()。写法上是在数字后边加大写字母 L 或小写的 l,如 1000L

当一个整数超出短整数规模时,它会主动选用长整数表明。举例,打印 2**100 ,成果会在结束加字母 L 表明它是长整数。

可是到了 Python 3,状况就不同了:它仅有一种内置的整数,表明为 int,形式上是 Python 2 的短整数,但实际上它能表明的规模无限,行为上更像是长整数。不管多大的数,结束都不需求字母 L 来作区别。

也便是说,Python 3 整合了两种整数表明法,用户不再需求自行区别,全交给底层按需处理。

理论上,Python 3 中的整数没有上限(只要不超出内存空间)。这就解说了前文中直接打印两数相乘,为什么成果会正确了。

PEP-237(Unifying Long安永 Integers an整数溢出是怎么回事?Python和Numpy的整数为何不一样?d Integers)中对这个改变作了阐明。它解说这样做的 意图:

这会给新的 Python 程序员(不管他们是否是编程新手)削减一项上手前要学的功课。

Python 在言语运用层屏蔽了许多琐碎的活,比方内存分配,所以,咱们在运用字符串、列表或字典等目标时,底子不必操心。整数类型的改变,也是出于这样的便当意图。(害处是献身了一些功率,在此就不谈了)

回到前面的第二个论题:Numpy 中整数的上限是多少?

因为它是 C 言语完成,在整数表明上,用的是 C 言语的规矩,也便是会区别整数和长整数。

有一种方法可检查:

import numpy as np
a = np.arange(2)
type(a[0])
# 成果:numpy.int32

也便是说它默许的整数 int 是 32 位,表明规模在 -2147483648 ~ 2147483647。

对照前文的截图,里边只要两组数字相乘时没有溢出:100007*4549、100012*13264,其它数据组都溢出了,所以呈现古怪的负数成果。

Numpy 支撑的数据类型要比 Python 的多,相互间的区别边界许多样:

numpy的数据类型

截图来历:https://www.runoob.com/numpy/numpy-dtype.html

要处理整数溢出问题,能够经过指定 dtype 的方法:

import numpy as np
q = [100000]
w = [500000]
# 一个溢出的比如:
a = np.array(q)
b = np.array(w)
print(a*b) # 发生溢出,成果是个古怪的数值
# 一个处理的比如:
c = np.array(q, dtype='int64')
d = np.array(整数溢出是怎么回事?Python和Numpy的整数为何不一样?w, dtype='int64')
print(c*d) # 没有溢出:[50000000000]

好了,前面提出的问题就答复完了。来作个结束吧:

  • Python 3 极大地简化了整数的表明,作用可表述为:整数就只要一种整数(int),没有其它类型的整数(long、int8、int64 之类的)
  • Numpy 中的整数类型对应于 C 言语的数据类型,每种“整数”有自己的区间,要处理数据溢出问题,需求指定更大的数据类型(dtype)
请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP