У типових реалізаціях з плаваючою точкою результат однієї операції виробляється так, ніби операція виконувалася з нескінченною точністю, а потім округляється до найближчого числа з плаваючою комою.
Порівняйте і b + a : Результат кожної операції, виконаної з нескінченною точністю, однаковий, тому ці однакові результати безмежної точності округлюються однаково. Іншими словами, додавання з плаваючою комою є комутативним.a+bb+a
Візьміть : b - число з плаваючою комою. З двійковими числами з плаваючою точкою 2 b також є числом з плаваючою комою (показник більший на одиницю), тому b + b додається без жодної помилки округлення. Тоді а додається до точного значення b + b . Результат - точне значення 2 b + a , округлене до найближчого числа з плаваючою комою.b+b+ab2bb+bab+b2b+a
Візьміть : додається a + b , і буде помилка округлення r , тому отримаємо результат a + b + r . Додайте b , і результат - точне значення 2 b + a + r , округлене до найближчого числа з плаваючою комою.a+b+ba+bra+b+rb2b+a+r
Так в одному випадку , округлий. В іншому випадку 2 b + a + r , округлий.2b+a2b+a+r
PS. Чи буде для двох конкретних чисел і b обидва обчислення давати однаковий результат чи ні, залежить від чисел та помилки округлення в обчисленні a + b , і зазвичай важко передбачити. Використання одинарної або подвійної точності принципово не має значення для проблеми, але оскільки похибки округлення відрізняються, будуть значення a і b, де в одній точності результати рівні, а в подвійній точності вони не є, або навпаки. Точність буде набагато вищою, але проблема в тому, що два вирази математично однакові, але не однакові в арифметиці з плаваючою комою залишаються однаковими.aba+b
PPS. У деяких мовах арифметика з плаваючою комою може виконуватися з більшою точністю або більшим діапазоном чисел, ніж задані фактичними твердженнями. У такому випадку було б набагато більше шансів (але все ж не гарантується), що обидві суми дають однаковий результат.
PPPS. Коментар запитав, чи варто запитувати, чи рівні номери з плаваючою комою рівні чи взагалі немає. Абсолютно, якщо ти знаєш, що робиш. Наприклад, якщо ви сортуєте масив або реалізуєте набір, ви потрапите в жахливі проблеми, якщо хочете використовувати якесь поняття "приблизно рівне". У графічному інтерфейсі користувача вам може знадобитися перерахувати розміри об'єктів, якщо розмір об'єкта змінився - ви порівнюєте oldSize == newSize, щоб уникнути перерахунку, знаючи, що на практиці ви майже ніколи не маєте майже однакових розмірів, і ваша програма правильна навіть якщо є непотрібний перерахунок.