Comparer deux NSPoint
Core
Membre
Bonjour,
J'aimerais comparer deux NSPoint p et q, Naà¯vement j'ai fait
et j'ai une erreur :
Comment puis je les comparer ?
J'aimerais comparer deux NSPoint p et q, Naà¯vement j'ai fait
<br />if (p == q)<br />{<br />}<br />
et j'ai une erreur :
error: invalid operands to binary ==
Comment puis je les comparer ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mais je n'en suis vraiment pas sûr...
Et bien non ca ne marche pas non plus
C'est peut-être un peu lourd, mais essaie...
C'est normal que == ne marche pas directement, car l'opérateur == n'est pas défini en C pour les struct. Or, NSPoint est une struct.
Donc (p.x == q.x) && (p.y == q.y) est en théorie la seule solution
Sinon, il y a
BOOL NSEqualPoints(NSPoint p, NSPoint q) que tu peux utiliser, mais elle ne fera sans doute pas mieux que le truc précédent. Enfin, je pense.
+
Chacha
En effet les float ne sont pas des nombres précis, ce sont des nombres arrondis (à 6 décimales). Donc deux nombres peuvent très bien être égaux mais le test == échouera.
Au pire des cas, tu peux faire:
if (p.x > pp.x-0.0001 && p.x < pp.x+0.0001)
Mais utilises NSEqualPoints, c'est plus facile
Il est vrai que comparer l'égalité entre deux float est un peu hasardeuse, à cause des arrondis qui sont fait dans les calculs. Il vaut mieux, effectivement, utiliser une marge de sécurité sous forme d'un test par intervalle.
Cependant, on ne peut pas dire que les float sont limités à 6 décimales, ce sont des nombres à virgule "flottante", justement ! Donc il est arbitraire de se fixer un intervalle de taille 1e-6, ou 1e-4, ou 1.234e-5 pour la comparaison.
Donc NSEqualPoints ne peut pas se permettre de fixer pour nous une limite de validité de l'égalité, et par conséquent n'a pas de raison de faire mieux qu'un ==.
Voilà .
Sinon, oui, il est plus simple d'utiliser NSEqualPoints, sauf si, justement, on veut contrôler l'intervalle de validité de l'égalité.
Test pour prouver mes dires :
NSPoint p1 = NSMakePoint(1,2);
NSPoint p2 = NSMakePoint(1+1e-7,2);
Et bien NSEqualPoints(p1, p2) renvoie bien FAUX.
+
Chacha
Ok, merci pour l'info. J'ai mis des intervalles car à l'époque, quand je programmais en C, il m'était arrivé que le test == échoue pour deux même nombres (dont l'un obtenu par calcul, d'où l'imprécision) et depuis je mets des intervalles.
De plus, toute littérature sur le sujet déconseille de comparer directement deux floats. On peut imaginer qu'il y ait des cas pour lesquels NSEqualPoints() échoue. C'est pour ça que je pensais qu'ils avaient mis des marges.
Finalement, l'utilisation de NSEqualPoints est-elle vraiment "sûre" ?
vala
Ben non, t'as raison, d'un certain point de vue, NSEqualPoints n'est pas "sûre". Par contre, cette fonction fait exactement ce qu'on attend d'elle, elle compare deux float avec ==. Donc tant qu'on sait ce qu'on fait et que l'on n'en attend pas plus, alors oui, ça reste une bonne fonction bien pratique. Et il y a quand même beaucoup de cas où le test sera correct, ne serait-ce que si on ne stocke que des valeurs entières (pas immenses toutefois) dans le NSPoint.
Je souligne en passant les fonctions NSPointInRect et NSLocationInRange qui sont pratiques aussi! C'est vraiment des fonctions toutes bêtes, mais ça évite d'écrire 2 lignes de plus (ben oui, je suis flemmard)
++