12

任何人都可以推荐任何包含维护各种浮点运算稳定性的策略的 C++ 库/例程/包吗?

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

我处理数千/数百万个微小概率的总和和乘积。我正在使用MPFRC++具有 2048 位有效位的任意精度库,但同样的问题仍然适用。

我主要关心的是:

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

1 回答 1

6

二进制求和不能保证准确的结果。最可靠(尽管速度较慢)的方法是使用Kahan summationBoost.Accumulators实现了上述以及更多。

乘法和除法稳定性:除非您使用非规范化浮点数,否则它们不会遇到与求和和减法相同的问题。事实上,乘法的误差最多为 0.5 ulp(单位最后一位)。

...我的归一化常数应该是多少?

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

于 2012-06-29T16:04:11.433 回答