Книга: Practical Common Lisp
Basic Math
Basic Math
The basic arithmetic operations—addition, subtraction, multiplication, and division—are supported for all the different kinds of Lisp numbers with the functions +
, -
, *
, and /
. Calling any of these functions with more than two arguments is equivalent to calling the same function on the first two arguments and then calling it again on the resulting value and the rest of the arguments. For example, (+ 1 2 3)
is equivalent to (+ (+ 1 2) 3)
. With only one argument, +
and *
return the value; -
returns its negation and /
its reciprocal.[115]
(+ 1 2) ==> 3
(+ 1 2 3) ==> 6
(+ 10.0 3.0) ==> 13.0
(+ #c(1 2) #c(3 4)) ==> #c(4 6)
(- 5 4) ==> 1
(- 2) ==> -2
(- 10 3 5) ==> 2
(* 2 3) ==> 6
(* 2 3 4) ==> 24
(/ 10 5) ==> 2
(/ 10 5 2) ==> 1
(/ 2 3) ==> 2/3
(/ 4) ==> 1/4
If all the arguments are the same type of number (rational, floating point, or complex), the result will be the same type except in the case where the result of an operation on complex numbers with rational components yields a number with a zero imaginary part, in which case the result will be a rational. However, floating-point and complex numbers are contagious—if all the arguments are reals but one or more are floating-point numbers, the other arguments are converted to the nearest floating-point value in a "largest" floating-point representation of the actual floating-point arguments. Floating-point numbers in a "smaller" representation are also converted to the larger representation. Similarly, if any of the arguments are complex, any real arguments are converted to the complex equivalents.
(+ 1 2.0) ==> 3.0
(/ 2 3.0) ==> 0.6666667
(+ #c(1 2) 3) ==> #c(4 2)
(+ #c(1 2) 3/2) ==> #c(5/2 2)
(+ #c(1 1) #c(2 -1)) ==> 3
Because /
doesn't truncate, Common Lisp provides four flavors of truncating and rounding for converting a real number (rational or floating point) to an integer: FLOOR
truncates toward negative infinity, returning the largest integer less than or equal to the argument. CEILING
truncates toward positive infinity, returning the smallest integer greater than or equal to the argument. TRUNCATE
truncates toward zero, making it equivalent to FLOOR
for positive arguments and to CEILING
for negative arguments. And ROUND
rounds to the nearest integer. If the argument is exactly halfway between two integers, it rounds to the nearest even integer.
Two related functions are MOD
and REM
, which return the modulus and remainder of a truncating division on real numbers. These two functions are related to the FLOOR
and TRUNCATE
functions as follows:
(+ (* (floor (/ x y)) y) (mod x y)) === x
(+ (* (truncate (/ x y)) y) (rem x y)) === x
Thus, for positive quotients they're equivalent, but for negative quotients they produce different results.[116]
The functions 1+
and 1-
provide a shorthand way to express adding and subtracting one from a number. Note that these are different from the macros INCF
and DECF
. 1+
and 1-
are just functions that return a new value, but INCF
and DECF
modify a place. The following equivalences show the relation between INCF
/DECF
, 1+
/1-
, and +
/-
:
(incf x) === (setf x (1+ x)) === (setf x (+ x 1))
(decf x) === (setf x (1- x)) === (setf x (- x 1))
(incf x 10) === (setf x (+ x 10))
(decf x 10) === (setf x (- x 10))
- Higher Math
- What NAT is used for and basic terms and expressions
- Basics of the iptables command
- Basic Actions
- 1. Basic microprocessor systems
- Basic X Concepts
- Basic Shell Control
- tar: The Most Basic Backup Tool
- A Brief Review of Database Basics
- Understanding SQL Basics
- Using Basic Print Commands
- Basic Sendmail Configuration and Operation