Confundindo instrução de retorno
-
03-07-2019 - |
Pergunta
Eu estou deixando de entender exatamente o que a instrução IF está fazendo, do que eu posso ver é verificar se o x
variável é igual ao 0
int. Se esta é true
o valor absoluto da variável y
é devolvido ... isso é quando eu perder o enredo, por que a instrução de retorno, em seguida, passar a incluir <= ESPILON
? Certamente isso significa menos do que ou igual ao valor de epsilon? se assim como é que o trabalho? Se isso não significa que, em seguida, o que significa isso?
(JAVA CODE)
final double EPSILON = 1E-14;
if (x == 0)
return Math.abs(y) <= EPSILON;
Solução
de ponto flutuante matemática é por sua natureza imprecisa, então em vez de testar para equivalência (que é sempre uma má idéia), em vez do desenvolvedor escolheu um pequeno número (1x10 ^ -14, neste caso) como a tolerância aceitável para proximidade com zero. A instrução de retorno retornos uma comparação, então o que isto vai fazer é tomar o valor absoluto de y, e retornar true se e somente se ele é suficientemente perto de zero, onde suficientemente próximo é definida por EPSILON.
Outras dicas
Ele retorna verdadeiro se o valor absoluto de y é <= EPSILON, e falso caso contrário. A <= é avaliada antes a instrução de retorno. Este código é equivalente:
if(x == 0)
{
boolean ret = Math.abs(y) <= EPSILON;
return ret;
}
O código não é simplesmente ler da esquerda para a direita. Um exemplo simples é
int x = 3 + 4 * 5;
Depois de avaliar isto, x é 23, 35. A avaliação não é 3 + (4 * 5), não (3 + 4) * 5, porque o * tem uma prioridade mais elevada do que a +. A instrução de retorno no exemplo original tem uma precedência muito baixa. Todos os operadores como +, -, <,> = são avaliados antes
.Toda a expressão
Math.abs(y) <= EPSILON
devem ser avaliadas em primeiro lugar, o que significa que a função vai retornar um valor booleano (true / false). Dito isto, se
x != 0
então eu não sei o que vai ser devolvidos.
Você está certo que ele está verificando se a variável x é igual a (bem, talvez int) 0. No entanto, se isso é verdade, então ele não retorna o valor absoluto de y, ele retorna um boolean, o resultado da <= operador.
Ele está retornando um valor booleano.
Epsilon é um duplo, mantendo o valor 1E-14.
Este é o real IF
if (x==0) {
return MATH.abs(y) <= EPSILON;
}
Então, o que está sendo retornado é se o valor absoluto de y é menor ou igual a Epsilon.
Eu não fiz Java em um longo tempo, mas parece que isso está realmente retornando um booleano (que pode ser implicitamente convertido).
Eu diria que, se x é igual a 0, ele retorna verdadeiro quando o valor absoluto de y <= Epsilon, caso contrário ele retorna falso.
No entanto, se x não é igual a 0, em seguida, ele iria retornar nulo, como nenhuma declaração abrange a outra pessoa.
É equivalente a este
return (Math.abs(y) <= EPSILON);
que deveria ter sido adicionado ao código para maior clareza. Como já foi mencionado, ele retorna um boolean.
Um alternativas seria
if (Math.abs(y) <= EPSILON)
return true;
else
return false;