Sin utilizar la aritmética de punto flotante: Para N
dígitos decimales, es necesario
(98981 * N)/238370 + 1
bytes. 98981/238370 es una buena aproximación racional (desde arriba) a log(10)/log(256)
(el 9 º convergente), formas truncadas de la división de enteros, por lo tanto se suman 1. La fórmula es apretado para N < 238370
, el número de bytes necesarios para representar 10^N - 1
es exactamente dada por eso, sobreestima para N
un múltiplo de 238370 y realmente grandeN
. Si no le da demasiado miedo asignar demasiado el byte impar, también puede usar (267 * N)/643 + 1
, (49 * N)/118 + 1
, (5 * N)/12 + 1
o, desperdiciando alrededor del 10% del espacio, (N + 1)/2
.
Como @Henrick Hellström señala, en Delphi habría que utilizar el operador div
para la división de número entero (perdido la etiqueta delphi).
1) ¿Su biblioteca de grandes int tiene alguna función 'Length'? 2) ¿Por qué quieres evitar el punto flotante? – CodesInChaos
Dependerá de cómo se almacena. Para la codificación estándar, cada dígito usa 4 bits, por lo que nBytes = (nDigits + 1)/2. También debería considerar usar compresión, incluso compresión en memoria, con algún algoritmo rápido. La relación variará, pero seguramente ahorrará espacio. Consulte también si sus datos pueden tener algunos patrones, como almacenar un delta entre los valores (después del orden, por ejemplo), lo que aumentará aún más la compresión. –