[英]c++: strategies for stability of floating point arithmetic
任何人都可以推荐任何包含维护各种浮点运算稳定性的策略的C ++库/例程/包吗?
示例:假设您希望在单位间隔(0,1)中对一百万个long double
精度的矢量/数组求和,并且每个数字的大小大致相同。 天然求和for (int i=0;i<1000000;++i) sum += array[i];
是不可靠的 - 对于足够大的i
, sum
将比array[i]
具有更大的数量级,因此sum += array[i]
将等于sum += 0.00
。 (注意:此示例的解决方案是二进制求和策略。)
我处理数千/数百万微小概率的总和和产品。 我使用具有2048位有效数的任意精度库MPFRC++
,但同样的问题仍然适用。
我主要关心的是:
二元求和并不能保证准确的结果。 最可靠(尽管速度较慢)的方法是使用Kahan求和 。 Boost.Accumulators有上面的实现和更多。
乘法和除法稳定性:除非你得到非规范化的浮点数,否则它们不会遇到与求和和减法相同的问题。 事实上,乘法误差最多为0.5 ulp(单位最后一位)。
......我的归一化常数应该是多少?
'normalize'是什么意思? 这取决于您使用的规范 。 可能的候选者:使用数组中的最大绝对值,或任何其他广义均值。 (您列出的其他选项不起作用,因为即使非零数组也可能为零。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.