10

2^64 距离我的内存/硬盘驱动器可以处理的“无穷大”还很远……

首先,我想知道 GMP 如何与内存/处理器一起工作,因为它会进行某种阴暗的优化......

我还想知道是否有一种方法可以在任意数量的字节上存储整数(无符号,这更容易)。例如,在 50 个字节上,我的上限为 2^400 -1。要做的事情是与进位很好地配合,以保持数字从一个字节到另一个字节一致,我对此有一些想法,但我真的不确定这是否是最快的方法。我什至不确定我是否正确。

我猜GMP使用这种方式来存储它的数据,但我只是想要一些(甚至很少)解释或一些理论的转发(我没有任何博士学位,所以不要强硬)。

4

1 回答 1

24

GMP 动态分配空间来表示数字(并在需要增长时重新分配)。

这在Integer Internals 中进行了详细描述,在 GMP 手册中,它描述了如何将表示分块为“肢体”并将肢体存储在数组中。

术语“肢体”的描述来自GMP Basics: Nomenclature and Types

肢体表示适合单个单词的多精度数字的一部分。(我们选择这个词是因为人体的肢体类似于数字,只是更大,并且包含几个数字。)通常肢体包含 32 或 64 位。肢体的 C 数据类型是 mp_limb_t。

因此,在 GMP 中表示一个数字是通过将多个肢体组合在一起来表示整数的大小,并用一个符号位存储(符号位具有双重用途,用于存储肢体的数量)。

这对你意味着什么?嗯,通常一个 int64 用 64 位表示。完毕。如果你把一堆这些打包在一起,你可以显着增加它。将两个放在一起,2^64*2^64 或 2^128。再加上两条肢体,你得到 2^256。这是很多数字,存储在 4 个单词中(加上表示开销)。

当然,浮点数的表示更复杂(参见此处),使用尾数(由符号和大小组成)和指数来存储表示。

于 2010-07-14T00:27:44.023 回答