emacs/elisp 中的 bignum

发布于 2024-08-03 06:27:39 字数 42 浏览 5 评论 0原文

emacs 是否支持不适合整数的大数字?如果是的话,我该如何使用它们?

Does emacs have support for big numbers that don't fit in integers? If it does, how do I use them?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

撩动你心 2024-08-10 06:27:39

Emacs Lispers 对 Emacs 感到沮丧
缺乏 bignum 处理:calc.el
提供了非常好的bignum
功能。—EmacsWiki

calc.el 是 GNU Emacs 发行版的一部分。有关可用功能,请参阅其源代码。您可以通过输入 Mx fast-calc 立即开始使用它。您可能还想检查 bigint.el 包,这是一个用于处理 bignum 的非标准、轻量级实现。

Emacs Lispers frustrated by Emacs’s
lack of bignum handling: calc.el
provides very good bignum
capabilities.—EmacsWiki

calc.el is part of the GNU Emacs distribution. See its source code for available functions. You can immediately start playing with it by typing M-x quick-calc. You may also want to check bigint.el package, that is a non-standard, lightweight implementation for handling bignums.

一直在等你来 2024-08-10 06:27:39

Emacs 27.1 原生支持 bignum(参见 Emacs 的 NEWS 文件):

** Emacs Lisp 整数现在可以是任意大小。
Emacs 使用 GNU 多精度 (GMP) 库来支持
其大小太大而无法原生支持的整数。整数
原生支持的称为“fixnums”,而较大的是
“大数”。新谓词“bignump”和“fixnump”可用于
区分这两种类型的整数。

所有算术、比较和逻辑(又名“按位”)
bignums 有意义的操作现在支持 fixnums 和
大数。但是,请注意,与 fixnums 不同,bignums 不会比较
与 'eq' 相等,必须使用 'eql' 代替。 (数值比较
当然,使用“=”对两者都适用。)

由于大的 bignum 会消耗大量内存,Emacs 限制了
Lisp 程序允许创建的最大 bignum。这
新变量“integer-width”的非负值指定
bignum 中允许的最大位数。 Emacs 发出一个整数信号
如果超出此限制,则会出现溢出错误。

一些原始函数以前返回浮点数或列表
整数来表示不适合fixnums的整数。这些
函数现在只返回整数。受影响的功能
包括诸如“encode-char”之类的计算代码点、函数的函数
比如计算文件大小和其他属性的“文件属性”,
诸如“process-id”之类的函数可以计算进程 ID,以及诸如
'user-uid' 和 'group-gid' 计算用户和组 ID。

当使用固定数进行算术计算溢出固定数范围时,会自动选择 Bignum。表达式 (bignumpmost-positive-fixnum) 返回 nil,而 (bignump (+most-positive-fixnum 1)) 返回 t 。

Emacs 27.1 supports bignums natively (see the NEWS file of Emacs):

** Emacs Lisp integers can now be of arbitrary size.
Emacs uses the GNU Multiple Precision (GMP) library to support
integers whose size is too large to support natively. The integers
supported natively are known as "fixnums", while the larger ones are
"bignums". The new predicates 'bignump' and 'fixnump' can be used to
distinguish between these two types of integers.

All the arithmetic, comparison, and logical (a.k.a. "bitwise")
operations where bignums make sense now support both fixnums and
bignums. However, note that unlike fixnums, bignums will not compare
equal with 'eq', you must use 'eql' instead. (Numerical comparison
with '=' works on both, of course.)

Since large bignums consume a lot of memory, Emacs limits the size of
the largest bignum a Lisp program is allowed to create. The
nonnegative value of the new variable 'integer-width' specifies the
maximum number of bits allowed in a bignum. Emacs signals an integer
overflow error if this limit is exceeded.

Several primitive functions formerly returned floats or lists of
integers to represent integers that did not fit into fixnums. These
functions now simply return integers instead. Affected functions
include functions like 'encode-char' that compute code-points, functions
like 'file-attributes' that compute file sizes and other attributes,
functions like 'process-id' that compute process IDs, and functions like
'user-uid' and 'group-gid' that compute user and group IDs.

Bignums are automatically chosen when arithmetic calculations with fixnums overflow the fixnum-range. The expression (bignump most-positive-fixnum) returns nil while (bignump (+ most-positive-fixnum 1)) returns t.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文