#include <iostream>

float naive_sum( const float* arr, int n )
{
    float sum = n ? arr[0] : 0.0 ;

    for( int i = 1 ; i < n ; ++i ) sum += arr[i] ;

    return sum;
}

float kahan_sum( const float* arr, int n )
{
    double sum = n ? arr[0] : 0.0 ;
    double correction = 0.0 ;

    for( int i = 1 ; i < n ; ++i )
    {
        double corrected_val = arr[i] - correction ;
        double new_sum = sum + corrected_val ;
        correction = (new_sum - sum) - corrected_val ;
        sum = new_sum;
    }

    return sum;
}

int main()
{
    const float arr[5] = { -1e10, -11.6, -10.0,  +10.0, +1e10 } ;
    std::cout << "naive summation: " << naive_sum( arr, 5 ) << '\n'
              << "compensated summation: " << kahan_sum( arr, 5 ) << '\n' ;
}
