fork download
  1. #include <iostream>
  2.  
  3. float naive_sum( const float* arr, int n )
  4. {
  5. float sum = n ? arr[0] : 0.0 ;
  6.  
  7. for( int i = 1 ; i < n ; ++i ) sum += arr[i] ;
  8.  
  9. return sum;
  10. }
  11.  
  12. float kahan_sum( const float* arr, int n )
  13. {
  14. double sum = n ? arr[0] : 0.0 ;
  15. double correction = 0.0 ;
  16.  
  17. for( int i = 1 ; i < n ; ++i )
  18. {
  19. double corrected_val = arr[i] - correction ;
  20. double new_sum = sum + corrected_val ;
  21. correction = (new_sum - sum) - corrected_val ;
  22. sum = new_sum;
  23. }
  24.  
  25. return sum;
  26. }
  27.  
  28. int main()
  29. {
  30. const float arr[5] = { -1e10, -11.6, -10.0, +10.0, +1e10 } ;
  31. std::cout << "naive summation: " << naive_sum( arr, 5 ) << '\n'
  32. << "compensated summation: " << kahan_sum( arr, 5 ) << '\n' ;
  33. }
  34.  
Success #stdin #stdout 0s 2896KB
stdin
Standard input is empty
stdout
naive summation: 0
compensated summation: -11.6