Comparaison trilatéraleEn informatique, une comparaison trilatérale prend deux valeurs A et B appartenant à un type avec une relation d'ordre total et détermine si A < B, A = B ou A > B en une seule opération, conformément à la mathématique de la loi de trichotomie. Calcul au niveau machineDe nombreux processeurs ont des jeux d'instructions qui supportent cette opération sur les types primitifs. Certaines machines ont des nombres entiers signés basés sur un complément à un (voir représentation des entiers négatifs), qui permettent de différencier un zéro positif et un zéro négatif. Cela ne viole pas la trichotomie tant qu'un ordre total consistant est adopté: les choix -0 = +0 et -0 < +0 sont tous deux valides. Les types à virgule flottante, cependant, ont une exception à la trichotomie: il y a une valeur spéciale "NaN" (Not a Number) telle que x < NaN, x > NaN, et x = NaN sont tous faux pour toutes les valeurs à virgule flottante x (y compris NaN lui-même). Les langages de haut niveauEn C, les fonctions En Perl (pour les comparaisons numériques seulement, cmp est utilisé pour les comparaisons lexicales de chaînes de caractères), PHP (depuis la version 7), Ruby, et Apache Groovy, le "spaceship operator" Depuis Java version 1.5, la même chose peut être calculée en utilisant la méthode statique Lors de la mise en œuvre d'une comparaison trilatérale lorsqu'un opérateur ou une méthode de comparaison trilatérale n'est pas déjà disponible, il est fréquent de combiner deux comparaisons, telles que A = B et A < B ou A < B et A > B. En principe, un compilateur peut en déduire que ces deux expressions pourraient être remplacées par une seule comparaison suivie par de multiples tests sur le résultat, mais la mention de cette optimisation ne semble pas exister dans les différents textes sur le sujet. Dans certains cas, la comparaison trilatérale peut être simulée par la soustraction de A et B et en examinant le signe du résultat, en exploitant des instructions spéciales pour étudier le signe d'un nombre. Cependant, cela nécessite que le type de A et B dispose d'une différence bien définie. Les entiers signés à largeur fixe peuvent générer un overflow, les nombres à virgules flottantes peuvent être NaN avec un signe indéfini, et les chaînes de caractères n'ont aucune fonction de différence correspondant à leur ordre total. Au niveau machine, un overflow sera traqué et pourra être utilisé pour déterminer l'ordre après une soustraction, mais cette information n'est généralement pas disponible dans des langages de plus haut niveau. Même si elle est aujourd'hui dépréciée, la déclaration arithmétique IF du Fortran fournissait une instruction conditionnelle trilatérale qui permettait de sauter à 3 labels selon le signe du résultat :La fonction strcmp en C (et langages apparentés) est une comparaison lexicographique trilatérale de chaînes de caractères. Cependant, ces langages manquent d'un opérateur générique de comparaison trilatérale. Types de données compositesLes comparaisons trilatérales ont la particularité d'être faciles à composer et de construire des comparaisons lexicographiques de types non-primitifs, à la différence des comparaisons bilatérales. Voici un exemple de composition en Perl. Notez que Dans certaines langues, y compris Python, Ruby, Haskell, etc., la comparaison des listes est faite de manière lexicographique, ce qui signifie qu'il est possible de construire une chaîne de comparaisons, comme dans l'exemple ci-dessus en mettant les valeurs dans des listes dans l'ordre voulu; par exemple, en Ruby: Proposition pour le C++Le 5 février 2017, Herb Sutter a proposé l'ajout d'un troisième opérateur de comparaison, appelé le "spaceship operator", à la norme C++ avec la syntaxe Il a été fusionné dans le projet C++20 en novembre 2017. TriviaL'opérateur de comparaison pour les nombres est orthographié Voir aussiRéférences
|