Estoy tratando de implementar la siguiente función en coma flotante de doble precisión con un error relativo bajo :
Esto se usa ampliamente en aplicaciones estadísticas para agregar probabilidades o densidades de probabilidad que se representan en el espacio logarítmico. Por supuesto, o podrían desbordarse o desbordarse fácilmente, lo que sería malo porque el espacio de registro se usa para evitar el desbordamiento en primer lugar. Esta es la solución típica:
La cancelación de ocurre, pero se mitiga con . Peor con diferencia es cuando y están cerca. Aquí hay un gráfico de error relativo:
El gráfico se corta entre para enfatizar la forma de la curva l o g s u m ( x , y ) = 0 , alrededor de la cual ocurre la cancelación. He visto el error de hasta 10 - 11 y sospechan que se pone mucho peor. (FWIW, la función de "verdad sobre el terreno" se implementa utilizando los flotantes de precisión arbitraria de MPFR con una precisión de 128 bits).
He intentado otras reformulaciones, todas con el mismo resultado. Con como la expresión externa, se produce el mismo error al tomar un registro de algo cercano a 1. Con l o g 1 p como la expresión externa, la cancelación ocurre en la expresión interna.
Ahora, el error absoluto es muy pequeño, por lo que tiene un error relativo muy pequeño (dentro de un épsilon). Uno podría argumentar que, debido a que un usuario de l o g s u m está realmente interesado en las probabilidades (no en las probabilidades de registro), este terrible error relativo no es un problema. Es probable que generalmente no lo sea, pero estoy escribiendo una función de biblioteca, y me gustaría que sus clientes puedan contar con un error relativo no mucho peor que el error de redondeo.
Parece que necesito un nuevo enfoque. ¿Qué puede ser?