Сколько байтов требуется для хранения N десятичных цифр
У меня есть строка произвольной длины, представляющая десятичное целочисленное значение и преобразовывающая эту строку в большое целое число в обычном двоичном формате (не BCD, более 64 бит).
Я ищу хорошую простую оценку, сколько байтов будет содержать N десятичных цифр, без использования арифметики с плавающей запятой.
Ответы
Ответ 1
Без использования арифметики с плавающей запятой: для N
десятичных цифр вам нужно
(98981 * N) / 238370 + 1
байт. 98981/238370 - хорошая рациональная аппроксимация (сверху) до log(10)/log(256)
(9 th сходящаяся), целочисленное деление усекает, поэтому добавьте 1. Формула плотна для N < 238370
, число байты, необходимые для представления 10^N - 1
, точно определяются этим, он переоценивает для N
кратное 238370 и действительно большое N
. Если вы не слишком боитесь слишком много выделять лишний байт, вы также можете использовать (267 * N) / 643 + 1
, (49 * N) / 118 + 1
, (5 * N) / 12 + 1
или, тратя около 10% пространства, (N + 1) / 2
.
Как указывает @Henrick Hellström, в Delphi нужно было бы использовать оператор div
для целочисленного деления (пропустил тег delphi).
Ответ 2
Вам нужно это много бит: ceil(N/log10(2))
. Раунд до следующего кратного 8, т.е. ceil((N/log10(2))/8)+1
байт.
Ответ 3
((size_t)ceil(N/log10(2)) + CHAR_BIT - 1) / CHAR_BIT
Теперь 1/log10(2)
~ = 3.32
можно приблизить как 10.0/3
= 3.3(3)
.
Итак, без плавающей запятой было бы не более (((size_t)N*10+2)/3 + CHAR_BIT - 1) / CHAR_BIT
C байтов.
Следите за переполнениями, когда N
большой.
Ответ 4
Возможно, вы ищете арифметику с фиксированной точкой
Максимальное значение типа с фиксированной точкой - это просто наибольшее значение которые могут быть представлены в базовом целочисленном типе, умноженном на коэффициент масштабирования; и аналогично для минимального значения. Например, рассмотрим тип фиксированной точки, представленный как двоичный целое число с b битами в двух дополнительных форматах с коэффициентом масштабирования из 1/2f (т.е. последние f бит представляют собой бит бит): минимальный представляемое значение равно -2b-1/2f, а максимальное значение равно (2b-1-1)/2f.