Поделиться через


/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. Измените свойство Модель с плавающей запятой.

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

См. также

Ссылки

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

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