When performing a computation between single and double, the return value will have the class with the lowest precision. This means that when you do
single (sin (10)) - sin (10)
your result will be of class single. Note that this is the same for operations between different integer types; you will get back the one with less precision. This means that before the subtraction happens, your double gets cast to single too.
From the other answers, it seems that Matlab actually performs the computations with doubles. This is very odd because Matlab also returns a single like Octave. It must convert the single to double, perform the computation in double, and the cast it to single. Anyway, I have reported an Octave bug for Matlab compatibility.