This commit is contained in:
Christopher Wellons 2023-05-16 02:23:12 -07:00 committed by GitHub
commit 3c20917502
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 12 deletions

View file

@ -24,8 +24,14 @@
*/
double fsum(const double *p, size_t n) {
size_t i;
double s;
if (n > 8) return fsum(p, n / 2) + fsum(p + n / 2, n - n / 2);
for (s = i = 0; i < n; ++i) s += p[i];
return s;
double err, sum, t, y;
sum = err = 0;
for (i = 0; i < n; ++i) {
y = p[i] - err;
t = sum + y;
err = (t - sum) - y;
sum = t;
}
return sum;
}

View file

@ -23,9 +23,15 @@
* Adds floats in array.
*/
float fsumf(const float *p, size_t n) {
float s;
size_t i;
if (n > 8) return fsumf(p, n / 2) + fsumf(p + n / 2, n - n / 2);
for (s = i = 0; i < n; ++i) s += p[i];
return s;
double err, sum, t, y;
sum = err = 0;
for (i = 0; i < n; ++i) {
y = p[i] - err;
t = sum + y;
err = (t - sum) - y;
sum = t;
}
return sum;
}

View file

@ -31,21 +31,21 @@ double D[N];
void SetUp(void) {
int i;
for (i = 0; i < N / 2; ++i) {
D[i * 2 + 0] = 1000000000.1;
D[i * 2 + 0] = 10000000000.1;
D[i * 2 + 1] = 1.1;
}
for (i = 0; i < N / 2; ++i) {
F[i * 2 + 0] = 1000.1;
F[i * 2 + 0] = 10000.1;
F[i * 2 + 1] = 1.1;
}
}
TEST(fsum, test) {
EXPECT_STREQ("500000000.6", _gc(xasprintf("%.15g", fsum(D, N) / N)));
EXPECT_STREQ("5000000000.6", _gc(xasprintf("%.16g", fsum(D, N) / N)));
}
TEST(fsumf, test) {
EXPECT_STREQ("500.6", _gc(xasprintf("%.7g", fsumf(F, N) / N)));
EXPECT_STREQ("5000.5996", _gc(xasprintf("%.8g", fsumf(F, N) / N)));
}
BENCH(fsum, bench) {