/fp (Определение поведения с плавающей запятой)
Определяет поведение с плавающей запятой в исходном файле кода.
/fp:[precise | except[-] | fast | strict ]
Флаги
precise
Используется по умолчанию.Улучшает целостность тестов с плавающей запятой на равенство и неравенство путем отключения оптимизаций, которые могут повлиять на точность вычислений при наличии плавающей запятой, что требуется для точного соблюдения стандартов ANSI. По умолчанию компилятор использует 80-разрядный сопроцессор, чтобы хранить результаты вычислений с плавающей запятой. Это увеличивает быстродействие программы и уменьшает ее объем. Так как вычисление задействует типы данных с плавающей запятой, которые занимают в памяти меньше 80 бит, тем не менее поддержание дополнительных бит точности вычислений (80 бит за минусом числа меньшего объема бит в типах с плавающей запятой), продолжительные вычисления могут привести к недостоверным результатам.
Используя /fp:precise на х86 процессорах, компилятор будет выполнять округления на переменных плавающего типа, чтобы добиться соответствующей точности для заданий и определений, когда параметры передаются в функцию. Округление гарантирует, что данные не будут иметь большего значения, чем позволяют возможности этого типа. Программа, скомпилированная с параметром /fp:precise, может работать более медленно и иметь больший размер по сравнению с программой, скомпилированной без параметра /fp:precise. /fp:precise отключает внутренние свойства; вместо этого используются стандартные процедуры библиотеки времени выполнения. Дополнительные сведения см. в разделе /Oi (создание встроенных функций).
Следующее поведение с плавающей запятой включается с помощью /fp:precise:
Ограничения или замены многочисленных операций одной составной операцией с только одним округлением в конце включается с помощью /fp:precise.
Оптимизации выражений, которые являются недопустимыми для специальных значений (NaN, +infinity, -infinity, +0, -0), не разрешается. Оптимизации x-x => 0, x*0 => 0, x-0 => x, x+0 => x и 0-x => -x являются недопустимыми по различным причинам (см. стандарты IEEE 754 и C99).
Компилятор тщательно обрабатывает сравнения с использованием NaN. Например, x != x сравнивается с true, если x является NaN и заказанные сравнения, включающие NaN, вызывают исключение.
За оценкой выражения последует C99 FLT_EVAL_METHOD=2 с одним исключением. При программировании для x86 процессоров следует учитывать длинную двойную точность, поскольку FPU задана 53-разрядная точность.
Умножение ровно на 1.0 преобразовано в использование другого множителя. x*y*1.0 преобразуется в x*y. Аналогично, x*1.0*y преобразовано в x*y.
Деление ровно на 1.0 преобразовано в использование делимого. x*y/1.0 преобразуется в x*y. Аналогично, x/1.0*y преобразовано в x*y.
Использование /fp:precise с включенным fenv_access отключает некоторые оптимизации, такие как оценка выражений с плавающей запятой во время компиляции. Например, если потребуется изменение режима округления с помощью _control87, _controlfp, __control87_2, а компилятор выполняет вычисления с плавающей запятой, заданный режим округлений не вступит в силу пока fenv_access остается включенной.
/fp:precise заменяет /Op параметр компилятора.
fast
В большинстве случаев создает более быстрый код. Параметр /fp:fast можно использовать с параметром /fp:strict или /fp:precise; будет использоваться последний указанный в командной строке параметр. Параметры /fp:fast и /fp:except вызовут ошибку компилятора.Выбор /Za, /Ze (отключить расширения языка) (ANSI-совместимость) и /fp:fast может привести к непредсказуемому поведению. Например, операции с плавающей запятой одиночной точности могут не округляться до целого числа.
except[-]
Надежная модель исключения с плавающей запятой. Исключения вызываются сразу же после их инициализации. По умолчанию этот параметр отключен. Добавление знака минус к параметру полностью отключает его.strict
Самая строгая модель с плавающей запятой. Параметр /fp:strict вызывает выключение fp_contract и включение fenv_access. Параметр /fp:except используется неявно, и его можно отключить, явным образом указав /fp:except-. При использовании с /fp:except-, /fp:strict включается строгая семантика с плавающей запятой, но без отношения к исключительным событиям.
Заметки
Многочисленные параметры /fp могут быть указаны в той же компиляции.
Для управления поведением с плавающей запятой с помощью функции, см. директиву pragma float_control.
Большинство оптимизаций плавающей запятой, которые относятся к параметрам /fp:strict, /fp:except (и соответствующим директивам pragma) и директиве pragma fp_contract, зависят от оборудования. Параметры /fp:strict и /fp:except несовместимы с /clr.
/fp:precise следует соответствовать большинству требований, предъявляемых к приложениям с плавающей запятой. Если необходимо, можно использовать /fp:except и /fp:strict, но может возникнуть некоторое снижение производительности. Если производительность является самым важным условием, можно использовать /fp:fast.
/fp:strict, /fp:fast и /fp:precise являются режимами точности (правильности). Только один экземпляр может использоваться в промежутке времени. Если указаны /fp:strict и /fp:precise, компилятор использует тот же параметр, что был использован в прошлый раз. Нельзя указать одновременно и /fp:strict, и /fp:fast.
Дополнительные сведения см. в разделе https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/floapoint.asp.
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Открытие свойств страниц проекта.
Разверните узел Свойства конфигурации.
Разверните узел C/C++.
Выберете страницу свойств Создание кода.
Измените свойство Модель с плавающей запятой.
Установка данного параметра компилятора программным способом
- См. раздел floatingPointModel.