谁能推荐任何包含维护各种浮点运算稳定性的策略的C++库/例程/软件包?

示例:假设您想对单位间隔为(0,1)的一百万个long double的 vector/数组求和,并且每个数字的数量级大致相同。天真地将for (int i=0;i<1000000;++i) sum += array[i];相加是不可靠的-对于足够大的isum的数量级将比array[i]大得多,因此sum += array[i]等同于sum += 0.00
(注意:此示例的解决方案是二进制求和策略。)

我处理成千上万种微小概率的总和和乘积。我正在使用具有2048位有效值的任意精度的MPFRC++库,但是仍然存在相同的问题。

我主要关心的是:

  • 精确求和多个数字的策略(例如,上面的示例)。
  • 乘法和除法什么时候可能不稳定? (如果我想对大量数字进行归一化,我的归一化常数应该是什么?最小值?最大?中位数?)
  • 最佳答案

    二进制求和不能保证结果的准确性。最可靠(虽然较慢)的方法是使用Kahan summationBoost.Accumulators具有上述功能以及更多其他功能。

    乘法和除法稳定性:除非您使用非规范化的浮点数,否则它们不会像求和和减法那样遭受相同的问题的困扰。实际上,乘法误差最多为0.5 ulp(最后一个单位)。



    “规范化”是什么意思?这取决于您使用的norm。可能的候选者:使用数组中的最大绝对值或任何其他广义均值。 (您列出的其他选项不起作用,因为即使对于非零数组,它们也可能为零。)

    关于C++:浮点算法稳定性的策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11265081/

    10-11 17:58