Ответ 1
Нет, компилятору не разрешено делать это для общего случая: две операции могут приводить к результатам, которые не являются бит-идентичными из-за ошибки представления обратного.
В вашем примере 0.1
не имеет точного представления как float
. Это приводит к тому, что результаты умножения на 0.1
и деление на 10
различаются:
float f = 21736517;
float a = f / 10.f;
float b = f * 0.1f;
cout << (a == b) << endl; // Prints zero
Примечание: Как njuffa правильно отмечает в комментарии ниже, бывают ситуации, когда компилятор может сделать некоторые оптимизации для широкого набора чисел, как описано в в этой статье. Например, умножение или деление на мощность двух эквивалентно добавлению к экспоненциальной части представления IEEE-754 float
.