Estoy tratando de encontrar la raíz cúbica más grande que sea un número entero, que sea menos de 12,000.
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
¡No estoy seguro de cómo verificar si es un número entero o no! Podría convertirlo en una cadena y luego usar la indexación para verificar los valores finales y ver si son cero o no, aunque parece bastante engorroso. ¿Hay alguna forma más simple?
python
floating-point
chopper draw lion4
fuente
fuente
Respuestas:
Para verificar si un valor flotante es un número entero, use el
float.is_integer()
método :El método fue agregado al
float
tipo en Python 2.6.Tenga en cuenta que en Python 2,
1/3
es0
(¡división de piso para operandos enteros!), Y que la aritmética de coma flotante puede ser imprecisa (afloat
es una aproximación que usa fracciones binarias, no un número real preciso). Pero ajustando un poco su bucle, esto da:lo que significa que se perdió algo más de 3 cubos (incluido 10648) debido a la imprecisión mencionada anteriormente:
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 de12000
: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: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 :
fuente
True
si no hay decimales en absoluto. Puede haber un malentendido por parte del OP sobre la aritmética y precisión de coma flotante, por supuesto.1.0000000000000001
se muestra como1.0
, en 3 se muestra la representación de cadena más corta que produce el mismo valor.range(12000, -1, -1)
podría ser (en mi opinión, más limpiamente) reescrito comoreversed(range(12000+1))
Podemos usar el operador de módulo (%). Esto nos dice cuántos residuos tenemos cuando dividimos x por y - se expresa como
x % y
. Cada número entero debe dividirse por 1, por lo que si hay un resto, no debe ser un número entero.Esta función devolverá un valor booleano
True
oFalse
, dependiendo de sin
es un número entero.fuente
Podrías usar esto:
fuente
.is_integer()
continúa funcionando.is_integer
usa un método similar (o = (floor(x) == x) ? Py_True : Py_False;
). Pero estoy de acuerdo, uno debería usarlo,is_integer()
ya que es mucho más claro.large_float == large_int
puede fallar incluso silarge_float == float(large_int)
.123456789012345678901234567890.0 != 123456789012345678901234567890
pero123456789012345678901234567890.0 == float(123456789012345678901234567890)
k = 123456789012345678901234567890.0
entoncesk == int(k)
es cierto, que es la respuesta correcta.No necesita hacer un bucle o verificar nada. Solo toma una raíz cúbica de 12,000 y redondea hacia abajo:
fuente
Puede usar una operación de módulo para eso.
fuente
n
es 6.2, 6.0, 6.12312412, todos tenemos"We have a decimal number here!"
?¿No sería más fácil probar las raíces cúbicas? Comienza con 20 (20 ** 3 = 8000) y sube a 30 (30 ** 3 = 27000). Entonces tienes que probar menos de 10 enteros.
fuente
n**(1/3)
es entero. Por ejemplo, en mi computadora `10648 ** (1/3) = 21.999999999999996` en lugar de22
: ¡problema! Con el método de esta respuesta no existe tal problema. Creo que esta es la única solución correcta desde un punto de vista matemático (otras soluciones son Python-correct).Qué tal si
fuente
Las respuestas anteriores funcionan para muchos casos pero se pierden algunas. Considera lo siguiente:
Usando esto como punto de referencia, algunas de las otras sugerencias no obtienen el comportamiento que podríamos desear:
En su lugar, intente:
ahora obtenemos:
isclose
viene con Python 3.5+ , y para otras Python puede usar esta definición mayormente equivalente (como se menciona en la PEP correspondiente )fuente
math.fsum([0.1] * 10) == 1
Solo una información adicional,
is_integer
está haciendo internamente:fuente
Todas las respuestas son buenas, pero un método seguro sería
La función devuelve True si es un número entero más False ... Sé que llego un poco tarde, pero aquí está uno de los métodos interesantes que hice ...
Editar: como se indica en el comentario a continuación, una prueba equivalente más barata sería:
fuente
n % 1 == 0
. En este caso, está realizando dos operaciones que son más caras para una prueba equivalente más barata.fuente
Intenta usar:
Le dará mucha más precisión que cualquier otro método.
fuente
Puede usar la
round
función para calcular el valor.Sí, en Python, como muchos han señalado cuando calculamos el valor de una raíz cúbica, le dará una salida con un poco de error. Para verificar si el valor es un número entero, puede usar la siguiente función:
Pero recuerde que
int(n)
es equivalente amath.floor
y debido a esto, si encuentra elint(41063625**(1.0/3.0))
, obtendrá 344 en lugar de 345.Por lo tanto, tenga cuidado al usar con
int
raíces cúbicas.fuente