function - 我们知道log_add,但是log_subtract怎么做呢?

标签 function math numbers

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

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/

相关文章:

math - 从二维变换矩阵中提取旋转、缩放值

c - 我什么时候应该在 sqrtl 上使用 hypot?

function - Sass map.get() 不起作用。 map-get() 可以。是什么赋予了?

c++ - 错误 : control reaches end of non-void function [-Werror=return-type] } ^

opencv - 使用SVD时,如何对Sigma对角线的比例因子进行分类?

javascript - 计算像 "loop "这样的数字

java - 比较 int 和 Number 的最佳方法

c - 使出现巨大的数字

Javascript 函数不断添加文本

c - 将一个函数中矩阵的内容发送到另一个函数中的矩阵