9.7 表示法 (Representations)
Common Lisp 没有限制整数的大小。可以塞进一个字(word)内存的小整数称为定长数(fixnums)。在计算过程中,整数无法塞入一个字时,Lisp 切换至使用多个字的表示法(一个大数 「bignum」)。所以整数的大小限制取决于实体内存,而不是语言。
常量 most-positive-fixnum
与 most-negative-fixnum
表示一个实现不使用大数所可表示的最大与最小的数字大小。在很多实现里,它们为:
> (values most-positive-fixnum most-negative-fixnum)
536870911
-536870912
;;; 译注: CCL 1.8 的结果为
1152921504606846975
-1152921504606846976
;;; SBCL 1.0.55 的结果为
4611686018427387903
-4611686018427387904
谓词 typep
接受一个参数及一个类型名称,并返回指定类型的参数。所以,
> (typep 1 'fixnum)
T
> (type (1+ most-positive-fixnum) 'bignum)
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
,其中 m
是 most
或 least
, s
是 positive
或 negative
,而 f
是四种浮点数之一。 λ
浮点数下溢(underflow)与溢出(overflow),都会被 Common Lisp 视为错误 :
> (* most-positive-long-float 10)
Error: floating-point-overflow