From: Vsevolod Stakhov Date: Sat, 5 Mar 2022 20:36:40 +0000 (+0000) Subject: [Minor] Move summation to a separate routine X-Git-Tag: 3.2~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b4e9a4f0b3bfa7d3bc3a40239b41d85a15a44be;p=thirdparty%2Frspamd.git [Minor] Move summation to a separate routine --- diff --git a/src/libutil/util.c b/src/libutil/util.c index e7348982bc..44f40280b5 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -2456,3 +2456,26 @@ rspamd_ptr_array_shuffle (GPtrArray *ar) g_ptr_array_index (ar, i) = t; } } + +float +rspamd_sum_floats (float *ar, gsize *nelts) +{ + float sum = 0.0f; + volatile float c = 0.0f; /* We don't want any optimisations around c */ + gsize cnt = 0; + + for (gsize i = 0; i < *nelts; i ++) { + float elt = ar[i]; + + if (!isnan(elt)) { + cnt ++; + float y = elt - c; + float t = sum + y; + c = (t - sum) - y; + sum = t; + } + } + + *nelts = cnt; + return sum; +} diff --git a/src/libutil/util.h b/src/libutil/util.h index 0eff1c990c..1d53807d42 100644 --- a/src/libutil/util.h +++ b/src/libutil/util.h @@ -518,6 +518,14 @@ struct rspamd_controller_pbkdf { extern const struct rspamd_controller_pbkdf pbkdf_list[]; +/** + * Sum array of floats using Kahan sum algorithm + * @param ar + * @param nelts + * @return + */ +float rspamd_sum_floats (float *ar, gsize *nelts); + #ifdef __cplusplus } #endif