Common Lisp/高级主题/数字
外观
< Common Lisp | 高级主题
Common Lisp 比大多数编程语言更支持执行数字运算任务。这是通过支持大整数、有理数和复数,以及许多用于操作它们的函数来实现的。
数字类型的层次结构如下所示
- number
- real
- rational
- integer
- fixnum
- bignum
- ratio
- integer
- float
- short-float
- single-float
- double-float
- long-float
- rational
- complex
- real
Fixnums 是不太大的整数,可以非常有效地操作。哪些数字被认为是 fixnums 取决于实现,但所有 [-215,215-1] 中的整数都保证是 fixnums。
Bignums 是不是 fixnums 的整数。它们的尺寸受 Lisp 为其分配的内存量限制,因此它们可能非常大。对它们的操作比对 fixnums 慢得多。当然,这并不能使它们不那么有用。
比率表示两个整数的比率。它们的形式为 分子/分母。执行除法的函数 / 当其参数是整数或比率时总是产生比率。例如 (/ 1 2) 将得到 1/2,而不是 0.5。其他算术运算也能很好地处理比率。
Float 是 浮点数 的简称,一种数据类型,用于在大多数编程语言中表示非整数。Common Lisp 中有四种浮点数,它们提供了越来越高的精度(与实现相关)。默认情况下,实现假定使用短浮点数,它们具有有限的精度。要输入更精确的浮点数,必须使用其他文本表示法,例如,对于双精度浮点数,使用 "1.0d0"。
Complex 是一种数据类型,用于表示 复数。复数的表示法为 #C(实部 虚部)。实部和虚部都是有理数或浮点数。可以对复数执行的运算包括所有算术运算,以及许多可以扩展到复数的函数(如幂运算和对数运算)。
以下函数针对所有类型的数字定义
- 算术运算 +,-,*,/ 很明显(注意,它们可以有多个参数)。
- sin, cos, tan, acos, asin, atan 提供三角函数。
- 相同,在末尾添加 h(如 asinh)提供相应的双曲函数。
- exp 和 expt 执行幂运算。exp 接受一个参数并计算 ex,而 expt 接受两个参数(底数和指数)。
- sqrt 计算一个数字的平方根。
- log 计算对数。如果提供一个参数,则计算自然对数。如果提供了两个参数,则第二个参数用作底数。
- conjugate 返回一个数字的 共轭复数。对于实数,结果是数字本身。
- abs 返回一个数字的绝对值(或模数)。
- phase 返回一个数字的复数辐角(角度分量)。
- signum 返回一个与它的参数具有相同相位的数字,但模数为单位。
以下函数针对特定类型的数字定义
以下函数可用于比较数字。每个函数都接受任意数量的参数。
- = 如果所有参数都是相同值的数字,则返回 t,否则返回 nil。由于浮点数的精度问题,不建议对它们使用 =。
- /= 如果所有参数都是不同值的数字,则返回 t。请注意,
(/= a b c)
不总是与(not (= a b c))
相同。
- <, <=, >, >= 检查它们的参数是否按适当的单调顺序排列。这些函数不能应用于复数,原因显而易见。
- max 和 min 分别返回它们参数中的最大值和最小值。
这些函数用于将数字从一种类型转换为另一种类型。
- floor, ceiling, truncate, round 接受两个参数:数字和除数,并返回商(一个整数)和余数=数字-商*除数。选择商的方法取决于函数。floor 选择不超过比率=数字/除数的最大整数,ceiling 选择小于比率的最大整数,truncate 选择与比率符号相同的整数,且绝对值小于比率的绝对值的最大整数,round 选择最接近比率的整数(如果有两个这样的数字,则选择偶数整数)。注意:这些函数返回两个值(参见 多个值)。
- ffloor, fceiling, ftruncate, fround 与上面的相同,但商被转换为与数字相同的浮点数类型。
- (mod a b) 返回 (floor a b) 的第二个值。
- (rem a b) 返回 (truncate a b) 的第二个值。
- float 将第一个参数(一个实数)转换为浮点数。这可能有助于避免使用有理数进行缓慢的操作(参见示例 1)。可以提供第二个可选参数,它必须是浮点数 - 它将用作原型。结果将与原型具有相同的浮点数类型。
- rational 和 rationalize 将实数转换为有理数。当这个数字是浮点数时,rational 返回一个在数学上等价于浮点数的有理数。rationalize 逼近浮点数。前一个函数通常会产生分母很大的比率,因此它不像您想象的那样有用。
- numerator 和 denominator 返回有理数的对应部分。
- complex 从实部和虚部创建复数。函数 realpart 和 imagpart 返回一个数字的实部和虚部。
谓词如果为真则返回非 nil 结果,如果为假则返回 nil。
- zerop - 数字为零(Lisp 中可能存在多个零 - 整数零、实数零、复数零,也可能存在负零)。
- plusp, minusp - 实数为正/负。
- evenp, oddp - 整数为奇数/偶数。
- integerp - 数字为整数(类型为 integer - 参见上面的类型树)。
- floatp - 数字为浮点数。
- rationalp - 数字为有理数。
- realp - 数字为实数。
- complexp - 数字为复数。