Python编号包装?

时间:2010-09-24 21:57:25

标签: python

考虑这个Python代码:

assert(a > 0)
assert(b > 0)
assert(a + b > 0)

第三个断言可能会失败吗?在C / C ++中,如果总和溢出最大整数值,则可以。如何在Python中处理它?<​​/ p>

4 个答案:

答案 0 :(得分:9)

取决于您使用的是哪个版本的Python。

在2.2左右之前,您可以获得OverflowError

版本2.2-2.7将总和提升为long(任意精度),如果它太大而不适合int

3.0+只有一个整数类型,这是任意精度。

答案 1 :(得分:3)

Python会自动将整数提升为任意精度。如果浮点数太大,则为inf。因此,如果ab都是完整的并且内存不足,则只会失败。

答案 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指定。