Dichiarazione di reso confusa
-
03-07-2019 - |
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;
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.
È 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;