Multiplicando dos números en el espacio de registro de los medios de adición:Sabemos log_add, pero ¿cómo hacer log_subtract?
log_multiply(x, y) = log(exp(x) * exp(y))
= x + y
Adición dos números en el espacio de registro significa que haces un registro agregado especial de operación:
log_add(x, y) = log(exp(x) + exp(y))
que se implementa en el siguiente código, de una manera que no requiere que tomemos las dos exponenciales (y perdamos la velocidad y la precisión del tiempo de ejecución):
double log_add(double x, double y) {
if(x == neginf)
return y;
if(y == neginf)
return x;
return max(x, y) + log1p(exp(-fabs(x - y)));
}
(Here es otra.)
Pero aquí es la pregunta:
¿Hay un truco para que lo haga por sustracción así?
log_subtract(x, y) = log(exp(x) - exp(y))
sin tener que tomar los exponentes y perder precisión?
double log_subtract(double x, double y) {
// ?
}
Por cierto, log (exp (x) * exp (y)) == x + y, no log (x + y). –
Oh, correcto. Arreglado. –
+1 solo porque me considero muy versado en matemáticas y nunca he oído hablar de esa identidad. –