C GNU科学图书馆(GSL)综述

C GNU科学图书馆(GSL)综述,c,scientific-computing,gsl,scientific-software,C,Scientific Computing,Gsl,Scientific Software,我已经在GSL上使用了这个函数,它被证明比我天真的实现更准确。虽然我还没有找到一个“求和”函数,但我使用的是“平均值”*N,但我认为如果我使用一个合适的求和函数,它会更干净 我正在对大量的数字求和,我想知道这是为了尽可能避免实现一个稳定的求和算法 提前感谢。有时使用的一个技巧是使用cblas\u ddot函数,并用一个向量计算数据的点积。这将有效地计算数据的总和。简短回答:更好的求和方法是。他说 “它具有与天真求和相同的算法复杂性,它将大大提高求和的精度”,并且给出了C++中的一个实现。p> K

我已经在GSL上使用了这个函数,它被证明比我天真的实现更准确。虽然我还没有找到一个“求和”函数,但我使用的是“平均值”*N,但我认为如果我使用一个合适的求和函数,它会更干净

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


提前感谢。

有时使用的一个技巧是使用
cblas\u ddot
函数,并用一个向量计算数据的点积。这将有效地计算数据的总和。

简短回答:更好的求和方法是。他说

“它具有与天真求和相同的算法复杂性,它将大大提高求和的精度”,并且给出了C++中的一个实现。p> Kahan求和只有在数组元素的大小相差很大或者确实需要双精度原则上可以提供的16位精度时才有必要(罕见情况)

所以,在用C编写kahan求和之前,你应该做一些检查。鉴于GSL实现的
GSL\u stats\u mean

(GSL 1.16源代码)

/*使用递归关系计算数据集的算术平均值
平均值(n)=平均值(n-1)+(数据[n]-平均值(n-1))/(n+1)*/
长双均值=0;
尺寸i;
对于(i=0;i
我不能马上看出,如果你的数字在数量上确实有很大的不同,这将避免精度的损失(你的高度可变的数字和平均值之间有一个直接的和,它在数量上发展缓慢)。一个好的检查方法是在使用朴素的实现/gsl计算求和/平均值之前对数组进行排序


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

您能否更具体地说明如何避免精度损失(这似乎是他的问题)?请注意我刚才在回答中编辑的警告
  /* 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);
  }