【问题标题】:Sums on GNU Scientific Library (GSL)GNU 科学图书馆 (GSL) 上的总和
【发布时间】:2013-10-31 12:50:39
【问题描述】:

我在 GSL 上使用了'mean' 函数,事实证明它比我幼稚的实现更准确。虽然我还没有找到'sum'函数,但我使用的是'mean'*N,但我认为如果我使用适当的求和函数会更干净。

我正在对大量数字求和,我想知道这是为了尽可能避免实现稳定的求和算法。

提前致谢。

【问题讨论】:

  • 小心我刚刚在回答中编辑的警告

标签: c scientific-computing gsl scientific-software


【解决方案1】:

一个有时使用的技巧是使用cblas_ddot 函数并计算数据与向量的点积。这将有效地计算您的数据总和。

【讨论】:

  • 您能否更具体地说明这将如何避免精度损失(这似乎是他的问题)?
【解决方案2】:

简答:更好的求和方法是Kahan summation algorithmThis answer 更正说明

“它具有与朴素求和相同的算法复杂度;它将大大提高求和的准确性。”,并且还给出了C++的实现。

只有在数组元素的大小差异很大或者您确实需要 double 原则上可以提供的 16 位精度时(很少见),才需要 Kahan 求和。

因此,在用 C 编写 kahan 求和代码之前,您应该进行一些检查。鉴于gsl_stats_mean 的 GSL 实现是

(GSL 1.16 源代码)

  /* Compute the arithmetic mean of a dataset using the recurrence relation 
     mean_(n) = mean(n-1) + (data[n] - mean(n-1))/(n+1)   */

  long double mean = 0;
  size_t i;

  for (i = 0; i < size; i++)
  {
    mean += (data[i * stride] - mean) / (i + 1);
  }

如果您的数字在幅度上确实存在很大差异(您的高度可变的数字与平均值之间存在直接的总和,而平均值的幅度变化缓慢),我无法立即看到这将避免精度损失。一个很好的检查是在使用您的幼稚实现/gsl 计算总和/平均值之前对您的数组进行排序。

编辑 1:警告,如果启用优化,c = (t - sum) - y 可能会优化为 c = 0

【讨论】:

    猜你喜欢
    • 2014-12-17
    • 2023-03-31
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 2023-03-29
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多