oh, por el amor de Dios, ¿tendría la gente el honor de comentar por qué votaron en contra? esto está etiquetado como un acertijo, ¿cuál es el problema?
user54579
10
Creo que algunas personas no pueden dejar de votar por nada.
FerranB
1
Bah, perdón por causar esto: / Realmente solo quería la respuesta, y no podía resolverla por mí mismo.
Zizzencs
1
@nickolai, esa es la naturaleza de SO: desafortunadamente, la votación negativa es una realidad y la idea de requerir un comentario ha sido discutida y rechazada. Pero parece que la "comunidad" está a favor de esta pregunta después de todo.
paxdiablo
1
Uno de los trucos de este tipo de preguntas es que las personas asumen el tipo de ciertos nombres de variables, es decir, i es un int, d es un doble, s es una cadena o un corto, ch es un carácter, l es un largo, b para byte o booleano. Debe preguntarse qué tipo se sugiere y cuál podría ser.
NaNes desordenada, por lo que la numérica operadores de comparación <, <=, >, y >=
de retorno falsesi uno o ambos operandos son NaN. El operador de igualdad ==regresa falsesi cualquiera de los operandos es NaN, y el operador de desigualdad !=regresa truesi cualquiera de los operandos es NaN. En particular, x!=xes truesi y solo si xesNaN , y (x<y) == !(x>=y)será falsesi xo yes NaN.
es matemáticamente sólido, ¿por qué un número irreal debería ser igual a otro? 5/0! = Sqrt (-4)
Gordon Gustafson el
2
@CrazyJugglerDrummer: Quizás, pero de la misma manera x == xsiempre debería ser cierto. ¿Por qué algo no debería ser igual a sí mismo?
Bart van Heukelom
1
Bart: porque realmente, desconocido no siempre es igual a desconocido. A veces es útil, por eso las bases de datos tienen NULL ...
Konerak
2
@inovaovao: no, en un DB, null=nulles nulo. NULL IS NULLes 1.
Konerak
29
El valor de ies entonces Inválido. "No un número".
¡Después de buscar en Google, descubrí que PUEDES tener NaN (no un número) en Java! Por lo tanto, un número de Float Pointing es el Tipo de datos y el Valor es NaN. Ver aquí
Generalmente odio a las personas que votan en contra sin razón alguna ... Fui el primero en decir "No es un número", pero no pensé que Java podría manejar eso, ya que no maneja nada más genial.
No estoy seguro, pero creo que (i == i) no es una operación atómica en un proceso de subprocesos múltiples, por lo que si el valor de i será cambiado por otro hilo entre las pulsaciones de su valor para apilarlo en el hilo que ejecuta el bucle, entonces esa condición puede ser falso
Como otros dijeron que era NaN, sentí curiosidad por la implementación oficial (JDK 6) de Double.isNaN, y he aquí:
/**
* Returns <code>true</code> if the specified number is a
* Not-a-Number (NaN) value, <code>false</code> otherwise.
*
* @param v the value to be tested.
* @return <code>true</code> if the value of the argument is NaN;
* <code>false</code> otherwise.
*/staticpublicboolean isNaN(double v){return(v != v);}
Piense en Nan como el equivalente de excepción, pero usa un valor mágico dentro de un cálculo. Debido a que un cálculo falló, por ejemplo, la raíz cuadrada de un negativo, dividir por cero, etc., no tiene sentido compararlos con otra cosa. Después de todo, si dividir entre cero es un nan, ¿es equivalente a la raíz cuadrada de -2 o la raíz cuadrada de -3?
Nan permite un cálculo que incluye un paso que devuelve una respuesta no válida para completar sin introducir excepciones adicionales. Para verificar que la respuesta sea un valor, simplemente pruebe la falta de agudeza (es decir, si no, la empaqueto) a través de Float.isNan () o equivalente.
Sería más fácil pensarlo como exceptiolbut si realmente supiera qué es un exceptiolbut :-).
paxdiablo
2
yo podria agregar
float i =Float.NaN;
tanto como
double i =Double.NaN;
Un truco común en este tipo de preguntas es suponer que yo soy un int. Otros supuestos comunes pueden ser s es una cadena, x, y son dobles, ch es un carácter, b es un byte, etc. Si ve una pregunta como esta, puede apostar que 'i' no es su tipo esperado.
Una pregunta similar es; Esto nunca se repite, lo que es 'x'
while(x == x && x != x +0){}
Otra pregunta que me gusta bastante es; Este bucle es un bucle infinito, ¿cuáles son los valores posibles de x? (: Cuento doce de ellos :)
Sé que esta es una pregunta de Java, pero considerar la pregunta para otros idiomas es intrigante.
En C, un tipo simple como 'int' podría exhibir 'terminar antes de que el universo se enfríe' si 'i' se declara como volátil (por lo que el compilador se vería obligado a hacer dos lecturas de 'i' para cada iteración) y si 'i' estaba realmente en la memoria donde algo más podría afectarlo. Entonces el ciclo terminaría cuando 'i' cambiara entre las dos lecturas de una sola iteración. ( Agregado : un lugar posible, en una microcomputadora donde 'i' se encuentra realmente en la dirección de un puerto de E / S, quizás conectado a un sensor de posición. Sería más plausible si 'i' fuera una variable de puntero ( un puntero a la memoria volátil) y la declaración fue ' while (*i == *i);'.)
Como lo demuestran otras respuestas, en C ++, el operador puede proporcionar el operador '==' si soy de una clase definida por el usuario, por lo que cualquier cosa podría ser posible.
Al igual que NaN, en un lenguaje basado en SQL, el bucle no sería infinito si el valor de i fuera NULL; sin embargo, cualquier valor no NULL haría que el bucle sea infinito. Esto es más bien como Java, donde cualquier número (en oposición a NaN) hace que el ciclo sea infinito.
No veo que la construcción tenga ningún uso práctico, pero es una pregunta interesante.
Por qué no? Está haciendo exactamente el mismo cálculo con exactamente los mismos datos, ambos resultados contendrán exactamente el mismo error.
Loren Pechtel el
No recuerdo exactamente dónde lo leí, pero dependiendo de su máquina / implementación, el sin (x) en una llamada de función tiene una posibilidad minúscula de igualar sin (x) de una llamada diferente. Tiene que ver con la precisión de los dígitos de coma flotante (algo es especial acerca de las funciones trigonométricas que hace que no devuelvan el mismo valor dos veces).
jkeys el
Mira mi actualización. Arcsine "deshace" el pecado de x, por lo que deberían ser iguales, pero no lo son.
jkeys el
Eso no es lo mismo. Como dijo Loren, está realizando exactamente la misma operación x, lo que debería producir exactamente el mismo resultado con la misma inexactitud. Arcsin no puede revertir el resultado de un pecado con números de coma flotante porque el valor pasado asin()no será exactamente exacto. Por lo tanto, el resultado de asin()será inexacto, haciendo x == asin(sin(x))falso. Además, arcsin no necesariamente "deshace" una operación sin: la función sin puede dar el mismo resultado para múltiples valores de x, razón por la cual asin()solo devuelve números entre -π / 2 y π / 2.
hbw
2
En otras palabras, arcsin no siempre puede "deshacer" la función pecado porque es imposible para arcsin saber cuál era el ángulo original. Por ejemplo, el pecado de π / 2 y 5π / 2 da 1. Pero, ¿qué es arcsin (1)? Obviamente no puede devolver ambos, ¿verdad? Por lo tanto, el resultado de arcsin debe restringirse a un rango de 2π radianes, lo que significa que en realidad no puede deshacer el resultado de la función sin a menos que el ángulo original esté entre 0 y 2π, o en el caso de C, -π / 2 y π / 2. (De hecho, arcsin (sin (5π / 2)) = π / 2.) De todos modos, esa fue una explicación muy larga, pero espero que ayude a aclarar cualquier idea errónea.
hbw
0
No bucle infinito, un hilo :)
importstatic B.*;publicclass A {publicstaticvoid main(String[] args){System.out.println("Still Running");while(i == i);}}publicclass B {publicstaticint i;static{System.exit(0);}}
@Charles Goodwin Lo que usted dice al hecho de que no hay posibilidad de escribir un programa Java usando un hilo :), por lo que todas las otras soluciones usan al menos dos hilos (exactamente lo mismo que mi segundo programa en la sección 'Actualizar').
Andrey
Eso no es frenar el bucle. Cualquier código después while (i == i);no se ejecutará nunca.
aalku el
Finalizar utiliza otro hilo, pero es bueno señalarlo. Es la razón por la que la pregunta original decía "y el programa solo usa un hilo" ... indicando explícitamente que esta es la respuesta obvia y desean que usted busque más.
Respuestas:
La API para Double.equals () explica la respuesta: "Double.NaN == Double.NaN tiene el valor false". Esto se elabora en la Especificación del lenguaje Java en " Tipos, formatos y valores de punto flotante ":
fuente
x == x
siempre debería ser cierto. ¿Por qué algo no debería ser igual a sí mismo?null=null
es nulo.NULL IS NULL
es 1.El valor de
i
es entonces Inválido. "No un número".¡Después de buscar en Google, descubrí que PUEDES tener NaN (no un número) en Java! Por lo tanto, un número de Float Pointing es el Tipo de datos y el Valor es NaN. Ver aquí
fuente
NaN no es igual a nada, incluso a sí mismo.
fuente
fuente
No estoy seguro, pero creo que (i == i) no es una operación atómica en un proceso de subprocesos múltiples, por lo que si el valor de i será cambiado por otro hilo entre las pulsaciones de su valor para apilarlo en el hilo que ejecuta el bucle, entonces esa condición puede ser falso
fuente
Como otros dijeron que era NaN, sentí curiosidad por la implementación oficial (JDK 6) de
Double.isNaN
, y he aquí:fuente
Piense en Nan como el equivalente de excepción, pero usa un valor mágico dentro de un cálculo. Debido a que un cálculo falló, por ejemplo, la raíz cuadrada de un negativo, dividir por cero, etc., no tiene sentido compararlos con otra cosa. Después de todo, si dividir entre cero es un nan, ¿es equivalente a la raíz cuadrada de -2 o la raíz cuadrada de -3?
Nan permite un cálculo que incluye un paso que devuelve una respuesta no válida para completar sin introducir excepciones adicionales. Para verificar que la respuesta sea un valor, simplemente pruebe la falta de agudeza (es decir, si no, la empaqueto) a través de Float.isNan () o equivalente.
fuente
yo podria agregar
tanto como
Un truco común en este tipo de preguntas es suponer que yo soy un int. Otros supuestos comunes pueden ser s es una cadena, x, y son dobles, ch es un carácter, b es un byte, etc. Si ve una pregunta como esta, puede apostar que 'i' no es su tipo esperado.
Una pregunta similar es; Esto nunca se repite, lo que es 'x'
Otra pregunta que me gusta bastante es; Este bucle es un bucle infinito, ¿cuáles son los valores posibles de x? (: Cuento doce de ellos :)
fuente
Sé que esta es una pregunta de Java, pero considerar la pregunta para otros idiomas es intrigante.
En C, un tipo simple como 'int' podría exhibir 'terminar antes de que el universo se enfríe' si 'i' se declara como volátil (por lo que el compilador se vería obligado a hacer dos lecturas de 'i' para cada iteración) y si 'i' estaba realmente en la memoria donde algo más podría afectarlo. Entonces el ciclo terminaría cuando 'i' cambiara entre las dos lecturas de una sola iteración. ( Agregado : un lugar posible, en una microcomputadora donde 'i' se encuentra realmente en la dirección de un puerto de E / S, quizás conectado a un sensor de posición. Sería más plausible si 'i' fuera una variable de puntero ( un puntero a la memoria volátil) y la declaración fue '
while (*i == *i);
'.)Como lo demuestran otras respuestas, en C ++, el operador puede proporcionar el operador '==' si soy de una clase definida por el usuario, por lo que cualquier cosa podría ser posible.
Al igual que NaN, en un lenguaje basado en SQL, el bucle no sería infinito si el valor de i fuera NULL; sin embargo, cualquier valor no NULL haría que el bucle sea infinito. Esto es más bien como Java, donde cualquier número (en oposición a NaN) hace que el ciclo sea infinito.
No veo que la construcción tenga ningún uso práctico, pero es una pregunta interesante.
fuente
Me sorprendió no ver esta solución:
En respuesta a un comentario, intente ejecutar esto:
x siempre debe ser igual al arcoseno (sin (x)) en teoría, pero en la práctica no lo es.
fuente
x
, lo que debería producir exactamente el mismo resultado con la misma inexactitud. Arcsin no puede revertir el resultado de un pecado con números de coma flotante porque el valor pasadoasin()
no será exactamente exacto. Por lo tanto, el resultado deasin()
será inexacto, haciendox == asin(sin(x))
falso. Además, arcsin no necesariamente "deshace" una operación sin: la función sin puede dar el mismo resultado para múltiples valores de x, razón por la cualasin()
solo devuelve números entre -π / 2 y π / 2.No bucle infinito, un hilo :)
fuente
i == i
No es atómico. Probado por dicho programa:Actualización Aquí hay un ejemplo más de bucle no infinito (no se crean nuevos hilos).
fuente
while (i == i);
no se ejecutará nunca.