2010-07-13 59 views
4

2^64仍然遠離「無限」我的內存/硬盤驅動器可以處理...GMP如何在任意數量的字節上存儲其整數?

首先,我想GMP如何與內存/處理器,因爲它確實某種見不得人的優化的...

我也想知道是否有一種在任意數量的字節上存儲整數(無符號,更容易)的方法。例如,在50個字節上,我會有一個2^400 -1的上限。 要做的事情就是保持數字一致,從一個字節到另一個字符保持一致,我對此有一些想法,但我真的不確定這是否是最快的方法。我甚至不確定我是否正確。

我猜GMP使用這種方式來存儲它的數據,但我只是想要一些(甚至很少)的解釋或一些理論的轉發(我沒有博士學位,所以不要強硬)。

+3

你瘋了。 – gokoon 2010-07-13 23:11:55

回答

17

GMP動態分配空間來表示數字(並在需要增長時重新分配)。

這在Integer Internals, in the GMP manual中有詳細的描述,它描述了它是如何將表示分塊爲「肢體」並將肢體存儲在一個數組中。

的「肢體」術語的描述來自GMP Basics: Nomenclature and Types

肢體意味着裝配在單個字的多精度數的一部分。 (我們選擇這個詞是因爲人體肢體類似於一個數字,只是數字較大,並且包含幾個數字。)通常肢體包含32或64位。肢體的C數據類型是mp_limb_t。

所以,較GMP許多通過分組的數四肢一起代表整數的大小,存儲在與一個符號位工作(符號位雙意要存儲四肢的數目)。

這對你意味着什麼?那麼,通常一個int64以64位表示。完成。如果你將這些包裝在一起,你可以大大增加。把兩個放在一起,2^64 * 2^64或2^128。再增加兩個肢體,你得到2^256。這是很多數字,以4個字存儲(加上表示開銷)。

當然,浮點數的表示更加複雜(see here),使用尾數(由符號和量值組成)和指數來存儲表示。

+1

+1優秀的答案。 – 2010-07-14 06:53:28

+0

如果將幾個這樣的東西打包在一起 通過包裝,你是指只考慮一個左邊和一個右邊的詞,並乘以第二個2^64?因此,爲了顯示存儲在4個64位字上的數字,gmp將第三個乘以2^192,第二個乘以2^128,最後乘以2^64。 – gokoon 2010-07-14 16:13:45

+0

@gokoon:實際上,是的。當然,它實際上不能實現乘法並將這些位存儲在一個64位的字中:)因此,要打印gmp整數的十進制值,可以使用'gmp_printf'例程,它將這些分支轉換爲一個字符串。 – Stephen 2010-07-14 16:28:41

相關問題