Spec-Zone.ru › Elisp

Сравнение чисел

Для проверки чисел на численное равенство, обычно следует использовать =, а не предикаты нечислового сравнения, такие как 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API