Сколько места нужно выделить в mpz_t (MPIR)?

Предположим, что я знаю, сколько цифр может быть в моем числе (и я хотел бы выделить правильное количество места в первый раз, как я могу рассчитать количество байтов, которое мне нужно выделить? Полагаю, я всегда мог установить значение на быть 1*10^(num digits) а потом 0 после, но это кажется неправильным, и как будто я побеждаю цель.

Изменить для ясности: я хочу знать, сколько байтов мне нужно хранить целое число с n десятичные цифры, и может ли реализация MPIR повлиять на это. @JonathonLeffler предоставил правильный ответ в комментарии к своему ответу.

0

Решение

Так как есть тег 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,

Два по сути одинаковы.

3

Другие решения


По вопросам рекламы [email protected]