Partager via


fp_contract pragma

Détermine si la contraction à virgule flottante a lieu. Une contraction à virgule flottante est une instruction telle que Fused-Multiply-Add (FMA) qui combine deux opérations à virgule flottante distinctes en une seule instruction. L’utilisation de ces instructions peut affecter la précision à virgule flottante, car au lieu d’arrondir après chaque opération, le processeur ne peut arrondir qu’une seule fois après les deux opérations.

Syntaxe

#pragma fp_contract ( { on | off } )

Notes

Lorsque vous utilisez les options de compilateur par défaut, fp_contract c’est-à-dire off, qui indique au compilateur de conserver des instructions à virgule flottante individuelles. Définissez cette option fp_contract pour on utiliser des instructions de contraction à virgule flottante si possible. Ce comportement est nouveau dans Visual Studio 2022 version 17.0. Dans les versions précédentes du compilateur, fp_contract la valeur par défaut est on.

Lorsque vous utilisez les options du compilateur par défaut, fp_contract est on. Ce paramètre indique au compilateur d’utiliser des instructions de contraction à virgule flottante si possible. Définissez cette option fp_contract pour off conserver des instructions à virgule flottante individuelles. Dans Visual Studio 2022 version 17.0 et versions ultérieures, fp_contract la offvaleur par défaut est .

Pour plus d’informations sur le comportement à virgule flottante, consultez /fp (Spécifier le comportement à virgule flottante).

Voici d’autres directives à virgule pragma flottante :

Exemple

L’option /fp:fast du compilateur active les contractions par défaut, mais la #pragma fp_contract (off) directive de cet exemple les désactive. Le code généré à partir de cet exemple n’utilise pas d’instruction d’ajout de multiplication fusionnée, même lorsqu’il est disponible sur le processeur cible. Si vous commentez #pragma fp_contract (off), le code généré peut utiliser une instruction fusionnée-multiplie-add si elle est disponible.

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

Voir aussi

Pragma directives et mots __pragma _Pragma clés