¿Alguien puede explicar esto (directamente de los documentos - énfasis mío):
math.ceil (x) Devuelve el techo de x como flotante , el valor entero más pequeño mayor o igual que x.
math.floor (x) Devuelve el piso de x como flotante , el mayor valor entero menor o igual que x.
¿Por qué los flotadores .ceil
y .floor
devuelven cuando, por definición, se supone que calculan enteros?
EDITAR:
Bueno, esto tiene algunos argumentos muy buenos sobre por qué deberían devolver flotadores, y me estaba acostumbrando a la idea, cuando @jcollado señaló que, de hecho , devuelven ints en Python 3 ...
int(floor(n))
.Respuestas:
El rango de números de coma flotante generalmente excede el rango de enteros. Al devolver un valor de coma flotante, las funciones pueden devolver un valor sensible para los valores de entrada que se encuentran fuera del rango representable de enteros.
Considere: si
floor()
devuelve un entero, ¿qué deberíafloor(1.0e30)
devolver?Ahora, mientras que los enteros de Python ahora son de precisión arbitraria, no siempre fue así. Las funciones de biblioteca estándar son envoltorios delgados alrededor de las funciones de biblioteca C equivalentes.
fuente
floor(float("inf"))
oceil(float("nan"))
.Como señalan otras respuestas, en Python devuelven flotadores probablemente por razones históricas para evitar problemas de desbordamiento. Sin embargo, devuelven enteros en Python 3.
Puede encontrar más información en PEP 3141 .
fuente
float("inf")
ofloat("nan")
, obtendrás unaOverflowError
excepción.numpy.floor
y deceil
retorno (<clase 'numpy.float64'>)float("inf")
no produce una excepción en Python 2.7 o 3La fuente de su confusión es evidente en su comentario:
El objetivo de las operaciones de techo y piso es redondear los datos de coma flotante a valores integrales . No hacer una conversión de tipo. Los usuarios que necesitan obtener valores enteros pueden realizar una conversión explícita después de la operación.
Tenga en cuenta que no sería posible implementar una ronda de valor integral como trivial si todo lo que tuviera disponible fuera una operación de techo o flotante que devuelve un entero. Debería comprobar primero que la entrada está dentro del rango entero representable, luego llamar a la función; necesitaría manejar NaN e infinitos en una ruta de código separada.
Además, debe tener versiones de techo y piso que devuelvan números de coma flotante si desea cumplir con IEEE 754 .
fuente
Debido a que la biblioteca matemática de Python es una envoltura delgada alrededor de la biblioteca matemática C que devuelve flotantes.
fuente
Antes de Python 2.4, un número entero no podía contener el rango completo de números reales truncados.
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
fuente
Debido a que el rango de flotadores es mayor que el de los enteros, devolver un entero podría desbordarse
fuente
¡Esta es una pregunta muy interesante! Como un flotante requiere algunos bits para almacenar el exponente (=
bits_for_exponent
), ¡cualquier número de coma flotante mayor que2**(float_size - bits_for_exponent)
siempre será un valor integral! En el otro extremo, un flotador con un exponente negativo dará uno de1
,0
o-1
. Esto hace que la discusión sobre el rango de enteros versus el rango de flotación sea discutible porque estas funciones simplemente devolverán el número original siempre que el número esté fuera del rango del tipo de entero. Las funciones de Python son envoltorios de laC
función y, por lo tanto, esto es realmente una deficiencia de lasC
funciones en las que deberían haber devuelto un número entero y forzado al programador a hacer el rango /NaN
/Inf
check antes de llamar a ceil / floor.Por lo tanto, la respuesta lógica es que la única vez que estas funciones son útiles, devolverían un valor dentro del rango entero, por lo que el hecho de que devuelvan un flotante es un error, ¡ y usted es muy inteligente para darse cuenta de esto!
fuente
Tal vez porque otros idiomas también hacen esto, por lo que es un comportamiento generalmente aceptado. (Por buenas razones, como se muestra en las otras respuestas)
fuente