Сколько байтов требуется для хранения 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.