Python3中的整数溢出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
不是太大而且检查评估为假,result
- 由于乘法 - 将需要更多的字节。 result *= factor
能否以同样的理由失败?
我在官方Python文档中找到了它。这是检查大整数/可能整数“溢出”的正确方法吗?
Python3
只有浮点数在python中有一个硬限制。整数是are implemented as “long” integer objects of arbitrary size in python3和do normally not 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和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'>
result *= factor
能否以同样的理由失败?
为什么不试试呢?
import sys
i = 2
i *= sys.float_info.max
print i
# inf
如the docs for float中所述,Python对于无穷大(以及负无穷大)也有一个特殊的浮点值
整数在Python中不起作用。
但浮动确实如此。这也是为什么评论说1e300
,这是一个科学记数字的浮动。
以上是关于Python3中的整数溢出的主要内容,如果未能解决你的问题,请参考以下文章