Domanda

Non riesco a capire esattamente cosa sta facendo l'istruzione IF, da quello che vedo sta controllando se la variabile x è uguale a int 0. Se questo è true viene restituito il valore ASSOLUTO della variabile y ... questo è quando perdo la trama, perché l'istruzione return dovrebbe continuare a includere <= ESPILON? Sicuramente questo significa minore o uguale al valore di epsilon? se sì, come funziona? Se ciò non significa che cosa significa?

(CODICE JAVA)

final double EPSILON = 1E-14;
if (x == 0)
    return Math.abs(y) <= EPSILON;
È stato utile?

Soluzione

La matematica a virgola mobile è per sua natura inaccurata, quindi piuttosto che testare l'equivalenza (che è sempre una cattiva idea), invece lo sviluppatore ha scelto un piccolo numero (1x10 ^ -14 in questo caso) come tolleranza accettabile per vicinanza a zero. L'istruzione return restituisce un confronto, quindi ciò che farà sarà prendere il valore assoluto di y, e restituire vero se e solo se è sufficientemente vicino a zero, dove sufficientemente vicino è definito da EPSILON.

Altri suggerimenti

Restituisce vero se il valore assoluto di y è < = EPSILON e falso altrimenti. & Lt; = viene valutato prima dell'istruzione return. Questo codice è equivalente:

if(x == 0)
{
   boolean ret = Math.abs(y) <= EPSILON;
   return ret;
}

Il codice non è semplicemente letto da sinistra a destra. Un esempio più semplice è

int x = 3 + 4 * 5;

Dopo aver valutato questo, x è 23, non 35. La valutazione è 3 + (4 * 5), non (3 + 4) * 5, poiché * ha una precedenza più alta di +. L'istruzione return nell'esempio originale ha una precedenza molto bassa. Tutti gli operatori come +, -, & Lt ;, & Gt; = vengono valutati prima di esso.

L'intera espressione

Math.abs(y) <= EPSILON

dovrebbe essere valutato prima, il che significa che la funzione restituirà un valore booleano (vero / falso). Detto questo, se

x != 0

allora non sono sicuro di cosa verrà restituito.

Hai ragione che sta controllando se la variabile x è uguale a (beh, forse int) 0. Tuttavia, se questo è vero, non restituisce il valore assoluto di y, restituisce un valore booleano, il risultato dell'operatore < =.

Sta restituendo un valore booleano.

Epsilon è un doppio, con il valore 1E-14.

Questa è l'istruzione IF effettiva

if (x==0) {
    return MATH.abs(y) <= EPSILON;
}

Quindi, ciò che viene restituito è se il valore assoluto di y è inferiore o uguale a Epsilon.

Non uso Java da molto tempo, ma sembrerebbe che questo stia effettivamente restituendo un valore booleano (che potrebbe essere implicitamente lanciato).

Direi che se x è uguale a 0, restituisce vero quando il valore assoluto di y < = Epsilon, altrimenti restituisce falso.

Tuttavia, se x non è uguale a 0, restituirebbe null, poiché nessuna istruzione copre l'altro.

Il " issue " è che questo frammento si basa fortemente sulla precedenza dell'operatore (non male di per sé, ma a volte può essere fonte di confusione).

Qui puoi trovare un elenco di tutti gli operatori Java con la loro precedenza e qui per confrontare la stessa tabella per C / C ++

È equivalente a questo

return (Math.abs(y) <= EPSILON);

che avrebbe dovuto essere aggiunto al codice per chiarezza. Come è stato menzionato, restituisce un valore booleano.

Un'alternativa sarebbe

if (Math.abs(y) <= EPSILON)
    return true;
else
    return false;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top