Verwirrende return-Anweisung
-
03-07-2019 - |
Frage
Ich bin Fehler genau zu verstehen, was die IF-Anweisung tut, von dem, was ich sehen kann, es wird überprüft, ob die Variable x
zum int 0
gleich ist. Wenn dies der absolute Wert der Variablen true
y
zurückgegeben wird ... das ist, wenn ich die Handlung verlieren, warum sollte dann die Return-Anweisung gehen auf <= ESPILON
enthalten? Sicherlich bedeutet dies weniger als oder gleich den Wert von Epsilon? wenn ja, wie funktioniert das? Wenn es nicht bedeutet, dass dann, was bedeutet es?
(Java-Code)
final double EPSILON = 1E-14;
if (x == 0)
return Math.abs(y) <= EPSILON;
Lösung
Gleitpunktarithmetik ist von Natur aus ungenau, so anstatt für Äquivalenztests (das ist immer eine schlechte Idee), anstelle die Entwickler eine kleine Zahl (1x10 ^ -14 in diesem Fall) als die zulässige Toleranz gewählt haben Nähe zu Null. Die return-Anweisung gibt einen Vergleich, so was dies den absoluten Wert von y zu tun ist, nehmen, und gibt true zurück, wenn und nur wenn er auf Null ausreichend nahe ist, wo ausreichend nahe von EPSILON definiert ist.
Andere Tipps
Es gibt true zurück, wenn der Absolutwert von y <= EPSILON, und andernfalls false. Die <= vor der return-Anweisung ausgewertet. Dieser Code entspricht:
if(x == 0)
{
boolean ret = Math.abs(y) <= EPSILON;
return ret;
}
Der Code wird nicht einfach von links nach rechts gelesen. Ein einfacheres Beispiel ist
int x = 3 + 4 * 5;
Nach dieser Auswertung ist x 23, nicht 35. Die Auswertung erfolgt 3 + (4 * 5) nicht (3 + 4) * 5, *, da die eine höhere Priorität als die +. Die return-Anweisung im ursprünglichen Beispiel hat eine sehr niedrige Priorität. Alle Operatoren wie +, -., <,> =, Bevor sie ausgewertet
Der gesamte Ausdruck
Math.abs(y) <= EPSILON
sollte zuerst ausgewertet werden, was bedeutet, dass die Funktion einen Booleschen Wert zurückgeben wird (true / false). Having said that, wenn
x != 0
dann bin ich nicht sicher, was zurückgegeben wird erhalten.
Sie haben Recht, dass es, wenn die Variable x prüfen gleich (na ja, vielleicht int) 0. Wenn dies jedoch wahr ist, dann ist es nicht den absoluten Wert von y zurückgeben, gibt es eine boolean, die Ergebnis des Operators <=.
Es hat einen Booleschen Wert zurück.
Epsilon ist ein doppelter, den Wert 1 E-14 zu halten.
Dies ist die eigentliche IF-Anweisung
if (x==0) {
return MATH.abs(y) <= EPSILON;
}
Also, was zurückgegeben zu werden, ist, wenn der Absolutwert von y kleiner als oder gleich zu Epsilon.
Ich habe nicht Java in eine lange Zeit getan, aber es scheint, dass dies tatsächlich ein boolean zurückgibt (die implizit gegossen werden könnte).
Ich würde sagen, dass, wenn x gleich 0, es gibt true zurück, wenn der Absolutwert von y <= Epsilon, andernfalls false er zurückkehrt.
Allerdings, wenn x nicht gleich 0 ist, dann wäre es null zurück, da keine Aussage der sonst abdeckt.
Es entspricht dies
return (Math.abs(y) <= EPSILON);
, die mit dem Code für Klarheit hinzugefügt werden sollen. Wie bereits erwähnt, es gibt einen boolean.
Eine Alternative wäre
if (Math.abs(y) <= EPSILON)
return true;
else
return false;