kle*_*ium 4 python integer integer-overflow
我是Python的新手,我正在阅读这个页面,在那里我看到了一个奇怪的声明:
if n+1 == n: # catch a value like 1e300
raise OverflowError("n too large")
Run Code Online (Sandbox Code Playgroud)
x等于大于它的数字?!我感觉到了原力的干扰.
我知道在Python 3中,整数没有固定的字节长度.因此,没有整数溢出,就像C的int工作方式一样.但当然内存无法存储无限数据.
我认为这就是为什么结果n+1可能是相同的n:Python不能分配更多的内存来预先形成总和,所以它被跳过,并且n == n是真的.那是对的吗?
如果是这样,这可能导致程序的错误结果.为什么Python不能在操作不可能时引发错误,就像C++一样std::bad_alloc?
即使n不是太大而且检查评估为假,result- 由于乘法 - 将需要更多的字节.可能result *= factor因同样的原因而失败?
我在官方Python文档中找到了它.这是检查大整数/可能整数"溢出"的正确方法吗?
kal*_*ann 23
在python中只有浮点数有硬限制。整数被实现为在python3任意大小的“长”整数对象和通常不会溢出。
您可以使用以下代码测试该行为
import sys
i = sys.maxsize
print(i)
# 9223372036854775807
print(i == i + 1)
# False
i += 1
print(i)
# 9223372036854775808
f = sys.float_info.max
print(f)
# 1.7976931348623157e+308
print(f == f + 1)
# True
f += 1
print(f)
# 1.7976931348623157e+308
Run Code Online (Sandbox Code Playgroud)
您可能还想看看sys.float_info和sys.maxsize
在 python2 中,如果如数字类型文档中所述过大,整数会自动转换为长整数
import sys
i = sys.maxsize
print type(i)
# <type 'int'>
i += 1
print type(i)
# <type 'long'>
Run Code Online (Sandbox Code Playgroud)
能
result *= factor不能出于同样的原因?
为什么不试试呢?
import sys
i = 2
i *= sys.float_info.max
print i
# inf
Run Code Online (Sandbox Code Playgroud)
Python 有一个特殊的无穷大浮点值(以及负无穷大),如浮点数文档中所述
我在 python3 中遇到了整数溢出的问题,但是当我检查类型时,我明白了原因:
import numpy as np
a = np.array([3095693933], dtype=int)
s = np.sum(a)
print(s)
# 3095693933
s * s
# -8863423146896543127
print(type(s))
# numpy.int64
py_s = int(s)
py_s * py_s
# 9583320926813008489
Run Code Online (Sandbox Code Playgroud)
某些 pandas 和 numpy 函数(例如sum数组或 Series)返回 np.int64,因此这可能是您在 Python3 中看到 int 溢出的原因。
| 归档时间: |
|
| 查看次数: |
1935 次 |
| 最近记录: |