Sto provando a calcolare la lunghezza di un intero in Haskell, usando il fatto che la lunghezza è uguale a truncate (log10(x)+1)
.Errore logbase di Haskell
Uso interi ho creato:
len :: Integer -> Integer
len i = toInteger (truncate (logBase 10 (fromIntegral i)) + 1)
Purtroppo, non tutti i numeri di ottenere la lunghezza corretta. Ho provato un paio di casi diversi e ha scoperto che:
logBase 10 10 = 1.0
logBase 10 100 = 2.0
logBase 10 1000 = 2.9999..6
logBase 10 10000 = 4.0
logBase 10 100000 = 5.0
logBase 10 1000000 = 5.9999999
C'è un motivo per cui logBase 10 1000
non restituisce 3.0? Come ottengo il valore log corretto per 1000 in base 10?
'logBase' è definita come' log y/log x'; la divisione è probabilmente il colpevole, poiché mentre il 'log' sarà corretto (per quanto riguarda gli arrotondamenti), la divisione di essi non deve essere. –
@BartekBanachewicz Quindi non c'è modo di ottenere il risultato corretto? Provato usando (log 1000)/(log 10), ma ancora 2.99996. Indovina che i valori di registro potrebbero essere arrotondati per 1000 e fino a 10, quindi sarà leggermente più piccolo di 3. – Pphoenix
Supponiamo che 'log' non sia necessario, potresti evitare l'operazione in virgola mobile dividendo ripetutamente per 10 (e più alta potenza di 10). – kennytm