谁能推荐任何包含维护各种浮点运算稳定性的策略的C++库/例程/软件包?
示例:假设您想对单位间隔为(0,1)的一百万个long double
的 vector/数组求和,并且每个数字的数量级大致相同。天真地将for (int i=0;i<1000000;++i) sum += array[i];
相加是不可靠的-对于足够大的i
,sum
的数量级将比array[i]
大得多,因此sum += array[i]
等同于sum += 0.00
。
(注意:此示例的解决方案是二进制求和策略。)
我处理成千上万种微小概率的总和和乘积。我正在使用具有2048位有效值的任意精度的MPFRC++
库,但是仍然存在相同的问题。
我主要关心的是:
最佳答案
二进制求和不能保证结果的准确性。最可靠(虽然较慢)的方法是使用Kahan summation。 Boost.Accumulators具有上述功能以及更多其他功能。
乘法和除法稳定性:除非您使用非规范化的浮点数,否则它们不会像求和和减法那样遭受相同的问题的困扰。实际上,乘法误差最多为0.5 ulp(最后一个单位)。
“规范化”是什么意思?这取决于您使用的norm。可能的候选者:使用数组中的最大绝对值或任何其他广义均值。 (您列出的其他选项不起作用,因为即使对于非零数组,它们也可能为零。)
关于C++:浮点算法稳定性的策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11265081/