我认为这是一个有效的问题,尽管措辞不太好。一个问题是,即使是弗林斯提到的问题也没有很好地表达出来,并且在得到一个好的答案之前就被关闭了。
然而,这个问题本身很有趣,特别是对于封闭的问题,它表明它甚至被包含在一本书中,因此它可以引导更多人朝一个或另一个方向发展。
我认为这两种算法都不是特别好。在朴素平均中,看起来我们会失去精度,或者当对具有几个差异幅度的数字进行平均时,我们甚至会丢失数字,但同样的情况也可能会在其他算法中发现,可能只是使用不同的输入数据集。
所以,特别是因为它来自现有的书,我认为这是一个寻求一些体面答案的完全有效的问题。
我试图通过一个例子来掩盖我对这两种算法的看法。因此,假设您有 4 个大小大致相同的数字,并且您想对它们进行平均。
天真的方法是先把它们总结起来,一个接着一个。在将前两个相加之后,您显然在低端损失了一点精度(因为您现在可能有一个更大的指数)。当您添加最后一个数字时,您丢失了 2 位(这些位现在用于表示总和的高部分)。但是然后你除以四,在这种情况下基本上只是从你的指数中减去 2。
在这个过程中我们失去了什么?现在更容易回答如果所有数字先被截断 2 位会怎样。在这种情况下,结果平均值的最后两位显然将为零,并且可能会引入多达 2 位的额外错误(如果所有截断的位恰好是原始数字中的位,而不是如果它们是零)。因此,本质上,如果源是具有 23 位小数的单精度浮点数,则生成的 avg 现在将具有大约 19 位的精度。
朴素方法的实际结果更好,尽管第一个数字相加并没有失去那么多精度。
在每次迭代中的微分方法中,将适当加权的差值添加到总和中。如果这些数字具有相同的数量级,那么这种差异很可能会比某个数量级低一个数量级。然后将其除以当前计数,在此操作中没有丢失任何内容,但最后一个数字(在此示例中 i=4)的结果差异可能比源数字低约 3 个数量级。我们将此添加到与原始数字大致相同的运行平均值中。
因此,使用此示例中的微分方法添加最后一个数字似乎损失了大约 3 位精度,对于所有 4 个数字,它甚至可能看起来我们可能会下降到 5 个本质上损失的精度位 - 甚至可能比天真的更糟糕方法?
微分方法更难遵循,也许我在假设中犯了一些错误。但我认为很清楚:认为一个或另一个表现更好似乎是不正确的,或者如果是这样,也许它取决于数据的布局和大小差异。