Compartir por


fenv_access pragma

Deshabilita (on) o habilita (off) las optimizaciones que podrían cambiar las pruebas de marcadores de entorno de punto flotante y los cambios de modo.

Sintaxis

#pragma fenv_access ( { on | off } )

Comentarios

De manera predeterminada, fenv_access es off. El compilador supone que el código no tiene acceso ni manipula el entorno de punto flotante. Si no se requiere acceso al entorno, el compilador puede hacer más para optimizar el código de punto flotante.

Habilite fenv_access si el código prueba marcas de estado de punto flotante, excepciones, o establece marcas de modo de control. El compilador deshabilita las optimizaciones de punto flotante, por lo que el código puede acceder al entorno de punto flotante de forma coherente.

La opción de línea de comandos /fp:strict habilita fenv_access automáticamente . Para más información sobre el comportamiento de punto flotante, vea /fp (Especificar comportamiento de punto flotante).

Hay restricciones en las formas en que puede usar fenv_accesspragma en combinación con otras configuraciones de punto flotante:

  • No se puede habilitar fenv_access a menos que se habilite la semántica precisa. La semántica precisa se puede habilitar mediante float_controlpragma o mediante las opciones del compilador /fp:precise o /fp:strict. El compilador tiene /fp:precise como valor predeterminado si no se especifica ninguna otra opción de línea de comandos de punto flotante.

  • No se puede usar float_control para deshabilitar la semántica precisa cuando se establece fenv_access(on).

La directiva fenv_access(on) deshabilita la generación de contracciones de punto flotante, instrucciones de máquina que combinan operaciones de punto flotante. fenv_access(off) restaura el comportamiento anterior para las contracciones. Este comportamiento es nuevo en Visual Studio 2022. Las versiones anteriores del compilador podían generar contracciones de manera predeterminada con fenv_access(on). Para obtener más información sobre las contracciones de punto flotante, vea /fp:contract.

Las clases de optimización que están sujetas a fenv_access son:

  • Eliminación común global de la subexpresión

  • Movimiento de código

  • Plegamiento constante

Otras directivas pragma de punto flotante incluyen:

Ejemplos

En este ejemplo se establece fenv_access en on para establecer el registro de control de punto flotante para la precisión de 24 bits:

// pragma_directive_fenv_access_x86.cpp
// compile with: /O2 /arch:IA32
// processor: x86
#include <stdio.h>
#include <float.h>
#include <errno.h>
#pragma fenv_access (on)

int main() {
   double z, b = 0.1, t = 0.1;
   unsigned int currentControl;
   errno_t err;

   err = _controlfp_s(&currentControl, _PC_24, _MCW_PC);
   if (err != 0) {
      printf_s("The function _controlfp_s failed!\n");
      return -1;
   }
   z = b * t;
   printf_s ("out=%.15e\n",z);
}
out=9.999999776482582e-03

Si se comenta #pragma fenv_access (on) desde el ejemplo anterior, la salida es diferente. Esto se debe a que el compilador realiza la evaluación en tiempo de compilación, que no usa el modo de control.

// pragma_directive_fenv_access_2.cpp
// compile with: /O2 /arch:IA32
#include <stdio.h>
#include <float.h>

int main() {
   double z, b = 0.1, t = 0.1;
   unsigned int currentControl;
   errno_t err;

   err = _controlfp_s(&currentControl, _PC_24, _MCW_PC);
   if (err != 0) {
      printf_s("The function _controlfp_s failed!\n");
      return -1;
   }
   z = b * t;
   printf_s ("out=%.15e\n",z);
}
out=1.000000000000000e-02

Consulte también

Pragmadirectivas y las __pragma palabras clave y _Pragma