[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Top] [Table des matières] [Index] [ ? ]

3.4 Comparaison des nombres

Pour tester l'égalité numérique des nombres, vous devriez normalement employer =, pas eq. Il peut y avoir beaucoup d'objets distincts de nombre à virgule flottante avec la même valeur numérique. Si vous employez eq pour les comparer, vous testez si deux valeurs sont des objets identiques. En revanche, = compare seulement les valeurs numériques des objets.

Actuellement, chaque valeur de nombre entier a un objet unique de Lisp dans Emacs Lisp. Par conséquent, eq est équivalent au = quand des nombres entiers sont concernés. Il est parfois commode d'employer eq pour comparer une valeur inconnue à un nombre entier, parce que eq ne rapporte pas d'erreur si la valeur inconnue n'est pas un nombre—il accepte des arguments de n'importe quel type—. En revanche, = signale une erreur si les arguments ne sont pas des nombres ou des marqueurs. Cependant, c'est une bonne idée d'employer = si vous le pouvez, même pour comparer des nombres entiers, juste au cas où nous changerions la représentation des nombres entiers dans une future version d'Emacs.

Parfois il est utile de comparer des nombres avec equal; les deux nombres sont traités comme égaux s'ils ont le même type de données (les deux sont des nombres entiers, ou à virgule flottante) et la même valeur. En revanche, = peut traiter un nombre entier et un nombre à virgule flottante en tant qu'égaux. Voir la section Equality Predicates.

Il y a un autre problème: parce que l'arithmétique de virgule flottante n'est pas exacte, c'est souvent une mauvaise idée de vérifier l'égalité de deux valeurs à virgule flottante. Habituellement il vaut mieux déterminer l'égalité approximative. Voici une fonction pour faire ceci:

 
(defvar fuzz-factor 1.0e-6)
(defun approx-equal (x y)
  (or (and (= x 0) (= y 0))
      (< (/ (abs (- x y))
            (max (abs x) (abs y)))
         fuzz-factor)))

Common Lisp note: Comparer des nombres en Common Lisp exige toujours = parce que le Common Lisp met en application des nombres entiers pluritermes, et deux objets distincts de nombre entier peuvent avoir la même valeur numérique. L'Emacs Lisp peut avoir juste un objet de nombre entier pour n'importe quelle valeur donnée parce qu'il a un champ limité des valeurs de nombre entier.

Function: = number-or-marker1 number-or-marker2

Cette fonction teste si ses arguments sont numériquement égaux, et renvoie le t si oui, nil autrement.

Function: eql value1 value2

Cette fonction agit comme eq sauf quand les deux arguments sont des nombres. Elle compare des nombres par le type et la valeur numérique, de sorte que (eql 1.0 1) renvoie le nil, mais (eql 1.0 1.0) et (eql 1 1) renvoient tous les deux le t.

Function: /= number-or-marker1 number-or-marker2

Cette fonction teste si ses arguments sont numériquement égaux, et renvoie t s'ils ne sont pas égaux, et nil s'ils sont égaux.

Function: < number-or-marker1 number-or-marker2

Cette fonction teste si son premier argument est strictement moins grand que son deuxième argument. Elle renvoie t si oui, nil autrement.

Function: <= number-or-marker1 number-or-marker2

Cette fonction teste si son premier argument est inférieur ou égal à son deuxième argument. Elle renvoie t si oui, nil autrement.

Function: > number-or-marker1 number-or-marker2

Cette fonction teste si son premier argument est strictement plus grand que son deuxième argument. Elle renvoie t si oui, nil autrement.

Function: >= number-or-marker1 number-or-marker2

Cette fonction teste si son premier argument est supérieur ou égal à son deuxième argument. Il renvoie t si oui, nil autrement.

Function: max number-or-marker &rest numbers-or-markers

Cette fonction renvoie le plus grand de ses arguments. Si l'un des arguments est à virgule flottante, la valeur est retournée à virgule flottante, même si elle était donnée comme nombre entier.

 
(max 20)
     ⇒ 20
(max 1 2.5)
     ⇒ 2.5
(max 1 3 2.5)
     ⇒ 3.0
Function: min number-or-marker &rest numbers-or-markers

Cette fonction renvoie le plus petit de ses arguments. Si l'un des arguments est à virgule flottante, la valeur est retournée à virgule flottante, même si elle était donnée comme nombre entier.

 
(min -4 1)
     ⇒ -4
Function: abs number

Cette fonction renvoie la valeur absolue de number.


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Top] [Table des matières] [Index] [ ? ]

Ce document a été généré par Eric Reinbold le 13 Octobre 2007 en utilisant texi2html 1.78.