Сравнение чисел
Для проверки чисел на численное равенство, обычно следует использовать =, а не предикаты нечислового сравнения, такие как eq, eql и equal. Различные объекты с плавающей точкой и большие целые числа могут быть численно равны. Если вы используете eq, чтобы сравнить их, вы проверяете, являются ли они одним и тем же объектом; если вы используете eql или equal, вы проверяете, являются ли их значения неотличимыми. В отличие от этого, = использует числовое сравнение, и иногда возвращает t, когда нечисловое сравнение вернуло бы nil, и наоборот. См. Основы чисел с плавающей точкой.
В Emacs Lisp, если два fixnum численно равны, они являются одним и тем же объектом Lisp. То есть, eq эквивалентно = для fixnum. Иногда удобно использовать eq для сравнения неизвестного значения с fixnum, потому что eq не сообщает об ошибке, если неизвестное значение не является числом — оно принимает аргументы любого типа. В отличие от этого, = сигнализирует об ошибке, если аргументы не являются числами или маркерами. Однако лучшей практикой программирования является использование =, если это возможно, даже для сравнения целых чисел.
Иногда полезно сравнивать числа с eql или equal, которые рассматривают два числа как равные, если они имеют одинаковый тип данных (оба целые или оба с плавающей точкой) и одинаковое значение. В отличие от этого, = может рассматривать целое число и число с плавающей точкой как равные. См. Предикаты равенства.
Существует еще один нюанс: поскольку арифметика с плавающей точкой неточная, проверка на равенство значений с плавающей точкой часто является плохой идеей. Обычно лучше проверять приблизительное равенство. Вот функция для этого:
(defvar fuzz-factor 1.0e-6)
(defun approx-equal (x y)
(or (= x y)
(< (/ (abs (- x y))
(max (abs x) (abs y)))
fuzz-factor)))
- Функция: = число-или-маркер &rest число-или-маркеры
Эта функция проверяет, являются ли все ее аргументы численно равными, и возвращает
t, если это так,nilв противном случае.
- Функция: eql значение1 значение2
Эта функция действует как
eqза исключением случаев, когда оба аргумента являются числами. Она сравнивает числа по типу и числовому значению, так что(eql 1.0 1)возвращаетnil, но(eql 1.0 1.0)и(eql 1 1)оба возвращаютt. Это можно использовать для сравнения больших целых чисел, а также маленьких. Значения с плавающей точкой с одинаковым знаком, порядком и дробной частью являютсяeql. Это отличается от числового сравнения:(eql 0.0 -0.0)возвращаетnil, а(eql 0.0e+NaN 0.0e+NaN)возвращаетt, в то время как=делает обратное.
- Функция: /= число-или-маркер1 число-или-маркер2
Эта функция проверяет, являются ли ее аргументы численно равными, и возвращает
t, если они не равны, иnil, если они равны.
- Функция: < число-или-маркер &rest число-или-маркеры
Эта функция проверяет, является ли каждый аргумент строго меньше последующего аргумента. Она возвращает
t, если это так,nilв противном случае.
- Функция: <= число-или-маркер &rest число-или-маркеры
Эта функция проверяет, является ли каждый аргумент меньше или равен последующему аргументу. Она возвращает
t, если это так,nilв противном случае.
- Функция: > число-или-маркер &rest число-или-маркеры
Эта функция проверяет, является ли каждый аргумент строго больше последующего аргумента. Она возвращает
t, если это так,nilв противном случае.
- Функция: >= число-или-маркер &rest число-или-маркеры
Эта функция проверяет, является ли каждый аргумент больше или равен последующему аргументу. Она возвращает
t, если это так,nilв противном случае.
- Функция: max число-или-маркер &rest числа-или-маркеры
-
Эта функция возвращает наибольшее из своих аргументов.
(max 20) ⇒ 20 (max 1 2.5) ⇒ 2.5 (max 1 3 2.5) ⇒ 3
- Функция: min число-или-маркер &rest числа-или-маркеры
-
Эта функция возвращает наименьшее из своих аргументов.
(min -4 1) ⇒ -4
- Функция: abs число
Эта функция возвращает абсолютное значение число.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Comparison-of-Numbers.html