Python 的整数与 Numpy 的数据溢出

本文探讨了Python中整数溢出的情况,指出Python 3的整数类型没有明确上限,而Numpy中的整数类型遵循C语言规则,可能导致溢出。通过查看Numpy的dtype,可以发现其整数表示范围。解决Numpy中的溢出问题需指定合适的数据类型。

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

看了图,我第一感觉就是数据溢出了。数据超出能表示的最大值,就会出现奇奇怪怪的结果。

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

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

由于我一直忽视数据的表示规则(整型的上限是多少?),而且对 Numpy 了解不多,还错看了图中结果,误以为每一个数据都是错误的,所以就解答不出来。

最后,经过学习群里的一番讨论,我才终于明白是怎么回事,所以本文把相关知识点做个梳理。

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

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

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

sys.maxint()

当一个整数超出短整数范围时,它会自动采用长整数表示。举例,打印 2**100 ,结果会在末尾加字母 L 表示它是长整数。

但是到了 Python 3,情况就不同了:它仅有一种内置的整数,表示为 int,形式上是 Python 2 的短整数,但实际上它能表示的范围无限,行为上更像是长整数。无论多大的数,结尾都不需要字母 L 来作区分。

也就是说,Python 3 整合了两种整数表示法,用户不再需要自行区分,全交给底层按需处理。

理论上,Python 3 中的整数没有上限(只要不超出内存空间)。这就解释了前文中直接打印两数相乘

### Python 整数的使用操作 #### 1. **整数的基础特性** Python 中的 `int` 类型是一个非常重要的数据类型,用于存储不带小数部分的数值。在 Python 3 中,所有的整数都统一为一种类型——`int`[^1]。这种设计使得开发者无需关心底层实现细节,因为 Python 自动管理内存分配以及大整数的支持。 - **无大小限制**:理论上,Python整数可以表示任意大的值,受限于可用的系统资源。 - **不可变性**:一旦创建了一个整数对象,其值就不能被修改[^3]。 --- #### 2. **整数的操作** ##### (1) 数学运算 Python 支持多种基本数学运算符来对整数进行操作: | 运算符 | 描述 | 示例 | |--------|--------------------------|--------------------| | `+` | 加法 | `a + b` | | `-` | 减法 | `a - b` | | `*` | 乘法 | `a * b` | | `/` | 浮点除法 | `a / b` 返回浮点数 | | `//` | 地板除(向下取整) | `a // b` | | `%` | 取模(返回余数) | `a % b` | | `**` | 幂运算 | `a ** b` 表示 a 的 b 次方 | ```python # 示例代码 a = 10 b = 3 print(a + b) # 输出 13 print(a - b) # 输出 7 print(a * b) # 输出 30 print(a / b) # 输出 3.3333333333333335 (浮点除法) print(a // b) # 输出 3 (地板除) print(a % b) # 输出 1 (取模) print(a ** b) # 输出 1000 (幂运算) ``` --- ##### (2) 转换其他类型交互 Python 提供了多种方法将其他类型转换为整数,或者反之亦然: - 使用 `int()` 将字符串或其他数值类型转换为整数: ```python num_str = "42" num_int = int(num_str) # 结果为 42 ``` - 如果尝试将无法解析的内容转为整数,则会抛出异常: ```python invalid_num = "abc" try: result = int(invalid_num) except ValueError as e: print(e) # 输出: invalid literal for int() with base 10: 'abc' ``` - 同样可以通过 `float()` 或者 `str()` 方法完成不同类型之间的相互转化。 --- ##### (3) 不同进制间的转换 Python 支持二进制 (`bin`)、八进制 (`oct`) 和十六进制 (`hex`) 的表示和转换: - 定义不同进制的整数: ```python binary_number = 0b1010 # 二进制表示 10 octal_number = 0o12 # 八进制表示 10 hexadecimal_number = 0xA # 十六进制表示 10 ``` - 在运行时动态获取某数字的不同进制表达形式: ```python number = 10 print(bin(number)) # 输出: 0b1010 print(oct(number)) # 输出: 0o12 print(hex(number)) # 输出: 0xa ``` --- ##### (4) 高级应用:大整数支持 由于 Python整数实现了任意精度机制,因此它可以轻松处理超大规模的数据计算而不必担心溢出问题[^1]。例如: ```python factorial_of_100 = 1 for i in range(1, 101): factorial_of_100 *= i print(factorial_of_100) # 计算 100! 的精确结果 ``` 此功能对于密码学等领域尤为重要。 --- #### 3. **注意事项** 尽管 Python整数提供了强大的支持,但在实际开发过程中仍需要注意一些潜在陷阱: - 当执行混合类型的运算时,默认遵循更广泛的类型规则。比如当涉及浮点数时,最终的结果也会变成浮点数[^2]。 - 性能考量:虽然 Python 的高阶抽象简化了许多复杂度,但对于极端场景下的性能优化可能需要借助第三方库如 NumPy 或 Cython 实现低层控制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值