将日志空间中的两个数字相乘意味着将它们相加:
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) ));
}
(Here 是另一个。)
但问题是:
减法也有技巧吗?
log_subtract(x, y) = log( exp(x) - exp(y) )
无需采用指数并失去精度?
double log_subtract(double x, double y) {
// ?
}
最佳答案
怎么样
double log_subtract(double x, double y) {
if(x <= y)
// error!! computing the log of a negative number
if(y == neginf)
return x;
return x + log1p(-exp(y-x));
}
这只是基于我所做的一些快速数学计算......
关于function - 我们知道log_add,但是log_subtract怎么做呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/778047/