Целочисленное деление в общем Lisp?
когда я делаю (/ 7 2)
, что я должен сделать, чтобы получить результат 3
? Если я это сделаю (/ 7 2.0), я получаю 3.5
, как и ожидалось.
5 ответов
(floor 7 2)
Ref:http://rosettacode.org/wiki/Basic_integer_arithmetic#Common_Lisp
посмотреть Пол, потолок и усечение в 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