fp_contract pragma

Determina si se realiza la contracción de punto flotante. Una contracción de punto flotante es una instrucción como Fused-Multiply-Add (FMA) que combina dos operaciones de punto flotante independientes en una sola instrucción. El uso de estas instrucciones puede afectar a la precisión de punto flotante, ya que, en lugar de redondear después de cada operación, el procesador solo puede redondear una vez después de ambas operaciones.

Sintaxis

#pragma fp_contract ( { on | off } )

Comentarios

Cuando se usan las opciones predeterminadas del compilador, fp_contract es off, lo que indica al compilador que conserve instrucciones de punto flotante individuales. Establezca fp_contract en on para usar instrucciones de contracción de punto flotante siempre que sea posible. Este comportamiento es nuevo en Visual Studio 2022, versión 17.0. En versiones anteriores del compilador, fp_contract se establece de forma predeterminada en on.

Cuando se usan las opciones predeterminadas del compilador, fp_contract es on. Esta configuración indica al compilador que use instrucciones de contracción de punto flotante siempre que sea posible. Establezca fp_contract en off para conservar instrucciones de punto flotante individuales. En Visual Studio 2022, versión 17.0 y posteriores, fp_contract toma de forma predeterminada el valor off.

Para más información sobre el comportamiento de punto flotante, vea /fp (Especificar comportamiento de punto flotante).

Otras directivas pragma de punto flotante incluyen:

Ejemplo

La opción del compilador /fp:fast habilita las contracciones de forma predeterminada, pero la directiva #pragma fp_contract (off) de este ejemplo las desactiva. El código generado a partir de este ejemplo no usará una instrucción fund-multiply-add incluso cuando esté disponible en el procesador de destino. Si comenta #pragma fp_contract (off), el código generado puede usar una instrucción fused-multiply-add si 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

Consulte también

Directivas pragma y las palabras clave __pragma y _Pragma