我们知道log_add,但是如何做log_subtract?

13 math numbers function

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

log_multiply(x, y) = log( exp(x) * exp(y) )
                   = x + y
Run Code Online (Sandbox Code Playgroud)

在日志空间中添加两个数字意味着您执行特殊的日志添加操作:

log_add(x, y) = log( exp(x) + exp(y) )
Run Code Online (Sandbox Code Playgroud)

这是在以下代码中实现的,其方式不需要我们采用两个指数(并且失去运行时速度和精度):

  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) ));
  }
Run Code Online (Sandbox Code Playgroud)

(是另一个.)

但问题是:

还有一个技巧可以用于减法吗?

log_subtract(x, y) = log( exp(x) - exp(y) )
Run Code Online (Sandbox Code Playgroud)

不必拿指数而失去精确度?

  double log_subtract(double x, double y) {
    // ?
  }
Run Code Online (Sandbox Code Playgroud)

Dav*_*d Z 11

怎么样

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));
}
Run Code Online (Sandbox Code Playgroud)

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

  • 嗯......如果在你的程序中以这种方式进行操作很方便,那么就去吧,但数学上并不是这样.log(x)的*limit*为x变为0(对于正x)确实是-inf,但log(0)本身没有值. (2认同)