Целочисленное деление в общем Lisp?

когда я делаю (/ 7 2), что я должен сделать, чтобы получить результат 3? Если я это сделаю (/ 7 2.0), я получаю 3.5, как и ожидалось.

5 ответов



посмотреть Пол, потолок и усечение в ANSI Common Lisp.

примеры (см. положительные и отрицательные числа):

CL-USER 218 > (floor -5 2)
-3
1

CL-USER 219 > (ceiling -5 2)
-2
-1

CL-USER 220 > (truncate -5 2)
-2
-1

CL-USER 221 > (floor 5 2)
2
1

CL-USER 222 > (ceiling 5 2)
3
-1

CL-USER 223 > (truncate 5 2)
2
1

обычно для деления на целое используется усечение.


можно использовать :

(floor 7 2)
3
1

обратите внимание, что он возвращает несколько значений, и нужно только первый. С floor возвращает несколько значений, которые можно сделать с помощью multiple-value-bind следующим образом:

(multiple-value-bind (q r) (floor 7 2) q)
=> 3

Edit: как отмечает Райнер в своем комментарии, Вы можете просто передать результат floor в качестве аргумента, если все, что вам нужно, это частное.

[1]> (floor 7 2)
3 ;
1
[2]> (+ (floor 7 2) 5)
8
[3]>

я оставляю ссылку на multiple-value-bind в ответе, так как это важная функция, котор нужно знать С.


использовать


мое решение-определить функцию div:

(defun div (n d)
  (multiple-value-bind (q r) (floor n d) q))

> (div 7 2)
3