Вычислить log (x — y) с учетом log (x) и log (y), без переполнений?

Следующая функция вычисляет log(x + y) учитывая значения log(x) а также log(y), избегая переполнения или недополнения, если x или же y очень большие или очень маленькие:

double log_add(double logx, double logy)
{
return max(logx, logy) + log1p(exp(-fabs(logx - logy)));
}

Должен быть аналог log_sub функция для вычисления log(x - y), Что это?

В общем, мне нужно вычислить log(x - y - z) дано log(x), log(y) а также log(z), От log_add а также log_sub Я могу вычислить log(x - y - z) в два этапа, но, может быть, есть оптимальный путь?

3

Решение

Почему бы просто не пойти прямо от тождества:

double log_add(double logx, double logy) {
return logx + log1p(exp(logy - logx));
}

double log_sub(double logx, double logy) {
return logx + log1p(-exp(logy - logx));
}

Для вашего конкретного случая:

// log(x - y - z) given the three logs
double log_xyz(double logx, double logy, double logz) {
return logx + log1p(-exp(logy - logx) - exp(logz - logx));
}
3

Другие решения


По вопросам рекламы [email protected]