-fp-model
влияет на способ выполнения вычислений с плавающей запятой и может изменить числовой результат (путем лицензирования небезопасных оптимизаций или изменения точности, с которой оцениваются промежуточные результаты).
-fp-speculation
не изменяет числовые результаты, но может влиять на то, какие флаги с плавающей точкой поднимаются операцией (или какие ловушки принимаются, если ловушки с плавающей точкой включены). 99,99% программистов не нуждаются в этих вещах, поэтому вы, вероятно, можете работать по умолчанию и не беспокоиться об этом.
Вот конкретный пример; Предположим, у вас есть следующая функция:
double foo(double x) {
// lots of computation
if (x >= 0) return sqrt(x);
else return x;
}
sqrt
, относительно говоря, медленно. Было бы неплохо поднять вычисление sqrt(x)
примерно так:
double foo(double x) {
const double sqrtx = sqrt(x);
// lots of computation
if (x >= 0) return sqrtx;
else return x;
}
Делая это, мы позволяем вычислению sqrt
идти одновременно с другими вычислениями, уменьшая задержку нашей функции. Тем не менее, есть проблема; если x
отрицательно, то sqrt(x)
поднимает флаг недействительности. В исходной программе этого никогда не могло произойти, потому что sqrt(x)
вычислялось только, если x
было неотрицательным. В модифицированной программе sqrt(x)
вычисляется безоговорочно. Таким образом, если x
отрицательно, измененная программа поднимает флаг недопустимости, тогда как исходная программа этого не делала.
Флаг -fp-speculation
дает вам возможность сообщить компилятору, заботитесь ли вы об этих случаях или нет, и он знает, есть ли у него лицензия на такие преобразования.