Esistono modi migliori per calcolare


11

La maggior parte delle librerie matematiche ha un numero di versioni delle funzioni di logaritmo. La maggior parte delle volte riteniamo che siano perfetti, ma in realtà molti di loro offrono solo un certo numero di cifre di precisione.

Per alcune funzioni, ci sono varianti numericamente più stabili. Ad esempio Fortran, R, Java e C hanno entrambi Math.log1p, per il calcolo log(1.0+x)(che offre una maggiore precisione per piccoli valori di x), e la controparte expm1. Qui i problemi numerici derivano da una perdita di precisione: se xè veramente piccola, 1.0 + xperde cifre per preservare l'1 all'inizio.

Ho visto tali funzioni per una maggiore precisione in diverse situazioni. Questo sembra essere abbastanza comune ogni volta che si implementano funzioni di distribuzione (Gamma, Beta, Poisson ecc.) Con elevata precisione numerica. Ad esempio, la funzione Gamma sembra essere utilizzata la maggior parte delle volte logGamma. In generale, andare su "spazio di registro" può migliorare molto la precisione, e quindi R sembra avere un flag "spazio di registro" sulla maggior parte delle funzioni.

Un altro esempio, in R, esiste log1mexpper log(1 - exp(p)): http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf

Ho giocato con entropia e misure teoriche dell'informazione. C'è un termine molto comune

p * -log(p)

dove di solito si vorrebbe che la base del logaritmo fosse 2, non e; ma altrettanto spesso questo è solo un fattore lineare, e puoi anche usare il logaritmo naturale (quindi questo non è di fondamentale importanza per me). Ad ogni modo, sai se esiste un modo più veloce / più diretto / più preciso di calcolare questo termine? Lo sto facendo dappertutto, quindi potrebbe davvero pagare per renderlo un po 'più preciso e veloce (salvami le solite cose di "ottimizzazione prematura", grazie).

Non vedo alcuna ragione ovvia che potrebbe causare una perdita di precisione. Quindi sono principalmente interessato se c'è qualche bel trucco per accelerare questo calcolo. Questo forse mi salva anche nel trattare il p=0caso d'angolo (che è sensato 0, anche log(0)se non esiste) o mi dà la base 2 gratuitamente (anche se una singola moltiplicazione con una costante ovviamente non è costosa da morire). Grazie.


1
Se siete preoccupati per over / underflow, nota che a causa (doppia precisione), | log p | sarà al massimom10308pM10308|logp|700plogpp=0

R ha una log2funzione che, a seconda del sistema operativo, può essere un semplice wrapper log/log(2)o sfruttare il fatto che C99 ha aggiunto una log2funzione.
anonimo

Risposte:


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.