繁体   English   中英

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

[英]c++: strategies for stability of floating point arithmetic

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

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

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

我主要关心的是:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM