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;
}

Reply via email to