c ++:浮点运算稳定性策略

cmo*_*cmo 11 c++ math floating-accuracy stability numerical-stability

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

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

我处理数千/数百万微小概率的总和和产品.我使用MPFRC++具有2048位有效数的任意精度库,但仍然适用相同的问题.

我主要关心的是:

  1. 准确汇总许多数字的策略(例如上面的例子).
  2. 乘法和除法何时可能不稳定?(如果我想规范化大量数字,我的归一化常数应该是多少?最小值?最大?中位数?)

ybu*_*ill 6

二元求和并不能保证准确的结果.最可靠(尽管速度较慢)的方法是使用Kahan求和.Boost.Accumulators有上面的实现和更多.

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

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

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