Nas implementações típicas de ponto flutuante, o resultado de uma única operação é produzido como se a operação fosse executada com precisão infinita e arredondada para o número de ponto flutuante mais próximo.
Compare e b + a : O resultado de cada operação executada com precisão infinita é o mesmo; portanto, esses resultados idênticos de precisão infinita são arredondados de maneira idêntica. Em outras palavras, a adição de ponto flutuante é comutativa.a + bb + a
Considere : b é um número de ponto flutuante. Com números binários de ponto flutuante, 2 b também é um número de ponto flutuante (o expoente é maior em um), então b + b é adicionado sem nenhum erro de arredondamento. Então a é adicionado ao valor exato b + b . O resultado é o valor exato 2 b + a , arredondado para o número de ponto flutuante mais próximo.b + b + ab2 bb + bumab + b2 b + a
Tome : a + b é adicionado e haverá um erro de arredondamento r , então obtemos o resultado a + b + r . Adicione b , e o resultado será o valor exato 2 b + a + r , arredondado para o número de ponto flutuante mais próximo.a + b + ba + bra + b + rb2 b + a + r
Então, em um caso, , arredondado. No outro caso, 2 b + a + r , arredondado.2 b + a2 b + a + r
PS. Quer se trate de dois números particulares e b ambos os cálculos se obter o mesmo resultado ou não depende dos números, e sobre o erro de arredondamento no cálculo um + b , e é geralmente difícil de prever. O uso de precisão simples ou dupla não faz diferença para o problema em princípio, mas como os erros de arredondamento são diferentes, haverá valores de aeb em que na precisão única os resultados são iguais e na precisão dupla não são, ou vice-versa. A precisão será muito maior, mas o problema de que duas expressões são matematicamente iguais, mas não iguais na aritmética de ponto flutuante permanece o mesmo.umaba + b
PPS. Em alguns idiomas, a aritmética de ponto flutuante pode ser executada com maior precisão ou com um intervalo maior de números do que o indicado pelas declarações reais. Nesse caso, seria muito mais provável (mas ainda não garantido) que ambas as somas apresentassem o mesmo resultado.
PPPS. Um comentário perguntou se deveríamos perguntar se os números de ponto flutuante são iguais ou não. Absolutamente se você souber o que está fazendo. Por exemplo, se você classifica uma matriz ou implementa um conjunto, você se mete em um problema terrível se quiser usar alguma noção de "aproximadamente igual". Em uma interface gráfica com o usuário, pode ser necessário recalcular o tamanho do objeto se o tamanho de um objeto foi alterado - você compara oldSize == newSize para evitar esse recálculo, sabendo que, na prática, você quase nunca tem tamanhos quase idênticos, e seu programa está correto mesmo se houver um recálculo desnecessário.