Умножение двух чисел в пространстве журнала означает добавление их:
log_multiply(x, y) = log( exp(x) * exp(y) )
= x + y
Добавление двух чисел в пространство журнала означает, что вы выполняете специальную операцию добавления журнала:
log_add(x, y) = log( exp(x) + exp(y) )
, который реализован в следующем коде, таким образом, что мы не берем две экспоненты (и теряем скорость и точность времени выполнения):
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) ));
}
( Здесь - еще один).
Но вот вопрос:
Есть ли способ сделать это и для вычитания?
log_subtract(x, y) = log( exp(x) - exp(y) )
без необходимости брать показатели и терять точность?
double log_subtract(double x, double y) {
// ?
}