我正在尝试计算一些非常小的值的平均数的对数。对于当前的数据集,极端点是
log_a=-1.6430e+03;
log_b=-3.8278e+03;
因此,实际上我想计算
(a+b) / 2
或log((a+b)/2)
,因为我知道(a+b)/2
作为double类型存储太小了。我考虑尝试通过填充常量来解决问题,这样我就不必存储
log_a
,而是存储log_a+c
,但似乎a
和b
之间相差太大了,为了使exp(log_b+c)
可计算,我需要填充log_b
的值,但这将导致exp(log_a+c)
变得太大。我是否忽略了一些明显的计算方法?据我所知,MATLAB只能使用双精度,所以我对如何进行这个简单的计算感到困惑。
编辑:澄清一下:我可以计算出这些特定值的确切答案。对于算法的其他运行,这些值将不同且可能更接近。到目前为止,已经有一些好的近似方法建议;如果实现精确解决方案不可行,是否还有其他适用于更普遍数字/值大小的近似方法?
(exp(log_a) + exp(log_b)) / 2
不就是a
和b
的平均值吗?原始值的平均数的对数更像是log((a+b)/2)
(虽然要得到这些值的平均数,你不能只取极值并将它们平均)。 - Dustya
和b
的平均值感兴趣,但我知道a
和b
都太小了,无法表示为双精度数,因此实际上我要找的是log((a+b)/2)
而不是(a+b)/2
。 - bnaula
和b
的数量级相差很大,将它们相加实际上不会影响a
的值长达几百位小数(远超双精度范围),因此log((a+b)/2)
会降为log(a/2)
或log_a-log(2)
。 - Dusty