Предположим, что я знаю, сколько цифр может быть в моем числе (и я хотел бы выделить правильное количество места в первый раз, как я могу рассчитать количество байтов, которое мне нужно выделить? Полагаю, я всегда мог установить значение на быть 1*10^(num digits)
а потом 0
после, но это кажется неправильным, и как будто я побеждаю цель.
Изменить для ясности: я хочу знать, сколько байтов мне нужно хранить целое число с n
десятичные цифры, и может ли реализация MPIR повлиять на это. @JonathonLeffler предоставил правильный ответ в комментарии к своему ответу.
Так как есть тег MPIR, это, вероятно, о MPIR, вилка GMP. А в текущей документации (только в формате PDF — без онлайн-HTML) под заголовком «Инициализация целых чисел» вы можете найти:
void mpz_init2(mpz_t integer, mp_bitcnt_t n)
инициализировать
integer
, с местом для
n
биты, и установите его значение в 0.
n
это только начальное пространство,
integer
будет расти автоматически в обычном порядке, если это необходимо,
для последующих значений сохраняются.
mpz_init2
позволяет избежать таких перераспределений, если
Максимальный размер известен заранее.
Если бы это было для GMP, Вы можете прочитать онлайн руководство по Инициализация целых чисел найти:
— Функция:
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
,
Два по сути одинаковы.