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;
War es hilfreich?

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.

Das „Problem“ ist, dass dieses Fragment heavyly auf Operatorpräzedenz beruht (nicht per se schlecht, aber manchmal kann es verwirrend sein).

Hier Sie eine Liste finden alle Java-Betreiber mit ihrem Vorrang und hier zum Vergleich der gleiche Tabelle für C / C ++

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top