考虑这个Python代码:
assert(a > 0)
assert(b > 0)
assert(a + b > 0)
第三个断言可能会失败吗?在C / C ++中,如果总和溢出最大整数值,则可以。如何在Python中处理它?</ p>
答案 0 :(得分:9)
取决于您使用的是哪个版本的Python。
在2.2左右之前,您可以获得OverflowError
。
版本2.2-2.7将总和提升为long
(任意精度),如果它太大而不适合int
。
3.0+只有一个整数类型,这是任意精度。
答案 1 :(得分:3)
Python会自动将整数提升为任意精度。如果浮点数太大,则为inf
。因此,如果a
和b
都是完整的并且内存不足,则只会失败。
答案 2 :(得分:1)
如果a + b
大于最大整数值,则结果将为long:
>>> import sys
>>> sys.maxint
9223372036854775807
>>> a = sys.maxint
>>> b = 1
>>> a + b
9223372036854775808L # A long
>>> assert a > 0
>>> assert b > 0
>>> assert a + b > 0
答案 3 :(得分:-1)
好的,你的问题的答案通常是否定的,但如果你处理大数字你可能会有一些问题,下面是python的大数字的详细信息。
另见本文关于inf(无穷大)NaN的信息(不是数字(即无穷大/无穷大= NaN))
请注意:这是在32位AMD机器上(虽然python说它是intel(是指它是32位?)
Python 2.6.2(r262:71605,2009年4月14日,22:40:02)[MSC v.1500 32位(英特尔)]在win32上
CPython在其数学模块中的最大数字(基础C lib),否则它将溢出或返回inf是8.2184074615549724e + 309
>>> x = 8.2184074615549724e+309
>>> x
8.2184074615549724e+309
>>> x + 1
>>> x
inf
>>> x = exp(710)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: math range error
最大数量(python可以表示)是1.7976931348623157e + 308并且可以获得(可能还有其他方式)
http://docs.scipy.org/doc/numpy/reference/generated/numpy.finfo.html
>>> import numpy
>>> f = numpy.finfo(float()
>>> f.max
1.7976931348623157e+308
>>> m = f.max
>>> m1 = m + 100 # supposedly increase the number by 100
>>> m
1.7976931348623157e+308
>>> m1
1.7976931348623157e+308
>>> # note how m1 and m are the same number
>>> m == m1
True
>>>
我相信(但不知道)这是因为数学使用了底层C库 http://docs.python.org/library/math.html
特定于CPython数学模块 主要由薄包装纸组成 围绕平台C数学函数。 特殊情况下的行为如下 C99标准的附件F所在地 适当。目前 实现将引发ValueError 对于像sqrt(-1.0)这样的无效操作 或log(0.0)(其中C99附件F. 建议发出无效操作信号 或除以零)和溢出错误 对于溢出的结果(for 例如,exp(1000.0))
在版本2.6中更改:行为在 特殊情况现在旨在遵循C99 附件F.在早期版本的Python中 特殊情况下的行为是 松散地指定。松散地指定。
Python的最大整数(int类型)由sys.maxint定义。最大整数和最大数之间的差异是
>>> type(x)
<type 'float'>
>>> int_x = int(x)
>>> type(int_x)
<type 'long'>
>>>
最大数量最初是一个浮点数,但是当我们尝试使用int()将其转换为整数时,它会自动转换为long类型,因为它超过了sys.maxintloosely指定。