La plupart des bibliothèques mathématiques ont un certain nombre de versions de fonctions logarithmes. La plupart du temps, nous supposons qu'ils sont parfaits, mais en fait, beaucoup d'entre eux n'offrent qu'un certain nombre de chiffres de précision.
Pour certaines fonctions, il existe des variantes numériquement plus stables. Par exemple, Fortran, R, Java et C ont tous deux Math.log1p
, pour l'informatique log(1.0+x)
(qui offre une plus grande précision pour les petites valeurs de x), et l'homologue expm1
. Ici, les problèmes numériques découlent d'une perte de précision - s'il x
est vraiment petit, 1.0 + x
perd des chiffres afin de conserver le 1 au début.
J'ai vu de telles fonctions pour une précision accrue dans un certain nombre de situations. Cela semble assez courant lorsque vous implémentez des fonctions de distribution (Gamma, Beta, Poisson, etc.) avec une grande précision numérique. Par exemple, la fonction Gamma semble être la plupart du temps utilisée comme logGamma
. En général, aller dans "logspace" peut améliorer beaucoup la précision, et donc R semble avoir un indicateur "logspace" sur la plupart des fonctions.
Un autre exemple, en R, existe log1mexp
pour log(1 - exp(p))
:
http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf
J'ai joué avec l'entropie et les mesures théoriques de l'information. Un terme très courant est
p * -log(p)
où habituellement, on voudrait que la base du logarithme soit 2, pas e; mais tout aussi souvent, ce n'est qu'un facteur linéaire, et vous pouvez également utiliser le logarithme naturel (ce n'est donc pas d'une importance capitale pour moi). Quoi qu'il en soit, savez-vous s'il existe un moyen plus rapide / plus direct / plus précis de calculer ce terme? Je l'ai partout, donc ça pourrait vraiment être payant pour le rendre un peu plus précis et rapide (sauvez-moi les trucs habituels "d'optimisation prématurée", merci).
Je ne vois aucune raison évidente qui entraînerait une perte de précision. Je suis donc surtout intéressé s'il existe une astuce intéressante pour accélérer ce calcul. Cela m'évite peut-être même de traiter le p=0
cas du coin (ce qui est raisonnable 0
, bien qu'il log(0)
n'existe pas) ou me donne gratuitement la base 2 (bien qu'une seule multiplication avec une constante ne soit évidemment pas coûteuse). Merci.
log2
fonction qui, selon votre système d'exploitation, peut être un simple wrapper log/log(2)
ou utiliser le fait que C99 a ajouté une log2
fonction.