I am trying to understand roundoff error for basic arithmetic operations in MATLAB and I came across the following curious example.
(0.3)^3 == (0.3)*(0.3)*(0.3)
ans = 0
I’d like to know exactly how the left-hand side is computed. MATLAB documentation suggests that for integer powers an ‘exponentiation by squaring’ algorithm is used.
“Matrix power. X^p is X to the power p, if p is a scalar. If p is an integer, the power is computed by repeated squaring.”
So I assumed (0.3)^3 and (0.3)*(0.3)^2 would return the same value. But this is not the case. How do I explain the difference in roundoff error?
Thanks to @Dougal I found this:
which gives:
The case is strange because the computation with more digits gives a worst result. This is due to the fact that anyway the initial number 0.3 is approximated with few digits and hence we start with a relatively “large” error. In this particular case what happens is that the computation with few digits gives another “large” error but with opposite sign… hence compensating the initial one. Instead the computation with more digits gives a second smaller error but the first one remains.