Ответ 1
Разделение на 10 и умножение на 0,1000000000000000055511151231257827021181583404541015625 - это не одно и то же.
-freciprocal-math
в GCC изменяется следующий код
double a = b / c;
to
double tmp = 1/c;
double a = b * tmp;
В руководстве GCC говорится, что такая оптимизация небезопасна и не привязана к стандартам IEEE. Но я не могу придумать пример. Не могли бы вы привести пример?
Разделение на 10 и умножение на 0,1000000000000000055511151231257827021181583404541015625 - это не одно и то же.
Возможно, я имею в виду другой флаг компилятора, но...
Некоторые процессоры имеют инструкции для расчета приблизительной обратной величины. RCPSS om x86 (инструкция SIMD) приходит на ум; он имеет относительную ошибку 1,5 * 2 ^ -12. Использование этого флага может позволить компилятору выбрать приблизительную ответную инструкцию, которая может быть небезопасной в зависимости от вашего приложения.
Надеюсь, что это поможет.