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

Каждая функция из данного раздела требует, чтобы все аргументы были числами. Использование в качестве аргумента не числа является ошибкой. Если не указано иное, то каждая функция работает со всеми типами чисел, автоматически выполняя необходимые приведения, когда типы аргументы различаются.

[Функция] = number &rest more-numbers
[Функция] /= number &rest more-numbers
[Функция] < number &rest more-numbers
[Функция] > number &rest more-numbers
[Функция] <= number &rest more-numbers
[Функция] >= number &rest more-numbers

Каждая из этих функций принимает один и более аргументов. Если последовательно аргументов удовлетворяет следующему условию:

= все равны
/= все различны
< монотонно возрастают
> монотонно убывают
<= монотонно не убывают
>= монотонно не возрастают

тогда предикат истинен, иначе ложен. Комплексные числа могут сравниваться с помощью = и /=, но остальные предикаты требуют некомплексных аргументов. Два комплексных числа равны =, если их действительные части равны между собой и мнимые равны между собой с помощью предиката =. Комплексное число может быть сравнено с некомплексным с помощью = или /=. Например

(= 3 3) истина (/= 3 3) ложь
(= 3 5) ложь (/= 3 5) истина
(= 3 3 3 3) истина (/= 3 3 3 3) ложь
(= 3 3 5 3) ложь (/= 3 3 5 3) ложь
(= 3 6 5 2) ложь (/= 3 6 5 2) истина
(= 3 2 3) ложь (/= 3 2 3) ложь
(< 3 5) истина (<= 3 5) истина
(< 3 -5) ложь (<= 3 -5) ложь
(< 3 3) ложь (<= 3 3) истина
(< 0 3 4 6 7) истина (<= 0 3 4 6 7) истина
(< 0 3 4 4 6) ложь (<= 0 3 4 4 6) истина
(> 4 3) истина (>= 4 3) истина
(> 4 3 2 1 0) истина (>= 4 3 2 1 0) истина
(> 4 3 3 2 0) ложь (>= 4 3 3 2 0) истина
(> 4 3 1 2 0) ложь (>= 4 3 1 2 0) ложь
(= 3) истина (/= 3) истина
(< 3) истина (<= 3) истина
(= 3.0 #C(3.0 0.0)) истина (/= 3.0 #C(3.0 1.0)) истина
(= 3 3.0) истина (= 3.0s0 3.0d0) истина
(= 0.0 -0.0) истина (= 5/2 2.5) истина
(> 0.0 -0.0) ложь (= 0 -0.0) истина

С двумя аргументами, эти функции выполняют обычные арифметические сравнения. С тремя и более аргументами, они полезны для проверок рядов, как показано в следующем примере:

(<= 0 x 9)                      ;истина, если x между 0 и 9, включительно
(< 0.0 x 1.0)                   ;истина, если x между 0.0 и 1.0
(< -1 j (length s))             ;истина, если j корректный индекс для s
(<= 0 j k (- (length s) 1))     ;истина, если j и k оба корректные
                                ;индексы s и jk

__________________________________________________________________________________

Обоснование: Отношение «неравенства» называется /=, а не <> (как в Pascal’е) по двум причинам. Первое, /= для более чем двух аргументов не означает то же, что и или <, или >. Второе, неравенство для комплексная не означает то же, что и < и >. По этим двум причинам неравенство не означает больше или меньше.

______________________________________________________________________________________________________________________

[Функция] max number &rest more-numbers
[Функция] min number &rest more-numbers

Аргументы могут быть некомплексными числами. max возвращает наибольший аргумент (ближайший к положительной бесконечности). max возвращает наименьший аргумент (ближайший к отрицательной бесконечности).

Для max, если аргументы являются смесью из дробных и с плавающей точкой чисел, и наибольший является дробным, реализация может вернуть как дробное число, так и его аппроксимацию с плавающей точкой. Если наибольший аргумент является числом с плавающей точкой меньшего формата в сравнении с числом большего формата, то реализация может вернуть число без изменения, либо конвертировать его в больший формат. More concisely, the implementation has the choice of returning the largest argument as is or applying the rules of floating-point contagion, taking all the arguments into consideration for contagion purposes. Если среди наибольших два аргумента равны, то реализация может вернуть любой из них. Те же правила применяются и ко второй функции min (только «наибольший аргумент» нужно заменить на «наименьший аргумент»).

(max 6 12)  12 (min 6 12)  6
(max -6 -12)  -6 (min -6 -12)  -12
(max 1 3 2 -7)  3 (min 1 3 2 -7)  -7
(max -2 3 0 7)  7 (min -2 3 0 7)  -2
(max 3)  3 (min 3)  3
(max 5.0 2)  5.0 (min 5.0 2)  2 или 2.0
(max 3.0 7 1)  7 или 7.0 (min 3.0 7 1)  1 или 1.0
(max 1.0s0 7.0d0)  7.0d0
(min 1.0s0 7.0d0)  1.0s0 или 1.0d0
(max 3 1 1.0s0 1.0d0)  3 или 3.0d0
(min 3 1 1.0s0 1.0d0)  1 или 1.0s0 или 1.0d0