Подтвердить что ты не робот

Будет ли компилятор оптимизировать деление на умножение

В зависимости от этого вопроса Деление с плавающей запятой против умножения с плавающей запятой. Подразделение медленнее, чем умножение по некоторым причинам.

Будет ли компилятор, как правило, заменять деление на умножение, если это возможно?

Например:

float a;
// During runtime a=5.4f
float b = a/10.f;

Будет ли это:

float a;
// During runtime a=5.4f
float b = a*0.1f;

Если это вопрос, связанный с компилятором, я использую компилятор VS2013 по умолчанию. Однако было бы неплохо, если бы я получил общий ответ (теоретическая обоснованность этой оптимизации)

4b9b3361

Ответ 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.