Processing math: 100%

8 votos

Explicar este código para calcular log(1+x)

Es bien sabido que usted necesita tomar el cuidado al escribir una función para calcular un log(1+x) al x es pequeña. Porque de punto flotante de redondeo, 1+x tienen menos precisión que las x, lo que puede traducirse en grandes relativa de error en la computación de la log(1+x). En librerías numéricas que vemos a menudo una función log1p(), que calcula el registro de una, además de su argumento, por esta razón.

Sin embargo, hace poco estuve intrigado por esta implementación de log1p:

def log1p(x):
    y = 1 + x
    z = y - 1
    if z == 0:
        return x
    else:
        return x * (log(y) / z)

¿Por qué es x * (log(y) / z) una mejor aproximación a log(1+x) que sólo log(y)?

8voto

Knox Puntos 1543

La respuesta implica una sutileza de números de punto flotante. Voy a usar de punto flotante decimal en esta respuesta, pero se aplica igualmente bien a binaria de punto flotante.

Considerar decimal aritmética de punto flotante con cuatro lugares de precisión, y vamos a

x=0.0001234

A continuación, en virtud de punto flotante, además de a , tenemos

y=1x=1.0001 y z=y1=0.0001000

Si ahora nos denotan la perdida de precisión en xs=0.0000234, y la parte restante por ˉx, entonces podemos escribir

x=ˉx+s y=1+ˉx z=ˉx

Ahora, el valor exacto de log(1+x) es

log(1+x)=log(1+ˉx+s)=ˉx+s+O(ˉx2)=0.0001234

Si calculamos el log(y) entonces tenemos

log(1+ˉx)=ˉx+O(ˉx2)=.0001000

Por otra parte, si calculamos el x×(log(y)/z) entonces tenemos

(ˉx+s)(log(1+ˉx)÷ˉx)=(ˉx+s)(ˉx÷ˉx)=ˉx+s=0.0001234

así que mantener los dígitos de precisión que se habrían perdido sin esta corrección.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X