Udostępnij za pośrednictwem


fp_contract pragma

Określa, czy ma miejsce skurczenie zmiennoprzecinkowe. Skurcz zmiennoprzecinkowy to instrukcja, taka jak Fused-Multiply-Add (FMA), która łączy dwie oddzielne operacje zmiennoprzecinkowe w jedną instrukcję. Użycie tych instrukcji może mieć wpływ na precyzję zmiennoprzecinkową, ponieważ zamiast zaokrąglania po każdej operacji procesor może zaokrąglić tylko raz po obu operacjach.

Składnia

#pragma fp_contract ( { on | off } )

Uwagi

Jeśli używasz domyślnych opcji kompilatora, fp_contract to , offktóry nakazuje kompilatorowi zachowanie poszczególnych instrukcji zmiennoprzecinkowych. Ustaw fp_contract wartość na , aby on używać instrukcji skurczu zmiennoprzecinkowego, jeśli jest to możliwe. To zachowanie jest nowe w programie Visual Studio 2022 w wersji 17.0. W poprzednich wersjach fp_contract kompilatora wartość domyślna to on.

Jeśli używasz domyślnych opcji kompilatora, fp_contract to on. To ustawienie nakazuje kompilatorowi używanie instrukcji skurczu zmiennoprzecinkowych tam, gdzie to możliwe. Ustaw fp_contract wartość , aby off zachować poszczególne instrukcje zmiennoprzecinkowe. W programie Visual Studio 2022 w wersji 17.0 lub nowszej fp_contract wartość domyślna to off.

Aby uzyskać więcej informacji na temat zachowania zmiennoprzecinkowego, zobacz /fp (Określanie zachowania zmiennoprzecinkowego).

Inne dyrektywy zmiennoprzecinkowe pragma obejmują:

Przykład

Opcja kompilatora /fp:fast domyślnie włącza skurcze, ale #pragma fp_contract (off) dyrektywa w tym przykładzie wyłącza je. Kod wygenerowany na podstawie tego przykładu nie będzie używać instrukcji fused-multiply-add nawet wtedy, gdy jest dostępny na procesorze docelowym. Jeśli oznaczysz komentarz #pragma fp_contract (off), wygenerowany kod może używać instrukcji fused-multiply-add, jeśli jest dostępna.

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

Zobacz też

Pragmadyrektywy i __pragma słowa kluczowe i _Pragma