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


fp_contract pragma

Определяет, происходит ли сокращение с плавающей запятой. Сокращение с плавающей запятой — это инструкция, например Fused-Multiply-Add (FMA), которая объединяет две отдельные операции с плавающей запятой в одну инструкцию. Использование этих инструкций может повлиять на точность с плавающей запятой, так как вместо округления после каждой операции процессор может округлиться только один раз после обеих операций.

Синтаксис

#pragma fp_contract ({ } on | off)

Замечания

Если вы используете параметры компилятора по умолчанию, fp_contract это offуказывает компилятору сохранить отдельные инструкции с плавающей запятой. Установите для fp_contract on использования инструкций по сокращению с плавающей запятой, где это возможно. Это поведение нового в Visual Studio 2022 версии 17.0. В предыдущих версиях компилятора fp_contract по умолчанию используется onзначение .

При использовании параметров компилятора по умолчанию используется fp_contract on. Этот параметр указывает компилятору использовать инструкции по сокращению с плавающей запятой, где это возможно. Установите для fp_contract off сохранения отдельных инструкций с плавающей запятой. По умолчанию в Visual Studio 2022 версии 17.0 и более поздних fp_contract версий off.

Дополнительные сведения о поведении с плавающей запятой см. в разделе /fp (Указание поведения с плавающей запятой).

Другие директивы с плавающей запятой pragma включают:

Пример

Параметр /fp:fast компилятора включает контракты по умолчанию, но #pragma fp_contract (off) директива в этом примере отключает их. Код, созданный из этого примера, не будет использовать инструкцию сплавленного умножения, даже если она доступна на целевом процессоре. Если вы закомментируете #pragma fp_contract (off), созданный код может использовать инструкцию сплавленной умноженной надстройки, если она доступна.

// pragma_directive_fp_contract.cpp
// On x86 and x64 compile with: /O2 /fp:fast /arch:AVX2

#include <stdio.h>

// remove the following line to enable FP contractions
#pragma fp_contract (off)

int main() {
   double z, b, t;

   for (int i = 0; i < 10; i++) {
      b = i * 5.5;
      t = i * 56.025;

      z = t * i + b;
      printf("out = %.15e\n", z);
   }
}
out = 0.000000000000000e+00
out = 6.152500000000000e+01
out = 2.351000000000000e+02
out = 5.207249999999999e+02
out = 9.184000000000000e+02
out = 1.428125000000000e+03
out = 2.049900000000000e+03
out = 2.783725000000000e+03
out = 3.629600000000000e+03
out = 4.587525000000000e+03

См. также

Pragma директивы и ключевые __pragma _Pragma слова