Предположим, что я знаю, сколько цифр может быть у меня (и я хотел бы выделить нужное количество пространства в первый раз, как я могу вычислить количество байтов, которые мне нужно выделить?) Я полагаю, что всегда мог бы установить значение быть 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
-bit чисел, и установите его значение равным 0. Вызов этой функции вместоmpz_init
илиmpz_inits
никогда не требуется; перераспределение обрабатывается автоматически GMP, когда это необходимо.В то время как
n
определяет начальное пространство,x
будет расти автоматически обычным образом, если необходимо, для последующих значений.mpz_init2
позволяет избежать таких перераспределений, если заранее известен максимальный размер.При подготовке к операции GMP часто выделяет одну конечность больше, чем в конечном итоге необходимо. Чтобы убедиться, что GMP не будет выполнять перераспределение для
x
, вам нужно добавить количество бит в mp_limb_t вn
.
Оба они по существу одинаковы.