Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 , off
któ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