Может кто-нибудь объяснить, почему GMP mpz_sizeinbase вернет 1 слишком большой? - PullRequest
0 голосов
/ 10 декабря 2018

Я использую библиотеку gmp, пишу программу на C, например

len = mpz_sizeinbase(res, 10);

, когда res = 9, это дает мне 2. Так что я проверяю руководство, и оно говорит:

    size_t mpz_sizeinbase (mpz_t op, int base)

Возвращает размер операции, измеренный в количестве цифр в данной базе.base может варьироваться от 2 до 62. Знак op игнорируется, используется только абсолютное значение.Результат будет либо точным, либо 1 слишком большим.Если основание является степенью 2, результат всегда точен.Если op равен нулю, возвращаемое значение всегда равно 1.

Я просто хочу знать, почему эта функция конструируется с такой утечкой?Почему НЕ МОЖЕТ быть точным?

Некоторые вопросы, которые я нашел похожими:

GMP mpz_sizeinbase возвращает размер 2 для 9 в базе 10

Количество цифр GMP целое число

1 Ответ

0 голосов
/ 10 декабря 2018

mpz_sizeinbase не смотрит на целое число, а только на самое высокое слово.Затем он оценивает размер.Проблема в том, что он может смотреть на 999999999 или 1000000000. Чтобы точно знать, какой из двух битов числа нужно будет посмотреть.Что делает mpz_sizeinbase (используя слово == цифра для примера), вычисляет размер для 9xxxxxxxx.Часть xxxxxxxx игнорируется и может вызвать переполнение первой цифры.Таким образом, размер увеличивается на единицу и возвращается.

Это позволяет вам выделить достаточно места для быстрого преобразования числа с минимальными потерями в некоторых случаях.Альтернативой может быть преобразование целого числа только для того, чтобы получить размер, выделить буфер и затем сделать все заново, чтобы фактически сохранить результат.

...