Я хочу создать большое целое число из строкового представления, и для этого мне нужна верхняя граница количества цифр в целевой базе, чтобы избежать перераспределения памяти.
Пример:
Число 640 bit
имеет 640 цифр в base 2
, но только десять цифр в base 2^64
, поэтому мне придется выделить десять целых 64 bit
чисел для хранения результата.
Функция, которую я сейчас использую:
int get_num_digits_in_different_base(int n_digits, double src_base, double dst_base){
return ceil(n_digits*log(src_base)/log(dst_base));
}
Где src_base
находится в {2, ..., 10 + 26}
, а dst_base
находится в {2^8, 2^16, 2^32, 2^64}
.
Я не уверен, что результат всегда будет правильно округлен. log2
было бы проще рассуждать, но я читал, что старые версии Microsoft Visual C++ не поддерживают эту функцию. Его можно было эмулировать как log2(x) = log(x)/log(2)
, но теперь я вернулся к тому, с чего начал.
GMP, вероятно, реализует функцию для преобразования базы, но я могу не читать исходный код, иначе я могу заболеть раком GPL, поэтому я не могу этого сделать.