[英]Sums on GNU Scientific Library (GSL)
我在GSL上使用了“均值”功能,事實證明它比我的幼稚實現更為准確。 我還沒有找到“求和”函數,而是使用了“均值” * N,但是我認為如果使用適當的求和函數會更干凈。
我正在對大量數字求和,並且我想知道這樣做是否可以避免實施穩定的求和算法。
提前致謝。
有時使用的一種技巧是使用cblas_ddot
函數,並使用一個1的向量來計算數據的點積。 這將有效地計算您的數據總和。
簡短答案:更好的求和方法是Kahan求和算法 。 這個答案更正表明
“它具有與單純求和相同的算法復雜度;它將大大提高求和的准確性。”,並給出了C ++的實現。
僅當數組元素的大小差異很大或者您確實需要原則上可以加倍的16位精度(稀有情況)時,才需要進行Kahan求和。
因此,在用C編碼kahan sum之前,您應該做一些檢查。 鑒於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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.