passer à travers l'est, je suis tombé sur une ligne de code particulière. Le lien suivant affiche le fichier avec le numéro de ligne d'intérêt à 1870. P>
https://github.com/paulhodge/eastl/ Blob / Maître / Inclure / Eastl / Algorithm.h P>
Le code de cette ligne est Y a-t-il des avantages que ce soit pour écrire une comparaison comme celle-là (peut-être un contexte que je suis surplombant)? Sinon, pourquoi l'auteur d'Eastl a-t-il délibéré délibérément-il délibérément de cette manière et a même pris les soins à commenter? La cohérence est la seule raison ici? P> si (! (valeur <* i)) code>. Le commentaire dit que «nous exprimons toujours des comparaisons de valeur en termes de
4 Réponses :
Cela signifie que vous devez uniquement fournir << / code> et
== code> pour les types de valeur de conteneur. Cela signifie également que vous réduisez la quantité de variabilité pour ces types (comme tous les algorithmes utilisent
! (A pour signifier
a> = b code> et
! ( a == b) code> pour
a! = B code>); Sinon, vous pourriez avoir
> = code> et
! = code> retourne des résultats incohérents. P>
en C ++, vous pouvez surcharger l'opérateur En outre, dans toute implémentation de point flottant, << / code> de sorte qu'il se comporte différemment du contraire de
> = code>, afin qu'ils ne soient pas garantis pour être équivalents. P >
nan
nan> = nan code>, donc < code>! (Nan
nan> = nan code> est faux. p>
Je vois au moins une différence. Si l'un des chiffres était QNAN (point flottant 0/0), alors! (A = = p>
En fait, ce comportement est assez gênant. Une des propriétés de << / code>, mathématiquement, est anti-symétrie. Signification que
! (A implique
B code>. Que les gens ont consciemment choisi de violer cette propriété juste me déflorent, ça lance de nombreux algorithmes ...
@Stevejessop: Oui, désolé, c'est un peu désactivé. La vraie relation est: ! (A A == B code>.
@Matthieu: True c'est agaçant, mais votre définition de l'antisymétrie est éteinte. Considérez A == B code>, puis
! (A n'implique pas
B code>. Donc n'utilise pas cette définition même pour les types qui ne sont pas étranges :-) la définition appropriée est
a implique
! (B , qui en fait Nan satisfait de manière voluelle depuis que le LHS n'est jamais vrai. La propriété qui manque au respect de
<< / code> est que l'équivalence de commande n'est pas transitive, mais
<< / code> sur float est un ordre partiel strict.
Je pense que la justification du fait que Nan est située en dehors de la commande définie sur des flotteurs, c'est que l'IEEE fournit suffisamment de garanties que, avec des soins, vous pouvez éviter de générer un. Ne prenez pas de racines carrées de nombres négatifs, etc. Si vous aimez que vous puissiez prétendre que toutes les opérations génératrices de NAAN ont ub, il vous suffit de vous soucier de vous inquiéter de la signification des entrées NAN aux fonctions de la bibliothèque à face publique.
Utiliser uniquement moins que l'opérateur, vous pouvez simuler tous les autres opérateurs de comparaison. Cela le rend plus cohérent et vous permet d'utiliser un seul paramètre de modèle lorsque vous devez paramétrer la comparaison. Les conteneurs et algorithmes de code standard utilisent pour ces opérations où la commande n'est pas importante, il est plus simple et plus efficace d'utiliser l'opérateur std :: moins
== code> à la place. p> p>
La bibliothèque standard utilise également égale_to (==) code> pour la vérification de l'égalité.
Dans le point flottant, ils sont différents, car les comparaisons avec
nan code> reviennent toujours false.
Cela ressemble à une optimisation de processeur / assembleur / de compilateur très spécifique. Ce code est-il destiné à un processeur / compilateur particulier, etc.
@AdrianCornish: Cela n'a rien à voir avec les optimisations et tout ce qui est à faire avec C ++ ne pas défaut des opérateurs en défaut de l'autre.
Fondamentalement, cela devrait simplement dire que Eastl suit les conventions de la partie STL standard C ++.