Floating point 获取日志和添加与乘法

Floating point 获取日志和添加与乘法,floating-point,precision,multiplication,logarithm,exp,Floating Point,Precision,Multiplication,Logarithm,Exp,如果我想取浮点数列表的乘积,那么添加它们的日志,然后取总和的exp(而不是仅仅乘以它们)所损失的最坏情况/平均情况精度是多少。有没有更精确的情况?如果没有任何溢出或下溢的诡计,如果a和b是浮点数,那么乘积a*b将被计算到1/2 ulp的相对误差范围内 因此,将N

如果我想取浮点数列表的乘积,那么添加它们的日志,然后取总和的exp(而不是仅仅乘以它们)所损失的最坏情况/平均情况精度是多少。有没有更精确的情况?

如果没有任何溢出或下溢的诡计,如果
a
b
是浮点数,那么乘积
a*b
将被计算到1/2 ulp的相对误差范围内

因此,将
N
s链相乘后,相对误差的粗略界限将导致最多(1-epsilon/2)-N的因子,即exp(epsilon
N
/2)。我可以想象,在平均情况下,您可以预期大约epsilon sqrt(
N
)的偏差。(对于一阶,这大约是Nε。)

然而,指数溢出和下溢更可能发生在这种策略中;由于次正常值的舍入,您更可能得到无穷大、零和NaN以及不精确的值

从这个意义上说,另一种方法更稳健,但如果直接方法不会导致溢出或下溢,则速度要慢得多,错误更严重。这里有一个非常非常粗略的标准双倍分析,其中N至少比253小几个数量级:

你可以用一个有限浮点数的对数,得到一个有限浮点数,所以我们在这里很酷。您可以直接将
N
浮点数相加得到
N
epsilon最坏情况下的“相对”错误和sqrt(N)epsilon预期的“相对”错误,或者使用得到大约3 epsilon最坏情况下的“相对”错误。恐慌性引用是“相对”的,因为误差是相对于要求和的事物的绝对值之和的

请注意,没有绝对值大于710左右的对数。这意味着我们使用Kahan求和计算的对数之和的绝对误差最大为2130Nε。当我们将对数之和求幂时,我们从正确的答案中得到了最多为exp(2130Nε)的因子

log sum exp方法的一个示例:

intmain(){
双foo[]={0x1.000000000018cp1023,0x1.0000000000072p-1023};
双针=1;
双相图=0;
对于(int i=0;i

在我的平台上,我得到的差异为0x1.fep-44。我相信还有更糟糕的例子。

它不断地将我的“日志”标签更改为“日志”。我会在meta StackOverflow上问你,你可能想用“对数”来代替。谢谢你的解释,你知道有没有发表过分析log sum exp的文章?