La mayoría de las bibliotecas matemáticas tienen varias versiones de funciones de logaritmo. La mayoría de las veces suponemos que son perfectos, pero en realidad muchos de ellos solo ofrecen un cierto número de dígitos de precisión.
Para algunas funciones, hay variantes numéricamente más estables. Por ejemplo, Fortran, R, Java y C tienen ambos Math.log1p
, para computación log(1.0+x)
(que ofrece mayor precisión para valores pequeños de x), y la contraparte expm1
. Aquí los problemas numéricos surgen de una pérdida de precisión: si x
es realmente pequeño, 1.0 + x
pierde dígitos para preservar el 1 al principio.
He visto tales funciones para una mayor precisión en varias situaciones. Esto parece ser bastante común cada vez que implementa funciones de distribución (Gamma, Beta, Poisson, etc.) con alta precisión numérica. Por ejemplo, la función Gamma parece ser la mayor parte del tiempo utilizada como logGamma
. En general, ir al "espacio de registro" puede mejorar mucho la precisión, por lo que R parece tener un indicador de "espacio de registro" en la mayoría de las funciones.
Otro ejemplo, en R, existe log1mexp
para log(1 - exp(p))
:
http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf
He estado jugando con medidas teóricas de entropía e información. Un término muy común que hay
p * -log(p)
donde generalmente, uno desearía que la base del logaritmo sea 2, no e; pero con la misma frecuencia esto es solo un factor lineal, y también puede usar el logaritmo natural (por lo que esto no es de importancia clave para mí). De todos modos, ¿sabes si hay una forma más rápida / más directa / más precisa de calcular este término? Lo tengo por todas partes, por lo que realmente podría valer la pena hacerlo un poco más preciso y rápido (ahórreme las cosas habituales de "optimización prematura", gracias).
No veo ninguna razón obvia que pueda causar una pérdida de precisión. Por lo tanto, me interesa sobre todo si hay algún buen truco para acelerar este cálculo. Eso tal vez incluso me ahorre tratar el p=0
caso de la esquina (que es sensiblemente 0
, aunque log(0)
no existe) o me da la base 2 de forma gratuita (aunque una sola multiplicación con una constante obviamente no es muy costosa). Gracias.
log2
función que, dependiendo de su sistema operativo, puede ser una simple envoltura log/log(2)
o hacer uso del hecho de que C99 agregó una log2
función.