Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Deshabilita (ENCENDIDO) o habilita las optimizaciones que podrían cambiar pruebas de indicador y cambios para.
#pragma fenv_access [ON | OFF]
Comentarios
De forma predeterminada, fenv_access es off.).
Para obtener más información sobre comportamiento flotante, vea /fp (Especificar comportamiento de punto flotante).
Las clases de optimización que están sujetas a fenv_access son:
Eliminación común global de la subexpresión
Mover el código
plegamiento constante
La otra incluyen flotante de pragmas:
Ejemplo
// pragma_directive_fenv_access_x86.cpp
// compile with: /O2
// 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);
}
El ejemplo siguiente es para el compilador genera los archivos de salida para los procesadores Itanium./fp:precise conserva los resultados intermedios en precisión ampliada cuyos valores mayores que FLT_MAX (3.402823466e+38F) se pueden calcular como resultado de esa suma tendrán resultado 1,0, como debe si se calcula manualmente./fp:strict conserva resultados intermedios en su precisión de origen (float) por lo que la primera agregar genera el infinito, que se conserva en la expresión.
// pragma_directive_fenv_access_IPF.cpp
// compile with: /O2 /fp:precise
// processor: IPF
// compiling with /fp:precise prints 1.0F
// compile with /fp:strict to print infinity
#include <stdio.h>
float arr[5] = {3.402823465e+38F,
3.402823462e+38F,
3.402823464e+38F,
3.402823463e+38F,
1.0F};
int main() {
float sum = 0;
sum = arr[0] + arr[1] - arr[2] - arr[3] + arr[4];
printf_s("%f\n", sum);
}
Al marcar como comentario #pragma fenv_access (on) del ejemplo anterior, observe que el resultado es diferente porque el compilador realiza la evaluación en tiempo de compilación, que no utiliza el modo de control.
// pragma_directive_fenv_access_2.cpp
// compile with: /O2
#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);
}