Creative Commons License Copyright © Michael Richmond. This work is licensed under a Creative Commons License.

An example of accumulated roundoff error

Consider the following two functions:

add_then_subtract.sci

function result = add_then_subtract(input_val, num_iter)
// Repeatedly multiply and divide the given value by three,
//   in such a way that the end result should be identical
//   to the input value.
//   
// Return the result.
// 

  result = input_val;
  one_third = 1.0/3.0;
    
  for icount = 1 : num_iter
    result = result + one_third;
  end
           
  for icount = 1 : num_iter
    result = result - one_third;
  end
                    
endfunction


add_subtract_together.sci

function result = add_subtract_together(input_val, num_iter)
// Repeatedly add and subtract a constant value
//   from the 'input_val',
//   in such a way that the end result should be identical
//   to the input value.
//   
// Return the result.
// 

  result = input_val;
  one_third = 1.0/3.0;
    
  for icount = 1 : num_iter
    result = result + one_third;
    result = result - one_third;
  end

endfunction


They look pretty similar, right? And, in theory, they ought to provide exactly the same result. But watch what happens when we run them with a large number of iterations: 100,000, to be exact.

First, we must type into the Scilab command window the command format ("v", 25) in order to see values displayed to their full internal precision.

>> format ("v", 25)

Now, we can run each function and see the results displayed to MATLAB's full precision.


>> add_subtract_together(9, 100000)

ans =

     9.

>> add_then_subtract(9,100000)

ans =

     9.0000000000019202417434

>>

Not exactly the same, are they?

Creative Commons License Copyright © Michael Richmond. This work is licensed under a Creative Commons License.