Para verificar si un valor flotante es un número entero, use el float.is_integer()
método :
>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False
El método fue agregado al float
tipo en Python 2.6.
Tenga en cuenta que en Python 2, 1/3
es 0
(¡división de piso para operandos enteros!), Y que la aritmética de coma flotante puede ser imprecisa (a float
es una aproximación que usa fracciones binarias, no un número real preciso). Pero ajustando un poco su bucle, esto da:
>>> for n in range(12000, -1, -1):
... if (n ** (1.0/3)).is_integer():
... print n
...
27
8
1
0
lo que significa que se perdió algo más de 3 cubos (incluido 10648) debido a la imprecisión mencionada anteriormente:
>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996
Tendría que buscar números cercanos al número entero en su lugar, o no usar float()
para encontrar su número. Como redondear la raíz cúbica de 12000
:
>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648
Si está utilizando Python 3.5 o más reciente, puede usar la math.isclose()
función para ver si un valor de coma flotante está dentro de un margen configurable:
>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True
Para versiones anteriores, la implementación ingenua de esa función (omitiendo la comprobación de errores e ignorando el infinito y NaN) como se menciona en PEP485 :
def isclose(a, b, rel_tol=1e-9, abs_tol=0.0):
return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)