Condividi tramite


fp_contract pragma

Determina se viene eseguita la contrazione a virgola mobile. Una contrazione a virgola mobile è un'istruzione come Fused-Multiply-Add (FMA) che combina due operazioni a virgola mobile separate in una singola istruzione. L'uso di queste istruzioni può influire sulla precisione a virgola mobile, perché invece di arrotondare dopo ogni operazione, il processore può arrotondare una sola volta dopo entrambe le operazioni.

Sintassi

#pragma fp_contract ( { on | off } )

Osservazioni:

Quando si usano le opzioni del compilatore predefinite, fp_contract è off, che indica al compilatore di mantenere istruzioni a virgola mobile singole. Impostare fp_contract su per on usare le istruzioni di contrazione a virgola mobile, se possibile. Questo comportamento è una novità di Visual Studio 2022 versione 17.0. Nelle versioni precedenti del compilatore, fp_contract il valore predefinito è on.

Quando si usano le opzioni del compilatore predefinite, fp_contract è on. Questa impostazione indica al compilatore di usare le istruzioni di contrazione a virgola mobile laddove possibile. Impostare fp_contract su off per mantenere singole istruzioni a virgola mobile. In Visual Studio 2022 versione 17.0 e successive il fp_contract valore predefinito è off.

Per altre informazioni sul comportamento a virgola mobile, vedere /fp (Specificare il comportamento a virgola mobile).

Altre direttive a pragma virgola mobile includono:

Esempio

L'opzione /fp:fast del compilatore abilita le contrazioni per impostazione predefinita, ma la #pragma fp_contract (off) direttiva in questo esempio le disattiva. Il codice generato da questo esempio non userà un'istruzione fused-multiply-add anche quando è disponibile nel processore di destinazione. Se si imposta #pragma fp_contract (off)come commento , il codice generato può usare un'istruzione di aggiunta a moltiplicazione fuso, se disponibile.

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

Vedi anche

Pragmadirettive e parole __pragma chiave e _Pragma