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_access
pragma 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 mediantefloat_control
pragma 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 establecefenv_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(¤tControl, _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(¤tControl, _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