gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:23:42 27 4
gpt4 key购买 nike

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

示例:假设您想对一百万个 vector/数组求和 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. 什么时候乘法和除法可能不稳定? (如果我想对大量数字进行归一化,我的归一化常数应该是多少?最小值?最大?中位数?)

最佳答案

二进制求和不能保证结果准确。最可靠(尽管较慢)的方法是使用 Kahan summation . Boost.Accumulators有上述的实现以及更多。

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

... what should my normalization constant be?

“正常化”是什么意思?这取决于 norm你用。可能的候选者:使用数组中的最大绝对值,或任何其他广义平均值。 (您列出的其他选择不起作用,因为即使对于非零数组,它们也可能为零。)

关于c++:浮点运算的稳定性策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265081/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com