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;
Était-ce utile?

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.

Le " numéro " c’est que ce fragment s’appuie fortement sur la préséance de l’opérateur (pas mal en soi, mais parfois il peut être déroutant).

Ici , vous trouverez une liste de tous les opérateurs java avec leur priorité et ici à des fins de comparaison, même tableau pour C / C ++

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top