Segundo o que você aprendeu em matemática, é claro que - (a - b) é a mesma coisa que (b - a). Será?
Assim pensava o cara que fez uma otimização no JDK para economizar uma operação aritmética - sabe como é que é, cada bytecode e cada instrução conta, quando se trata de deixar seu programa mais rápido.
Só que há uma sutileza que impede usar essa identidade matemática
- (a - b) == (b - a).
Essa sutileza aparece quando a e b são exatamente iguais.
Então, em Java, o primeiro lado dá o resultado -0.0, e o segundo lado dá o resultado +0.0. Nesse caso, como você deve saber, esses números são iguais quanto a usar “==”, mas não são a mesma coisa quanto eles são usados em algumas operações importantes.
Para perceber isso, note que em Java 1 / +0.0 é igual a +Infinity, e 1 / -0.0 é igual a -Infinity. O primeiro número (+Infinity) é obviamente muito diferente de -Infinity.
Mais detalhes em: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6796786
Note que muitos compiladores C e C++ também não fazem essa otimização “óbvia” - (a - b) == (b - a), justamente porque já encontraram essa sutileza antes.

