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