Small program that reproduces the problem follows:
#include <stdio.h>
void irrelevant(void)
{
static volatile int x;
x++;
}
double AddWithError(double& err, double a, double b)
{
double sum = a+b;
err = b-(sum-a);
//irrelevant();
return sum;
}
double AddDoubles(double pd[])
{
double sum = pd[0];
double addend_err;
double addend = AddWithError(addend_err, 0.0, pd[1]);
double sum1_err;
double sum1 = AddWithError(sum1_err, sum, addend);
return AddWithError(sum1_err, sum1, addend_err + sum1_err);
}
double g_aDoubles[2];
int main(int argc, char *argv[])
{
double err;
g_aDoubles[0] = 1.6;
g_aDoubles[1] = 0.1;
printf("%lg\n", AddDoubles(g_aDoubles));
return 0;
}