Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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