Déclaration de retour déroutante
-
03-07-2019 - |
Question
Je ne comprends pas exactement ce que l'instruction IF fait. D'après ce que je peux voir, elle vérifie si la variable x
est égale à l'int 0
. S'il s'agit de true
la valeur ABSOLUTE de la variable y
est renvoyée ... c'est-à-dire lorsque je perds le tracé, pourquoi l'instruction return renverrait-elle ensuite à <= ESPILON
? Cela signifie sûrement inférieur ou égal à la valeur d'epsilon? Si oui, comment ça marche? Si cela ne signifie pas cela, qu'est-ce que cela signifie?
(CODE JAVA)
final double EPSILON = 1E-14;
if (x == 0)
return Math.abs(y) <= EPSILON;
La solution
Le calcul en virgule flottante est par nature inexact. Par conséquent, plutôt que de tester l'équivalence (ce qui est toujours une mauvaise idée), le développeur a choisi un petit nombre (1x10 ^ -14 dans ce cas) comme tolérance acceptable pour proximité à zéro. L'instruction return renvoie une comparaison. Par conséquent, elle prend la valeur absolue de y et renvoie true si et seulement si elle est suffisamment proche de zéro, où suffisamment proche est défini par EPSILON.
Autres conseils
Il renvoie true si la valeur absolue de y est < = EPSILON, et false sinon. Le & Lt; = est évalué avant l'instruction de retour. Ce code est équivalent:
if(x == 0)
{
boolean ret = Math.abs(y) <= EPSILON;
return ret;
}
Le code ne se lit pas simplement de gauche à droite. Un exemple plus simple est
int x = 3 + 4 * 5;
Après avoir évalué cela, x est 23, pas 35. L’évaluation est 3 + (4 * 5), pas (3 + 4) * 5, car le * a une priorité plus élevée que le +. L'instruction return de l'exemple d'origine a une priorité très faible. Tous les opérateurs comme +, -, & Lt ;, & Gt; = sont évalués avant.
L'expression entière
Math.abs(y) <= EPSILON
doit être évalué en premier, ce qui signifie que la fonction va renvoyer une valeur booléenne (true / false). Cela dit, si
x != 0
alors je ne suis pas sûr de ce qui sera retourné.
Vous avez raison, il vérifie si la variable x est égale à (enfin, peut-être int) à 0. Toutefois, si cela est vrai, elle ne renvoie pas la valeur absolue de y, elle renvoie un booléen, le résultat de < = opérateur.
Il renvoie une valeur booléenne.
Epsilon est un double, avec la valeur 1E-14.
Il s'agit de la déclaration IF actuelle
if (x==0) {
return MATH.abs(y) <= EPSILON;
}
Ainsi, ce qui est renvoyé est si la valeur absolue de y est inférieure ou égale à Epsilon.
Je n'ai pas utilisé Java depuis longtemps, mais il semblerait que cela retourne un booléen (qui pourrait être implicitement converti).
Je dirais que si x est égal à 0, il renvoie true lorsque la valeur absolue de y < = Epsilon, sinon il renvoie false.
Cependant, si x n’est pas égal à 0, il renverra null, aucune instruction ne couvrant le reste.
Cela équivaut à ceci
return (Math.abs(y) <= EPSILON);
qui aurait dû être ajouté au code pour plus de clarté. Comme cela a été mentionné, il retourne un booléen.
Une alternative serait
if (Math.abs(y) <= EPSILON)
return true;
else
return false;