Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Určuje, zda probíhá kontrakt s plovoucí desetinou čárkou. Kontrakt s plovoucí desetinnou čárkou je instrukce, jako je Fused-Multipli-Add (FMA), která kombinuje dvě samostatné operace s plovoucí desetinnou čárkou do jedné instrukce. Použití těchto pokynů může ovlivnit přesnost s plovoucí desetinnou čárkou, protože namísto zaokrouhlování po každé operaci může procesor zaokrouhlit pouze jednou za oběma operacemi.
Syntaxe
#pragma fp_contract ({on|off})
Poznámky
Pokud použijete výchozí možnosti kompilátoru, je fp_contract, off což kompilátoru říká, aby zachoval jednotlivé instrukce s plovoucí desetinou čárkou. Pokud je to možné, nastavte fp_contract na on použití pokynů ke soustružení s plovoucí desetinou čárkou. Toto chování je nové v sadě Visual Studio 2022 verze 17.0. V předchozích verzích kompilátoru je fp_contract výchozí hodnota on.
Pokud používáte výchozí možnosti kompilátoru, fp_contract je on. Toto nastavení říká kompilátoru, aby tam, kde je to možné, použil pokyny ke kontraktování s plovoucí desetinou čárkou. Nastaví fp_contract se tak, aby se off zachovaly jednotlivé instrukce s plovoucí desetinou čárkou. V sadě Visual Studio 2022 verze 17.0 a novější je fp_contract výchozí hodnota off.
Další informace o chovánísch /fp
Mezi další direktivy s plovoucí desetinou čárkou pragma patří:
Příklad
Možnost /fp:fast kompilátoru ve výchozím nastavení povoluje kontrakty, ale direktiva #pragma fp_contract (off) v tomto příkladu je vypne. Kód vygenerovaný z této ukázky nebude používat instrukci násobené násobení, i když je k dispozici v cílovém procesoru. Pokud zakomentujete #pragma fp_contract (off), vygenerovaný kód může použít instrukci násobené násobení, pokud je k dispozici.
// 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