Nelle tipiche implementazioni in virgola mobile, il risultato di una singola operazione viene prodotto come se l'operazione fosse eseguita con precisione infinita e quindi arrotondata al numero in virgola mobile più vicino.
Confronta e : il risultato di ogni operazione eseguita con precisione infinita è lo stesso, quindi questi risultati identici di precisione infinita sono arrotondati in modo identico. In altre parole, l'aggiunta in virgola mobile è commutativa.a + bb + a
Prendi : è un numero in virgola mobile. Con i numeri binari in virgola mobile, è anche un numero in virgola mobile (l'esponente è maggiore di uno), quindi viene aggiunto senza errori di arrotondamento. Quindi viene aggiunto il valore esatto . Il risultato è il valore esatto , arrotondato al numero in virgola mobile più vicino.b + b + aB2 bb + bun'b + b2 b + a
Prendi : viene aggiunto a e si verificherà un errore di arrotondamento , quindi si ottiene il risultato . Aggiungi e il risultato è il valore esatto , arrotondato al numero in virgola mobile più vicino.a + b + ba + bra + b + rB2 b + a + r
Quindi, in un caso, , arrotondato. Nell'altro caso, , arrotondato.2 b + a2 b + a + r
PS. Sia per due numeri particolari e entrambi calcoli danno lo stesso risultato o non dipende dai numeri, e l'errore di arrotondamento nel calcolo , e di solito è difficile da prevedere. L'uso della precisione singola o doppia in linea di principio non fa differenza per il problema, ma poiché gli errori di arrotondamento sono diversi, ci saranno valori di aeb dove in singola precisione i risultati sono uguali e in doppia precisione non lo sono, o viceversa. La precisione sarà molto più elevata, ma il problema che due espressioni sono matematicamente uguali ma non uguali nell'aritmetica in virgola mobile rimane lo stesso.un'Ba + b
PPS. In alcune lingue, l'aritmetica in virgola mobile può essere eseguita con una precisione più elevata o un intervallo di numeri più elevato rispetto a quanto indicato dalle istruzioni effettive. In tal caso, sarebbe molto più probabile (ma ancora non garantito) che entrambe le somme diano lo stesso risultato.
PPPS. Un commento ci ha chiesto se dovremmo chiederci se i numeri in virgola mobile sono uguali o no. Assolutamente se sai cosa stai facendo. Ad esempio, se si ordina un array o si implementa un set, ci si mette in guai terribili se si desidera utilizzare una nozione di "approssimativamente uguale". In un'interfaccia utente grafica, potrebbe essere necessario ricalcolare le dimensioni degli oggetti se la dimensione di un oggetto è cambiata: si confronta oldSize == newSize per evitare tale ricalcolo, sapendo che in pratica non si hanno quasi dimensioni quasi identiche e il programma è corretto anche se c'è un ricalcolo inutile.