以下函数根据 log(x)
和 log(y)
的值计算 log(x + 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)
和日志(z)
。从 log_add
和 log_sub
我可以分两步计算 log(x - y - z)
,但也许有最佳方法?
最佳答案
为什么不直接从 identities 开始呢? :
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));
}
关于c++ - 计算给定 log(x) 和 log(y) 的 log(x - y),没有溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29827309/