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)
?