Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
Especifica el comportamiento de punto flotante de una función.
Sintaxis
#pragma float_control
#pragma float_control( precise,{on|off} [, push])
#pragma float_control( except,{on|off} [, push])
#pragma float_control({push|pop})
Opciones
precise, , on | off, push
Especifica si se va a habilitar (on) o deshabilitar (off) la semántica precisa de punto flotante. Para obtener información sobre las diferencias con la opción /fp:precise del compilador, consulte la sección Comentarios. El token opcional push inserta la configuración actual de float_control en la pila interna del compilador.
except, , on | off, push
Especifica si se va a habilitar (on) o deshabilitar (off) la semántica de excepciones de punto flotante. El token opcional push inserta la configuración actual de float_control en la pila interna del compilador.
except solo se puede establecer en on si precise también se establece en on.
push
Inserta el valor de float_control actual en la pila interna del compilador.
pop
Elimina el valor de float_control de la parte superior de la pila interna del compilador y lo convierte en el nuevo valor de float_control.
Comentarios
float_control
pragma no tiene el mismo comportamiento que la opción /fp del compilador.
float_control
pragma solo gobierna parte del comportamiento de punto flotante. Debe combinarse con directivas fp_contract y fenv_accesspragma para volver a crear las opciones /fp del compilador. En la tabla siguiente se muestra el valor equivalente pragma para cada opción del compilador:
| Opción | float_control(precise, *) |
float_control(except, *) |
fp_contract(*) |
fenv_access(*) |
|---|---|---|---|---|
/fp:strict |
on |
on |
off |
on |
/fp:precise |
on |
off |
off* |
off |
/fp:fast |
off |
off |
on |
off |
* En versiones de Visual Studio anteriores a Visual Studio 2022, el comportamiento predeterminado de /fp:precise es fp_contract(on).
| Opción | float_control(precise, *) |
float_control(except, *) |
fp_contract(*) |
fenv_access(*) |
|---|---|---|---|---|
/fp:strict |
on |
on |
off |
on |
/fp:precise |
on |
off |
off |
off |
/fp:fast |
off |
off |
on |
off |
En otras palabras, es posible que tenga que usar varias directivas pragma combinadas para emular las opciones de línea de comandos /fp:fast, /fp:precise y /fp:strict.
Hay restricciones en las formas en que puede usar las directivas float_control y fenv_access de punto flotante pragma combinadas:
Solo puede usar
float_controlpara establecerexceptenonsi la semántica precisa está habilitada. La semántica precisa se puede habilitar mediantefloat_controlpragma o mediante las opciones del compilador/fp:preciseo/fp:strict.No se puede usar
float_controlpara desactivarprecisesi la semántica de excepciones está habilitada, ya sea mediantefloat_controlpragma o una opción/fp:exceptdel compilador.No se puede habilitar
fenv_accessa menos que la semántica precisa esté habilitada, ya sea mediantefloat_controlpragma o una opción del compilador.No se puede usar
float_controlpara desactivarprecisecuandofenv_accessestá habilitado.
Estas restricciones significan que el orden de algunas directivas pragma de punto flotante es significativo. Para pasar de un modelo rápido a un modelo estricto con directivas pragma, utilice el código siguiente:
#pragma float_control(precise, on) // enable precise semantics
#pragma fenv_access(on) // enable environment sensitivity
#pragma float_control(except, on) // enable exception semantics
#pragma float_control(precise, on) // enable precise semantics
#pragma fenv_access(on) // enable environment sensitivity
#pragma float_control(except, on) // enable exception semantics
#pragma fp_contract(off) // disable contractions
Para pasar de un modelo estricto a un modelo rápido mediante float_controlpragma, utilice el código siguiente:
#pragma float_control(except, off) // disable exception semantics
#pragma fenv_access(off) // disable environment sensitivity
#pragma float_control(precise, off) // disable precise semantics
#pragma fp_contract(on) // enable contractions
Si no se especifica ninguna opción, float_control no tiene ningún efecto.
La directiva float_control deshabilita las contracciones cuando activa precise o except. El uso de float_control para desactivar precise o except restaura la configuración anterior para contracciones. Puede usar la directiva fp_contractpragma para cambiar el comportamiento del compilador en las contracciones.
float_control(push) y float_control(pop) insertan y sacan la configuración de las contracciones como parte del valor float_control en la pila interna del compilador. Este comportamiento es nuevo en Visual Studio 2022. La directiva float_control de las versiones anteriores del compilador no afectaba a la configuración de las contracciones.
Ejemplo
En el ejemplo siguiente se muestra cómo detectar una excepción de desbordamiento de punto flotante mediante pragmafloat_control.
// pragma_directive_float_control.cpp
// compile with: /EHa
#include <stdio.h>
#include <float.h>
double func( ) {
return 1.1e75;
}
#pragma float_control (except, on)
int main( ) {
float u[1];
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, ~_EM_OVERFLOW, _MCW_EM);
if (err != 0)
printf_s("_controlfp_s failed!\n");
try {
u[0] = func();
printf_s ("Fail");
return(1);
}
catch (...) {
printf_s ("Pass");
return(0);
}
}
Pass
Consulte también
directivas Pragma y las palabras clave __pragma y _Pragma
fenv_access pragma
fp_contract pragma