Dela via


fp_contract pragma

Avgör om flyttalskontraktion äger rum. En flyttalskontraktion är en instruktion som Fused-Multiply-Add (FMA) som kombinerar två separata flyttalsoperationer i en enda instruktion. Användningen av dessa instruktioner kan påverka flyttalsprecisionen, eftersom processorn i stället för avrundning efter varje åtgärd endast kan avrunda en gång efter båda åtgärderna.

Syntax

#pragma fp_contract ( { on | off } )

Anmärkningar

När du använder standardalternativen för kompilatorn är fp_contractoff, vilket instruerar kompilatorn att bevara enskilda flyttalsanvisningar. Ange fp_contract till on att använda flyttalskontraktionsinstruktioner där det är möjligt. Det här beteendet är nytt i Visual Studio 2022 version 17.0. I tidigare kompilatorversioner fp_contract som standard on.

När du använder standardalternativen för kompilatorn är fp_contracton. Den här inställningen instruerar kompilatorn att använda flyttalskontraktionsinstruktioner där det är möjligt. Ange fp_contract till off för att bevara enskilda flyttalsanvisningar. I Visual Studio 2022 version 17.0 och senare fp_contract standardvärdet off.

Mer information om flyttalsbeteende finns i /fp (Ange flyttalsbeteende).

Andra flyttalsdirektiv pragma omfattar:

Exempel

Alternativet /fp:fast kompilator möjliggör som standard sammandragningar, men #pragma fp_contract (off)-direktivet i det här exemplet inaktiverar dem. Koden som genereras från det här exemplet använder inte en sammansvetsad-multiplicera-lägg-instruktion även när den är tillgänglig på målprocessorn. Om du kommenterar ut #pragma fp_contract (off)kan den genererade koden använda en instruktion för sammansvetsad multiplikationstillägg om den är tillgänglig.

// 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

Se även

Pragma-direktiv och nyckelorden __pragma och _Pragma