Lisp - 数字



Common Lisp 定义了几种类型的数字。数字数据类型包含 LISP 支持的各种类型的数字。

LISP 支持的数字类型包括:

  • 整数
  • 比率
  • 浮点数
  • 复数

下图显示了 LISP 中的数字层次结构和各种数值数据类型:

Numeric Types

LISP 中的各种数值类型

下表描述了 LISP 中可用的各种数字类型数据:

序号 数据类型及描述
1

fixnum

此数据类型表示不太大的整数,通常在 -215 到 215-1 的范围内(取决于机器)

2

bignum

这些是非常大的数字,其大小受为 LISP 分配的内存量限制,它们不是 fixnum 数字。

3

ratio

表示分子/分母形式的两个数字的比率。当参数为整数时,/ 函数始终产生比率结果。

4

float

它表示非整数。有四种精度递增的 float 数据类型。

5

complex

它表示复数,用 #c 表示。实部和虚部都可以是有理数或浮点数。

示例

创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。

main.lisp

; write 1/2
(write (/ 1 2))
; terminate printing
(terpri)
; execute and print the expression result
(write ( + (/ 1 2) (/ 3 4)))
; terminate printing
(terpri)
; execute and print the expression result
(write ( + #c( 1 2) #c( 3 -4)))

输出

执行代码时,它返回以下结果:

1/2
5/4
#C(4 -2)

数字函数

下表描述了一些常用的数字函数:

序号 函数及描述
1

+, -, *, /

相应的算术运算

2

sin, cos, tan, acos, asin, atan

相应的三角函数。

3

sinh, cosh, tanh, acosh, asinh, atanh

相应的双曲函数。

4

exp

指数函数。计算 ex

5

expt

指数函数,同时接受底数和指数。

6

sqrt

它计算一个数字的平方根。

7

log

对数函数。如果只给出一个参数,则计算其自然对数,否则第二个参数用作底数。

8

conjugate

它计算一个数的复共轭。对于实数,它返回数字本身。

9

abs

它返回数字的绝对值(或大小)。

10

gcd

它计算给定数字的最大公约数。

11

lcm

它计算给定数字的最小公倍数。

12

isqrt

它给出小于或等于给定自然数的精确平方根的最大整数。

13

floor, ceiling, truncate, round

所有这些函数都接受一个数字作为参数并返回商;floor 返回不大于比率的最大整数,ceiling 选择大于比率的较小整数,truncate 选择与比率同号且绝对值小于比率绝对值的整数,而 round 选择最接近比率的整数。

14

ffloor, fceiling, ftruncate, fround

与上述相同,但返回商为浮点数。

15

mod, rem

返回除法运算中的余数。

16

float

将实数转换为浮点数。

17

rational, rationalize

将实数转换为有理数。

18

numerator, denominator

返回有理数的各个部分。

19

realpart, imagpart

返回复数的实部和虚部。

示例

更新名为 main.lisp 的源代码文件,并在其中键入以下代码。

main.lisp

; evaluate and print division result
(write (/ 45 78))
; terminate printing
(terpri)
; evaluate and print floor result
(write (floor 45 78))
; terminate printing
(terpri)
; evaluate and print division result
(write (/ 3456 75))
; terminate printing
(terpri)
; evaluate and print floor result
(write (floor 3456 75))
; terminate printing
(terpri)
; evaluate and print ceiling result
(write (ceiling 3456 75))
; terminate printing
(terpri)
; evaluate and print truncate result
(write (truncate 3456 75))
; terminate printing
(terpri)
; evaluate and print round result
(write (round 3456 75))
; terminate printing
(terpri)
; evaluate and print floor as floating result
(write (ffloor 3456 75))
; terminate printing
(terpri)
; evaluate and print ceiling as floating result
(write (fceiling 3456 75))
; terminate printing
(terpri)
; evaluate and print truncate as floating result
(write (ftruncate 3456 75))
; terminate printing
(terpri)
; evaluate and print round as floating result
(write (fround 3456 75))
; terminate printing
(terpri)
; evaluate and print mod as result
(write (mod 3456 75))
; terminate printing
(terpri)
; set c as complex number
(setq c (complex 6 7))
; print c
(write c)
; terminate printing
(terpri)
; write complex number
(write (complex 5 -9))
; terminate printing
(terpri)
; write real part of c
(write (realpart c))
; terminate printing
(terpri)
; write imaginary part of c
(write (imagpart c))

输出

执行代码时,它返回以下结果:

15/26
0
1152/25
46
47
46
46
46.0
47.0
46.0
46.0
6
#C(6 7)
#C(5 -9)
6
7
广告