【发布时间】:2009-09-03 06:01:11
【问题描述】:
emacs 是否支持不适合整数的大数字?如果有,我该如何使用它们?
【问题讨论】:
标签: elisp biginteger bignum
emacs 是否支持不适合整数的大数字?如果有,我该如何使用它们?
【问题讨论】:
标签: elisp biginteger bignum
Emacs Lispers 对 Emacs 的 缺少 bignum 处理:
calc.el提供了很好的 bignum 能力。—EmacsWiki
calc.el 是 GNU Emacs 发行版的一部分。有关可用功能,请参阅其源代码。您可以通过输入M-x quick-calc 立即开始使用它。您可能还想查看bigint.el package,这是一个用于处理 bignums 的非标准、轻量级实现。
【讨论】:
Emacs 27.1 原生支持 bignums(参见 the NEWS file of Emacs):
** Emacs Lisp 整数现在可以是任意大小。 Emacs 使用 GNU 多精度 (GMP) 库来支持 大小太大而无法原生支持的整数。整数 本机支持的称为“fixnums”,而较大的称为“fixnums” “大人物”。新的谓词“bignump”和“fixnump”可用于 区分这两种类型的整数。
所有算术、比较和逻辑(又名“按位”) bignums 有意义的操作现在支持 fixnums 和 大名鼎鼎。但是,请注意,与 fixnums 不同,bignums 不会比较 等于 'eq',你必须使用 'eql' 代替。 (数值比较 当然,'=' 对两者都有效。)
由于大的 bignums 会消耗大量内存,Emacs 会限制 Lisp 程序允许创建的最大 bignum。这 新变量“整数宽度”的非负值指定 bignum 中允许的最大位数。 Emacs 表示一个整数 如果超出此限制,则会出现溢出错误。
几个原始函数以前返回浮点数或列表 integers 来表示不适合 fixnums 的整数。这些 函数现在只是简单地返回整数。受影响的功能 包括像'encode-char'这样计算代码点的函数,函数 比如计算文件大小和其他属性的“文件属性”, 像“process-id”这样计算进程ID的函数,以及像 'user-uid' 和 'group-gid' 计算用户和组 ID。
当使用 fixnums 的算术计算溢出 fixnum 范围时,会自动选择 Bignums。表达式(bignump most-positive-fixnum) 返回nil 而(bignump (+ most-positive-fixnum 1)) 返回t。
【讨论】: