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?
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?
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.
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.
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
Si es largo o no importa si la afirmación pasará o no. – Zimm3r
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.
Quien me votó, ¿hay alguna razón por la cual? Algo que puedo arreglar o aprender? – Zimm3r
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). –
@Matthew Flaschen Gracias por los comentarios, voy a tratar de agregar algunos detalles. – Zimm3r
Supongamos que a y b no son clases con operadores redefinidos: P – Colin