9.7 表示法 (Representations)

Common Lisp 没有限制整数的大小。可以塞进一个字(word)内存的小整数称为定长数(fixnums)。在计算过程中,整数无法塞入一个字时,Lisp 切换至使用多个字的表示法(一个大数 「bignum」)。所以整数的大小限制取决于实体内存,而不是语言。

常量 most-positive-fixnummost-negative-fixnum 表示一个实现不使用大数所可表示的最大与最小的数字大小。在很多实现里,它们为:

  1. > (values most-positive-fixnum most-negative-fixnum)
  2. 536870911
  3. -536870912
  4. ;;; 译注: CCL 1.8 的结果为
  5. 1152921504606846975
  6. -1152921504606846976
  7. ;;; SBCL 1.0.55 的结果为
  8. 4611686018427387903
  9. -4611686018427387904

谓词 typep 接受一个参数及一个类型名称,并返回指定类型的参数。所以,

  1. > (typep 1 'fixnum)
  2. T
  3. > (type (1+ most-positive-fixnum) 'bignum)
  4. T

浮点数的数值限制是取决于各家实现的。 Common Lisp 提供了至多四种类型的浮点数:短浮点 short-float 、 单浮点 single-float 、双浮点 double-float 以及长浮点 long-float 。Common Lisp 的实现是不需要用不同的格式来表示这四种类型(很少有实现这么干)。

一般来说,短浮点应可塞入一个字,单浮点与双浮点提供普遍的单精度与双精度浮点数的概念,而长浮点,如果想要的话,可以是很大的数。但实现可以不对这四种类型做区别,也是完全没有问题的。

你可以指定你想要何种格式的浮点数,当数字是用科学表示法时,可以通过将 e 替换为 s f d l 来得到不同的浮点数。(你也可以使用大写,这对长浮点来说是个好主意,因为 l 看起来太像 1 了。)所以要表示最大的 1.0 你可以写 1L0

(译注: s 为短浮点、 f 为单浮点、 d 为双浮点、 l 为长浮点。)

在给定的实现里,用十六个全局常量标明了每个格式的限制。它们的名字是这种形式: m-s-f ,其中 mmostleastspositivenegative ,而 f 是四种浮点数之一。 λ

浮点数下溢(underflow)与溢出(overflow),都会被 Common Lisp 视为错误 :

  1. > (* most-positive-long-float 10)
  2. Error: floating-point-overflow