/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

  1. Откройте диалоговое окно Страницы свойств проекта.Дополнительные сведения см. в разделе Открытие свойств страниц проекта.

  2. Разверните узел Свойства конфигурации.

  3. Разверните узел C/C++.

  4. Выберете страницу свойств Создание кода.

  5. Измените свойство Модель с плавающей запятой.

Установка данного параметра компилятора программным способом

  • Дополнительные сведения см. в разделе floatingPointModel.

См. также

Ссылки

Параметры компилятора

Настройка параметров компилятора