¿Existen formas mejoradas de calcular


11

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 xes realmente pequeño, 1.0 + xpierde 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 log1mexppara 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=0caso 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.


1
m10308pM10308|logp|700plogpp=0

R viene con una log2funció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 log2función.
anónimo

Respuestas:


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.