fp_contract
pragma
Bepaalt of drijvendekommacontractie plaatsvindt. Een drijvendekommagetrekking is een instructie zoals Fused-Multiply-Add (FMA) die twee afzonderlijke drijvendekommabewerkingen combineert in één instructie. Het gebruik van deze instructies kan van invloed zijn op de precisie van drijvende komma, omdat in plaats van na elke bewerking te afronden, de processor slechts één keer na beide bewerkingen kan afronden.
Syntaxis
#pragma fp_contract (
{on
|off
})
Opmerkingen
Wanneer u de standaard-compileropties gebruikt, wordt fp_contract
off
, waarmee de compiler instructies voor afzonderlijke drijvendekomma's behoudt. Stel fp_contract
in op on
om waar mogelijk drijvendekommacontractieinstructies te gebruiken. Dit gedrag is nieuw in Visual Studio 2022 versie 17.0. In eerdere compilerversies fp_contract
standaard ingesteld op on
.
Wanneer u de standaard-compileropties gebruikt, wordt fp_contract
on
. Deze instelling geeft de compiler de mogelijkheid om waar mogelijk instructies voor drijvendekommacontractie te gebruiken. Stel fp_contract
in op off
om afzonderlijke instructies voor drijvende komma te behouden. In Visual Studio 2022 versie 17.0 en hoger wordt fp_contract
standaard ingesteld op off
.
Zie /fp
(Drijvendekommagedrag opgeven)voor meer informatie over het gedrag van drijvende komma.
Andere richtlijnen voor drijvendekomma-pragma zijn:
Voorbeeld
De /fp:fast
compileroptie schakelt standaard contracties in, maar de #pragma fp_contract (off)
instructie in dit voorbeeld schakelt deze uit. De code die uit dit voorbeeld wordt gegenereerd, gebruikt geen instructie voor fused-multiply-add, zelfs niet wanneer deze beschikbaar is op de doelprocessor. Als u #pragma fp_contract (off)
commentaar geeft, kan de gegenereerde code een instructie voor fused-multiply-add gebruiken als deze beschikbaar is.
// 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