17

在日志空间中将两个数字相乘意味着将它们相加:

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) {
    // ?
  }
4

2 回答 2

16

怎么样

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));
}

这只是基于我做的一些快速数学......

于 2009-04-22T17:10:56.510 回答
3

exp 和 log 的库函数会因极值而失去精度。log1p 让你成功了一半,但你需要一个函数来处理 log 和 exp 部分的错误。

见这篇文章:http ://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf

标题是“准确计算日志(1 - exp(-|a|))”。

这篇文章讨论了如何无缝地合并不同的算法来为更大范围的输入创建良好的误差范围。

于 2012-05-18T12:44:38.273 回答