2015-01-13 3 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의 포크. n 비트에 대 한 공간을 가진,

void mpz_init2(mpz_t integer, mp_bitcnt_t n)

초기화 integer 및 설정 : - 그리고 (전용 PDF없이 온라인 HTML) 현재 문서, 제목 '초기화 정수'에서, 당신은 찾을 수 있습니다ninteger 이 정상적인 방법으로 자동으로 커지며, 필요한 경우 은 이후 값으로 저장됩니다. mpz_init2 최대 크기가 미리 알려지면 이러한 재 할당을 피할 수 있습니다. 이 GMP 위해이었다

경우에, 당신은 찾을 Initializing integers에 온라인 매뉴얼을 읽을 수 있습니다

- 기능 : void mpz_init2(mpz_t x, mp_bitcnt_t n)

초기화 x, 공간 n 비트의 숫자 및 설정 이 값을 0으로 설정하면 mpz_init 또는 mpz_inits 대신이 함수를 호출 할 필요가 없습니다. 재 할당은 필요할 때 GMP에 의해 자동으로 처리됩니다.

n은 초기 공간을 정의하지만 필요한 경우 이후 값을 저장하기 위해 보통 방법으로 x이 자동으로 커집니다. mpz_init2은 미리 최대 크기를 알고있는 경우 이러한 재 할당을 피할 수 있습니다.

수술 준비를 위해 GMP는 종종 궁극적으로 필요한 것보다 한 개의 다리를 할당합니다. GMP가 x에 대한 재 할당을 수행하지 않도록하려면 mp_limb_t의 비트 수를 n에 추가해야합니다.

두 개는 본질적으로 동일합니다.

+0

네,이 문서를 읽었습니다. 내 질문에, 내가 허용하는 최대 자릿수를 기반으로 필요한 최대 비트 수를 계산하는 방법에 대한 자세한 내용입니다. 그것은 세상의 종말은 아니지만 사소한 최적화입니다. – Maria

+0

10 진수의 숫자를 알고 있다면 필요한 비트 수는 대략 log2 (10) * decimal_digits입니다. 질문을하면 질문에 대한 답을 얻을 수 있으며, 알고있는 내용과 원하는 내용에 대한 배경 정보를 포함 할 수 있습니다. –

+0

그것이 내가 MPIR의 구현이 효과가 있는지 여부에 대해 조금은 확신 할 수 없었던 내가 찾고있는 것이다. 아무도 고의로 질문을 심하게 묻지 않습니다. – Maria

관련 문제