以下C代码有什么好处?

Cha*_*pps 2 c

给定log(a)和log(b),返回log(a + b)

double log_sum(double log_a, double log_b){
    double v;
    if(log_a < log_b){
        v=log_b+log(1+exp(log_a-log_b));
    }
    else{
        v=log_a+log(1+exp(log_b-log_a));
    }
    return v;
}
Run Code Online (Sandbox Code Playgroud)

我想知道上述功能有什么好处?

Jon*_*ler 7

主要(蛮力)替代方案如下:

v = log(exp(log_a) + exp(log_b));
Run Code Online (Sandbox Code Playgroud)

这有三个超越功能评估.

显示的计算仅使用两个超越函数 - 并且应该更快.

它在数值上也可能更稳定.


zda*_*dav 5

计算机和日志并不总是相处得很好.正如其他人所提到的那样,准确性成为一个真正的问题. 这篇博客文章对解释这一现象大有帮助.这篇文章是关于看似不必要的库函数,以及为什么它们实际上非常方便.

函数log1p计算log(1 + x).这有多难实现?

在处理日志/指数时,您可以使用各种疯狂规则和变换.我猜测的是,作者使用了其中一些规则来使计算更准确,更有效,或两者兼而有之.