Acabei de receber uma pergunta que não posso responder.
Suponha que você tenha essa definição de loop em Java:
while (i == i) ;
Qual é o tipo ie o valor de ise o loop não é um loop infinito e o programa está usando apenas um thread ?
Acabei de receber uma pergunta que não posso responder.
Suponha que você tenha essa definição de loop em Java:
while (i == i) ;
Qual é o tipo ie o valor de ise o loop não é um loop infinito e o programa está usando apenas um thread ?
Respostas:
double i = Double.NaN;
A API para Double.equals () explica a resposta: "Double.NaN == Double.NaN tem o valor false". Isso é elaborado na Especificação da Linguagem Java em " Tipos, Formatos e Valores de Ponto Flutuante ":
NaNé não ordenada, de modo que o numérico operadores de comparação<,<=,>, e>=de retornofalse, se um ou ambos os operandos sãoNaN. O operador de igualdade==retornafalsese um dos operandos forNaNe o operador de desigualdade!=retornatruese um dos operandos forNaN. Em particular,x!=xétruese e somente sexéNaNe(x<y) == !(x>=y)seráfalsesexouyéNaN.
x == xsempre deve ser verdade. Por que algo não deveria se igualar?
null=nullé nulo. NULL IS NULLé 1.
O valor de ié então inválido. "Não é um número".
Depois de pesquisar no google, descobri que você PODE ter NaN (não é um número) em Java! Portanto, um número de ponto flutuante é o tipo de dados e o valor é NaN. Veja aqui
double i = Double.NaN;
NaN não é igual a nada, inclusive a si próprio.
float i = Float.NaN;
while(i == i) ;
System.out.println("Not infinite!");
Como outros disseram que é NaN, fiquei curioso sobre a implementação oficial (JDK 6) Double.isNaNe observe:
/**
* 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.
*/
static public boolean isNaN(double v) {
return (v != v);
}
Pense em Nan como o equivalente à exceção, mas usa um valor mágico dentro de um cálculo. Como um cálculo falhou - por exemplo, raiz quadrada de um negativo, divida por zero etc. - não faz sentido compará-los com qualquer outra coisa. Afinal, se dividir por zero é um nan, é equivalente à raiz quadrada de -2 ou à raiz quadrada de -3?
Nan permite um cálculo que inclui uma etapa que retorna uma resposta inválida para ser concluída sem a introdução de exceções extras. Para verificar se o valor da resposta é simplesmente teste para não-incondicionalidade (isto é, se não for o caso) via Float.isNan () ou equivalente.
Eu adicionaria
float i = Float.NaN;
assim como
double i = Double.NaN;
Um truque comum nesse tipo de pergunta é na suposição de que você é um int. Outras suposições comuns podem ser s é uma String, x, y são um duplo, ch é um char, b é um byte etc. Se você vir uma pergunta como essa, pode apostar que 'i' não é o seu tipo esperado.
Uma pergunta semelhante é; Isso nunca faz loop, o que é 'x'
while(x == x && x != x + 0) { }
Outra pergunta de que gosto bastante é; Esse loop é um loop infinito, quais são os possíveis valores de x. (: Conto doze deles :)
while(x != 0 && x == -x) { }
Eu sei que essa é uma pergunta sobre Java, mas considerar a pergunta para outras linguagens é intrigante.
Em C, um tipo simples como 'int' pode exibir 'termina' antes que o universo esfrie 'comportamento' se 'i' for declarado como volátil (para que o compilador seja forçado a fazer duas leituras de 'i' para cada iteração) e se 'i' estivesse na memória, onde outra coisa poderia afetá-lo. Então o loop terminaria quando 'i' mudasse entre as duas leituras de uma única iteração. ( Adicionado : um local possível - em um microcomputador onde 'i' está realmente localizado no endereço de uma porta de E / S, talvez conectado a um sensor de posição. Seria mais plausível se 'i' fosse uma variável de ponteiro ( um ponteiro para a memória volátil) e a declaração foi 'while (*i == *i); '.)
Como evidenciado por outras respostas, em C ++, o operador '==' pode ser fornecido pelo usuário se i for de uma classe definida pelo usuário; portanto, tudo pode ser possível.
Assim como NaN, em uma linguagem baseada em SQL, o loop não seria infinito se o valor de i fosse NULL; no entanto, qualquer valor que não seja NULL tornaria o loop infinito. É como o Java, onde qualquer número (ao contrário do NaN) torna o loop infinito.
Não vejo o construto tendo nenhum uso prático, mas é uma pergunta interessante.
Fiquei surpreso ao não ver esta solução:
while (sin(x) == sin(x)) //probably won't eval to true
Em resposta a um comentário, tente executar o seguinte:
double x = 10.5f;
assert (x == asin(sin(x)));
x sempre deve ser igual ao arco-seno (sin (x)) em teoria, mas na prática não é.
x, o que deve gerar exatamente o mesmo resultado com a mesma imprecisão. O Arcsin não pode reverter o resultado de um pecado com números de ponto flutuante porque o valor passado para asin()não será exatamente exato. Portanto, o resultado de asin()será impreciso, tornando x == asin(sin(x))falso. Além disso, o arcsin não necessariamente "desfaz" uma operação sin - a função sin pode fornecer o mesmo resultado para vários valores de x, e é por isso que asin()apenas retorna números entre -π / 2 e π / 2.
i == inão é atômico. Comprovado por esse programa:
static volatile boolean i = true;
public static void main(String[] args) throws InterruptedException
{
new Thread() {
@Override
public void run() {
while (true) {
i = !i;
}
}
}.start();
while (i == i) ;
System.out.println("Not atomic! i: " + i);
}
Atualizar Aqui está mais um exemplo de loop não infinito (nenhum novo encadeamento é criado).
public class NoNewThreads {
public static void main(String[] args) {
new NoNewThreads();
System.gc();
int i = 500;
System.out.println("Still Running");
while (i == i) ;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
Thread.sleep(1000);
System.exit(0);
}
}
while (i == i);nunca será executado.