Delen via


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_contractoff, 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_contracton. 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

Zie ook

Pragma-instructies en de __pragma en _Pragma trefwoorden