2015-01-13 37 views
0

假設我知道我的號碼可能有多少位(我想第一次分配適當的空間量,我如何計算需要分配的字節數?我想我總是可以設置值是1*10^(num digits)再經過0但感覺錯了,就像我擊敗目的要在mpz_t(MPIR)中分配多少空間?

編輯爲清楚:我想知道我需要多少字節來存儲與n小數位數的整數,以及是否或者不是MPIRs的執行可能會影響到這一點。@JonathonLeffler在他的回答中提供了正確答案。

+1

這與[GMP](http://gmplib.org/)有關嗎? –

+0

@JonathanLeffler問題標籤爲MPIR,這顯然是一個GMP叉(我必須查找它)。 –

+0

我相信最好的問題是獨立的。標籤,甚至標題都是輔助信息。即使標籤和標題丟失,也應該回答問題。 –

回答

3

由於有一個MPIR標籤,這大概是MPIR,一個GMP叉子。而當前文檔中(僅PDF - 無在線HTML),標題 '初始化整數' 下,你可以找到:

void mpz_init2(mpz_t integer, mp_bitcnt_t n)

初始化 integer,與空間 n位,並設置其值爲0. n 只是初始空間, integer 會以正常的方式自動增長,必要時 會存儲後續值。 mpz_init2 可以避免這種重新分配,如果預先知道最大大小。

如果這是爲GMP,你可以閱讀Initializing integers聯機手冊上找到:

- 功能:void mpz_init2(mpz_t x, mp_bitcnt_t n)

初始化x,與空間n位數字,並設置其值爲0.調用此函數而不是mpz_initmpz_inits是不必要的;重新分配由GMP在需要時自動處理。

雖然n定義了最初的空格,但是x會以正常的方式自動增長,如果需要的話,對於後續存儲的值。 mpz_init2可以避免這種重新分配,如果預先知道最大大小。

在準備手術時,GMP通常比最終需要分配更多的肢體。爲確保GMP不會執行x的重新分配,您需要將mp_limb_t中的位數添加到n

兩者基本相同。

+0

是的,我閱讀了這個文檔。我想,我的問題更多的是關於如何根據我允許的最大位數來計算我需要的最大位數。這不是世界末日,只是一個小小的優化。 – Maria

+0

如果知道小數位數,那麼所需的位數大約是log2(10)* decimal_digits,不是嗎?如果你明確提出問題,它可以幫助你得到正確的答案 - 並且包括你知道什麼以及你想要解釋什麼的背景信息。 –

+0

這就是我正在尋找的,只是有點不確定MPIRs的實施是否會產生影響。沒有人故意問一個問題。 – Maria