Python3 中的整数溢出
Integer overflow in Python3
我是 Python 的新手,我在阅读 this 页面时看到一个奇怪的语句:
if n+1 == n: # catch a value like 1e300
raise OverflowError("n too large")
x等于比它大的数?!我感觉到原力受到干扰。
我知道在Python 3 中,整数没有固定的字节长度。因此,没有整数溢出,就像 C 的 int
的工作方式一样。但是内存当然不能存储无限的数据。
我想这就是为什么n+1
的结果可以和n
一样的原因:Python不能分配更多的内存来进行求和,所以跳过了,并且n == n
是真的。对吗?
如果是这样,这可能会导致程序的结果不正确。为什么在无法进行操作时 Python 不引发错误,就像 C++ 的 std::bad_alloc
?
即使 n
不是太大并且检查结果为 false,result
- 由于乘法 - 将需要更多字节。 result *= factor
会因为同样的原因而失败吗?
我在官方 Python 文档中找到了它。检查大整数/可能的整数真的是正确的方法吗"overflow"?
整数在 Python 中不是这样工作的。
但是浮动确实如此。这也是为什么评论说 1e300
,这是科学计数法中的浮点数。
Python3
只有花车有
python 中的硬限制。整数是 are implemented as “long” integer objects of arbitrary size in python3 and do not normally overflow.
您可以使用以下代码测试该行为
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
您可能还想看看 sys.float_info and sys.maxsize
Python2
在 python2 中,如果整数如 documentation for numeric types
中所述过大,则会自动转换为长整数
import sys
i = sys.maxsize
print type(i)
# <type 'int'>
i += 1
print type(i)
# <type 'long'>
Could result *= factor
fail for the same reason?
为什么不试试呢?
import sys
i = 2
i *= sys.float_info.max
print i
# inf
如 the docs for float 中所述,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
一些 pandas 和 numpy 函数,例如数组上的 sum
或 Series return np.int64 所以这可能是您在 [=17 中看到 int 溢出的原因=].
我是 Python 的新手,我在阅读 this 页面时看到一个奇怪的语句:
if n+1 == n: # catch a value like 1e300
raise OverflowError("n too large")
x等于比它大的数?!我感觉到原力受到干扰。
我知道在Python 3 中,整数没有固定的字节长度。因此,没有整数溢出,就像 C 的 int
的工作方式一样。但是内存当然不能存储无限的数据。
我想这就是为什么n+1
的结果可以和n
一样的原因:Python不能分配更多的内存来进行求和,所以跳过了,并且n == n
是真的。对吗?
如果是这样,这可能会导致程序的结果不正确。为什么在无法进行操作时 Python 不引发错误,就像 C++ 的 std::bad_alloc
?
即使 n
不是太大并且检查结果为 false,result
- 由于乘法 - 将需要更多字节。 result *= factor
会因为同样的原因而失败吗?
我在官方 Python 文档中找到了它。检查大整数/可能的整数真的是正确的方法吗"overflow"?
整数在 Python 中不是这样工作的。
但是浮动确实如此。这也是为什么评论说 1e300
,这是科学计数法中的浮点数。
Python3
只有花车有 python 中的硬限制。整数是 are implemented as “long” integer objects of arbitrary size in python3 and do not normally overflow.
您可以使用以下代码测试该行为
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
您可能还想看看 sys.float_info and sys.maxsize
Python2
在 python2 中,如果整数如 documentation for numeric types
中所述过大,则会自动转换为长整数import sys
i = sys.maxsize
print type(i)
# <type 'int'>
i += 1
print type(i)
# <type 'long'>
Could
result *= factor
fail for the same reason?
为什么不试试呢?
import sys
i = 2
i *= sys.float_info.max
print i
# inf
如 the docs for float 中所述,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
一些 pandas 和 numpy 函数,例如数组上的 sum
或 Series return np.int64 所以这可能是您在 [=17 中看到 int 溢出的原因=].