Senza usare aritmetica in virgola mobile: Per N
cifre decimali, è necessario
(98981 * N)/238370 + 1
byte. 98981/238370 è una buona approssimazione razionale (dall'alto) a (il 9 th convergente), la divisione intera tronca, quindi aggiungere 1. La formula è stretta per N < 238370
, il numero di byte necessario per rappresentare 10^N - 1
è esattamente indicato da ciò, sovrastima per N
un multiplo di 238370 e molto grandeN
. Se non hai troppa paura di allocare troppo il byte dispari, puoi anche utilizzare (267 * N)/643 + 1
, (49 * N)/118 + 1
, (5 * N)/12 + 1
oppure, sprecando circa il 10% di spazio, (N + 1)/2
.
Come sottolinea @Henrick Hellström, in Delphi si dovrebbe usare l'operatore div
per la divisione in interi (manca il tag delphi).
fonte
2012-02-25 11:13:37
1) La tua libreria big int ha una funzione 'Length'? 2) Perché vuoi evitare il virgola mobile? – CodesInChaos
Dipenderà da come viene memorizzato. Per la codifica standard, ogni cifra utilizza 4 bit, quindi nBytes = (nDigits + 1)/2. Dovresti anche considerare l'uso della compressione, anche della compressione in memoria, con un algoritmo veloce. Il rapporto varierà, ma risparmierai sicuramente spazio. Vedi anche se i tuoi dati potrebbero avere alcuni pattern, come la memorizzazione di un delta tra i valori (dopo l'ordinamento ad es.), Che aumenterà ancora di più la compressione. –