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;
Foi útil?

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.

O "problema" é que este fragmento depende heavyly na precedência do operador (não é mau em si, mas às vezes pode ser confuso).

Aqui pode encontrar uma lista de todos os operadores Java com sua precedência, e aqui para comparação à mesma mesa para C / C ++

É 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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top