Syntaxe : ( equal expr1 expr2 precision )
Arguments : expr1 expr2 les deux expressions à comparer, precision, un nombre réel qui indique avec quelle précision doivent être comparées les deux expressions.
Cet argument precision est optionnel, s'il est omis la comparaison se fera sans tampon de précision.
Cette fonction détermine si deux expressions sont égales avec la possibilité de donner une précision de comparaison entre les deux expressions.
Par contre, l'apparition de l'argument precision interdit la comparaison de plus de deux nombres, car si on renseigne un troisième argument, ce dernier sera considéré comme la valeur de précision du contrôle.
En effet, deux nombres issus de calculs différents peuvent être insensiblement différents, le mode précision permet de compenser ces imprécisions de calcul et déclarer deux valeurs égales, il est donc possible de mettre un tampon de valeur très faible sans vraiment nuire à la précision finale, par exemple comparer si deux valeurs sont égales à la neuvième décimale près (0.000000001).
Exemples :
( equal '( a b c ) '( a b c )) renvoie T
( equal 12.123456 12.123455) renvoie nil
( equal 12.123456 12.123455 0.00001 )) renvoie T
Dans le deuxième exemple, nil est renvoyé, car il n'y a pas de tampon de précision indiqué, c'est donc bien une comparaison "brute" et il y a une différence sur la dernière décimale.
Dans le dernier exemple, les nombres sont égaux à la cinquième décimale, donc (equal) renvoie T.
Ailleurs sur le site, je vous ai parlé de la "fameuse" imprécision de calcul des ordinateurs en général, plus exactement des processeurs qui ont du mal à gérer certains nombres et font des erreurs de calcul, et cette "erreur" est d'importance avec la fonction (equal) dans les programmes avec lesquels le "tampon" de précision de comparaison va être très utile pour pallier les dysfonctionnements des processeurs.
L'erreur de calcul se produit dans les dernières décimales de certaines opérations, par exemple si vous retranchez 65432 à 65432.28 le résultat se trouve de tête et c'est 0.28 on est tous d'accord.
Si un tel calcul se présente dans vos programmes et que vous mettiez une condition (if) avec un test du style : si le résultat est 0.28, faire-ceci, sinon faire autre chose, je vous promets des doutes sur votre santé mentale, car le processeur ne trouve pas 0.28 comme résultat à ce calcul et de ce fait, votre condition si le résultat est 0.28 faire-ceci, sinon faire-cela, et bien, ce sera faire-cela qui se mettra en route, sauf si vous utilisez (equal) avec un tampon de précision.
Je vous rassure tout de même en vous disant que dans ce cas l'erreur se produit sur la onzième décimale, erreur négligeable, mais erreur tout de même.
Définition des variables | |
Si ab est égal à 0.28 afficher une boîte (alert) avec le message : "condition respectée" le 1 sur l'image sinon afficher une boîte (alert) avec le message : "condition NON respectée" le 2 sur l'image |
Lancer ce mini-programme et vous constatez que c'est le deuxième cas qui est pris en compte alors que la variable ab est bel et bien égale à 0.28.
La même chose maintenant avec la fonction (equal) et un tampon de précision :
Définition des variables | |
Si ab est égal à 0.28 à la huitième décimale près afficher une boîte (alert) "condition respectée" le 1 sur l'image sinon afficher une boîte (alert) "condition NON respectée" le 2 sur l'image |
5 juin 2017,
mise à jour le 15 décembre 2017,
mise à jour le 31 mai 2023