Sdílet prostřednictvím


fenv_access

Zakáže (ON) nebo povolí (OFF) optimalizace, které by mohly změnit testy příznaků a změny režimů.

#pragma fenv_access [ON | OFF]

Poznámky

Ve výchozím nastavení je direktiva fenv_access nastavena na hodnotu OFF.

Další informace o chování čísel s plovoucí desetinnou čárkou naleznete v tématu /fp (zadání chování hodnot s plovoucí desetinnou čárkou).

Typy optimalizací, které jsou předmětem direktivy fenv_access, jsou následující:

  • Globální eliminace společných podvýrazů

  • Pohyb kódu

  • Skládání konstant

Mezi další direktivy pragma pro čísla s plovoucí desetinnou čárkou patří:

Příklad

// 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(&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);
}
  

Následující příklad se vztahuje na kompilátor vytvářející výstupní soubory pro procesory Itanium.Možnost /fp:precise udržuje průběžné výsledky v rozšířené přesnosti, v níž lze vypočítat hodnoty větší než FLT_MAX (3.402823466e+38F), důsledkem čehož bude výsledkem sumy hodnota 1.0 tak, jako by byla při ručním výpočtu.Možnost /fp:strict udržuje průběžné výsledky v jejich zdrojové přesnosti (float), proto výsledkem prvního součtu bude nekonečno, které je pak udržováno v celém výrazu.

// 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);
}
  

Při zakomentování řádku #pragma fenv_access (on) v předchozím výrazu si povšimněte, že se výstup liší, protože kompilátor provádí vyhodnocení v době kompilace, které nepoužívá režim řízení.

// 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(&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);
}
  

Viz také

Referenční dokumentace

Direktivy Pragma a klíčové slovo __Pragma