我必须以编程方式确定表达式的值:
S = log(x1y1 + x2y2 + x3y3 ...)
仅使用以下值:
lxi = log(xi) lyi = log(yi)
计算每个 lx i 和 ly i 的反日志可能是不切实际的,不是期待......
有什么方法可以将此评估细分为简单求和?
修改
我在某处看到了一个C函数,它以简单的求和方式进行计算:
double log_add(double lx, double ly)
{
double temp,diff,z;
if (lx<ly) {
temp = lx; lx = ly; ly = temp;
}
diff = ly-lx;
z = exp(diff);
return lx+log(1.0+z);
}
为每对值添加返回值,这似乎给出了正确的答案。但是我无法弄清楚它是如何以及为什么有效的!
答案 0 :(得分:1)
直接的方法是执行两次取幂:
ln(x + y)= ln(e ln(x) + e ln(y))
log_add
函数使用稍微不同的方法来获得与 one 相同的结果:
ln(x + y)= ln((x + y)x / x)
= ln((x + y)/ x)+ ln(x)
= ln(1 + y / x)+ ln(x)
= ln(1 + e ln(y / x))+ ln(x)
= ln(1 + e ln(y)-ln(x))+ ln(x)