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

0

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

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

  • 1
    Это связано с GMP ?
  • 0
    @JonathanLeffler Вопрос помечен MPIR, который, по-видимому, является форком GMP (мне пришлось его искать).
Показать ещё 1 комментарий
Теги:
mpir

1 ответ

3

Поскольку есть метка 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.

Оба они по существу одинаковы.

  • 0
    Да, я прочитал эту документацию. Мой вопрос, я полагаю, больше о том, как я вычисляю максимальное количество бит, которое мне нужно, основываясь на максимальном количестве разрешенных мне цифр. Это не конец света, хотя небольшая оптимизация.
  • 0
    Если вы знаете количество десятичных цифр, то количество необходимых битов приблизительно равно log2 (10) * decimal_digits, не так ли? Это поможет вам получить правильный ответ, если вы четко зададите вопрос - и включите справочную информацию о том, что вы знаете и что вы хотите объяснить.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню