Следующая функция вычисляет 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)
в два этапа, но, может быть, есть оптимальный путь?
Почему бы просто не пойти прямо от тождества:
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));
}