【问题标题】:Compute log(x - y) given log(x) and log(y), without overflows?给定 log(x) 和 log(y) 计算 log(x - y),没有溢出?
【发布时间】:2015-04-23 14:59:59
【问题描述】:

以下函数在给定log(x)log(y) 的值的情况下计算log(x + y),如果xy 非常大或非常小,则避免上溢或下溢:

double log_add(double logx, double logy)
{
    return max(logx, logy) + log1p(exp(-fabs(logx - logy)));
}

必须有一个类似的log_sub 函数来计算log(x - y)。这是什么?

更一般地说,我需要在给定log(x)log(y)log(z) 的情况下计算log(x - y - z)。从log_addlog_sub 我可以分两步计算log(x - y - z),但也许有最佳方法?

【问题讨论】:

  • @LưuVĩnhPhúc 不。您正在否定 y 的对数,而不是 y 本身。
  • 哎呀误读了这些值是日志

标签: c++ floating-point numeric logarithm


【解决方案1】:

为什么不直接从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));
}

【讨论】:

  • 由于存在对exp() 的调用,在我看来,代码存在真正的溢出风险。例如。 logy = 708logx = -3,将导致 IEEE-754 双精度算术溢出。
  • @njuffa 我只是提供身份:) 这些就是他们。
  • 有关 log1pexp 的详细信息,请参阅 cran.r-project.org/web/packages/Rmpfr/vignettes/…
  • 很遗憾,CRAN 目前似乎宕机了,试试cran.stat.ucla.edu/web/packages/Rmpfr/vignettes/…
  • @njuffa 我认为这段代码打算用 logx > logy 调用,但在这种情况下,我们很有可能遇到下溢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 2016-10-29
相关资源
最近更新 更多