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