2010-09-24 7 views
6

consideran este código Python:¿Cubre el número de Python?

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

¿Puede el tercer afirman fallar alguna vez? En C/C++, puede si la suma desborda el valor entero máximo. ¿Cómo se maneja esto en Python?

+5

Supongamos que a y b no son clases con operadores redefinidos: P – Colin

Respuesta

9

Depende de la versión de Python que esté utilizando.

Antes de 2.2 o más, puede obtener un OverflowError.

La versión 2.2-2.7 promociona la suma a long (precisión arbitraria) si es demasiado grande para caber en int.

3.0+ tiene solo un tipo entero, que es una precisión arbitraria.

3

Python promocionará automáticamente enteros con precisión arbitraria. Si un flotador se vuelve demasiado grande, será inf. Por lo tanto, esto solo fallaría si a y b son integrales y se queda sin memoria.

1

Si a + b es mayor que el valor máximo número entero, el resultado será mucho:

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

Si es largo o no importa si la afirmación pasará o no. – Zimm3r

-1

Ok la respuesta a su pregunta es por lo general no, sin embargo, si usted se ocupa de un gran número que puede tener alguna problemas, a continuación se detallan los grandes números de Python.

También vea este post para obtener información sobre inf (infinito) NaN (no un número (es decir, el infinito/infinito = NaN))

Por favor Nota: Esta es una máquina de AMD de 32 bits (Aunque pitón dice es intel (¿eso se refiere a que es de 32 bits?)

Python 2.6.2 (r262: 71605, 14 de abril de 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] en win32

Número máximo de CPython en su módulo matemático (subyacente C lib) donde de lo contrario se desbordará o inf r retorno es 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 

El número máximo (pitón puede representar) es 1.7976931348623157e + 308 y puede ser obtenido por (probablemente otras maneras también)

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

Creo (pero no sé) que esto se debe al uso matemático de una biblioteca de C subyacente http://docs.python.org/library/math.html

Específico para CPython El módulo matemático consiste principalmente en envolturas delgadas alrededor de las funciones matemáticas de la plataforma C. Comportamiento en casos excepcionales según Anexo F del estándar C99 donde es apropiado. La corriente aplicación elevará ValueError para operaciones no válidas como sqrt (-1,0) o log (0.0) (donde C99 anexo F recomienda señalización operación no válida o dividir por cero), y OverflowError de resultados que rebose (para ejemplo, exp (1000,0))

cambiado en la versión 2.6: comportamiento en casos especiales ahora pretende seguir C99 anexo F. en versiones anteriores de Python el comportamiento en casos especiales era vagamente especificado specified.loosely .

El entero máximo de Python (tipo int) está definido por sys.maxint. La diferencia entre el máximo número entero y el número máximo es de este

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

El número máximo es originalmente un flotador, pero cuando tratamos y convertirlo a un número entero usando int() se convierte automáticamente al tipo de largo, ya que es sobre sys.maxintloosely especificado.

+0

Quien me votó, ¿hay alguna razón por la cual? Algo que puedo arreglar o aprender? – Zimm3r

+1

No te voté. Sin embargo, su respuesta es vaga y podría decirse que es incorrecta. Python tiene esencialmente los mismos límites para 'float' (equivalente al tipo' double' de C). –

+0

@Matthew Flaschen Gracias por los comentarios, voy a tratar de agregar algunos detalles. – Zimm3r

Cuestiones relacionadas