任何人都可以推荐任何包含维护各种浮点运算稳定性的策略的C库/例程/程序包?
示例:假设您想在单位间隔(0,1)中的一个100万双倍的向量/数组中求和,并且每个数字大致相同的数量级. (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(最后单位).
… what should my normalization constant be?
“正常化”是什么意思?这取决于你使用的norm.可能的候选人:使用数组中的最大绝对值,或任何其他广义均值. (您列出的其他选项不起作用,因为即使对于非零数组也可能为零).