跳转到内容

Common Lisp/高级主题/数字

来自 Wikibooks,开放的书籍,开放的世界

Common Lisp 比大多数编程语言更支持执行数字运算任务。这是通过支持大整数、有理数和复数,以及许多用于操作它们的函数来实现的。

数字类型

[编辑 | 编辑源代码]

数字类型的层次结构如下所示

  • number
    • real
      • rational
        • integer
          • fixnum
          • bignum
        • ratio
      • float
        • short-float
        • single-float
        • double-float
        • long-float
    • complex

Fixnums 和 Bignums

[编辑 | 编辑源代码]

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)提供相应的双曲函数。
  • expexpt 执行幂运算。exp 接受一个参数并计算 ex,而 expt 接受两个参数(底数和指数)。
  • sqrt 计算一个数字的平方根。
  • log 计算对数。如果提供一个参数,则计算自然对数。如果提供了两个参数,则第二个参数用作底数。
  • conjugate 返回一个数字的 共轭复数。对于实数,结果是数字本身。
  • abs 返回一个数字的绝对值(或模数)。
  • phase 返回一个数字的复数辐角(角度分量)。
  • signum 返回一个与它的参数具有相同相位的数字,但模数为单位。

以下函数针对特定类型的数字定义

  • gcdlcm 计算几个整数的 最大公约数最小公倍数
  • isqrt 返回小于或等于给定自然数的精确平方根的最大整数。
  • cis 计算 e,其中 φ 以弧度给出。

数字比较

[编辑 | 编辑源代码]

以下函数可用于比较数字。每个函数都接受任意数量的参数。

  • = 如果所有参数都是相同值的数字,则返回 t,否则返回 nil。由于浮点数的精度问题,不建议对它们使用 =
  • /= 如果所有参数都是不同值的数字,则返回 t。请注意,(/= a b c) 不总是与 (not (= a b c)) 相同。
  • <, <=, >, >= 检查它们的参数是否按适当的单调顺序排列。这些函数不能应用于复数,原因显而易见。
  • maxmin 分别返回它们参数中的最大值和最小值。

数值类型操作

[编辑 | 编辑源代码]

这些函数用于将数字从一种类型转换为另一种类型。

  • 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)。可以提供第二个可选参数,它必须是浮点数 - 它将用作原型。结果将与原型具有相同的浮点数类型。
  • rationalrationalize 将实数转换为有理数。当这个数字是浮点数时,rational 返回一个在数学上等价于浮点数的有理数。rationalize 逼近浮点数。前一个函数通常会产生分母很大的比率,因此它不像您想象的那样有用。
  • numeratordenominator 返回有理数的对应部分。
  • complex 从实部和虚部创建复数。函数 realpartimagpart 返回一个数字的实部和虚部。
[编辑 | 编辑源代码]

谓词如果为真则返回非 nil 结果,如果为假则返回 nil

  • zerop - 数字为零(Lisp 中可能存在多个零 - 整数零、实数零、复数零,也可能存在负零)。
  • plusp, minusp - 实数为正/负。
  • evenp, oddp - 整数为奇数/偶数。
  • integerp - 数字为整数(类型为 integer - 参见上面的类型树)。
  • floatp - 数字为浮点数。
  • rationalp - 数字为有理数。
  • realp - 数字为实数。
  • complexp - 数字为复数。
华夏公益教科书