2010-09-24 48 views
6

考虑这个Python代码:Python数字包装?

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

可在第三断言过失败吗?在C/C++中,如果总和溢出最大整数值,则可以。这在Python中如何处理?

+5

假设a和b不是具有重定义运算符的类:P – Colin 2010-09-24 21:58:19

回答

9

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

在2.2左右之前,你可以得到OverflowError

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

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

3

Python会自动将整数提升为任意精度。如果一个浮动变得太大,它将是inf。因此,如果ab都是不可分割的,并且内存不足,则只会失败。

1

如果a + b是大于最大整数值越大,结果将是一个漫长:

>>> 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 
+1

不论断言是否过期都无关紧要。 – Zimm3r 2010-09-24 22:03:09

-1

确定的回答你的问题一般是没有,但是如果你处理大量你可以有一些问题,下面是python大数据的细节。

也看到这个帖子对INF(无穷大)信息NaN(非数(即无穷大/无穷= NAN))

请注意:这是一个32位的AMD的机器上(尽管蟒蛇说:它是英特尔(是指它是32位??)

Python 2.6.2(r262:71605,2009年4月14日,22点40分02秒)[MSC v.1500 32位(Intel)] on win32

CPython在其数学模块(底层C lib)中的最大数量否则会溢出o R返回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 

的最大数目(蟒可表示)是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异常 像开方非法操作(-1.0) 或日志(0.0)(其中C99附件F 建议信令无效操作 或除以零),并OverflowError 的结果溢出(对于 例如,EXP(1000.0))

改变在2.6版本:行为 特殊情况下,现在的目标是遵循C99 附件F.在早期版本的Python 在特殊情况下的行为是 松散specified.loosely规定。

Python的最大整数(int型)是由所有的sys.maxint定义。的最大整数和最大数量之间的差异是这个

>>> type(x) 
<type 'float'> 
>>> int_x = int(x) 
>>> type(int_x) 
<type 'long'> 
>>> 

的最大数量是原来的浮动,但是,当我们试图将其转换为整数使用int()函数将自动转换为long类型,因为它是通过sys.maxintloosly指定。

+0

谁投我倒,是有原因的?我可以修复或学习的东西? – Zimm3r 2010-09-24 22:11:49

+1

我没有投票给你。但是,你的回答是模糊的,可以说是不正确的。 Python对'float'的限制基本相同(相当于C型'double')。 – 2010-09-24 22:12:59

+0

@Matthew Flaschen感谢您的反馈,我会尝试添加一些细节。 – Zimm3r 2010-09-24 22:14:40