fenv_access pragma

Wyłącza () lub włącza optymalizacje (onoff), które mogą zmieniać testy flag środowiska zmiennoprzecinkowego i zmiany trybu.

Składnia

#pragma fenv_access ( { on | off } )

Uwagi

Domyślnie fenv_access jest to off. Kompilator zakłada, że kod nie uzyskuje dostępu do środowiska zmiennoprzecinkowego ani nie manipuluje nim. Jeśli dostęp do środowiska nie jest wymagany, kompilator może zrobić więcej, aby zoptymalizować kod zmiennoprzecinkowy.

Włącz fenv_access , jeśli kod testuje flagi stanu zmiennoprzecinkowe, wyjątki lub ustawia flagi trybu sterowania. Kompilator wyłącza optymalizacje zmiennoprzecinkowe, dzięki czemu kod może spójnie uzyskiwać dostęp do środowiska zmiennoprzecinkowego.

/fp:strict Opcja wiersza polecenia automatycznie włącza fenv_accesswartość . Aby uzyskać więcej informacji na temat tego i innych zachowań zmiennoprzecinkowych, zobacz /fp (Określ zachowanie zmiennoprzecinkowe).

Istnieją ograniczenia dotyczące sposobów używania w połączeniu fenv_accesspragma z innymi ustawieniami zmiennoprzecinkowych:

  • Nie można włączyć fenv_access , chyba że włączono dokładną semantyka. Dokładna semantyka może być włączona przez float_controlpragmaelement lub przy użyciu opcji kompilatora /fp:precise lub /fp:strict . Kompilator domyślnie ma /fp:precise wartość domyślną, jeśli nie określono żadnej innej opcji wiersza polecenia zmiennoprzecinkowego.

  • Nie można użyć float_control polecenia , aby wyłączyć dokładną semantyka po fenv_access(on) ustawieniu.

Dyrektywa fenv_access(on) wyłącza generowanie skurczów zmiennoprzecinkowych, instrukcje dotyczące maszyn, które łączą operacje zmiennoprzecinkowe. fenv_access(off) przywraca poprzednie zachowanie dla skurczów. To zachowanie jest nowe w programie Visual Studio 2022. Poprzednie wersje kompilatora mogą domyślnie generować skurcze w obszarze fenv_access(on). Aby uzyskać więcej informacji o skurczach zmiennoprzecinkowych, zobacz /fp:contract.

Rodzaje optymalizacji, które podlegają fenv_access :

  • Globalna wspólna eliminacja podrażenia

  • Ruch kodu

  • Stałe składanie

Inne dyrektywy zmiennoprzecinkowe pragma obejmują:

Przykłady

W tym przykładzie ustawiono ustawienie fenv_accesson rejestru sterowania zmiennoprzecinkowego na 24-bitową precyzję:

// 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

Jeśli oznaczysz komentarz #pragma fenv_access (on) z poprzedniego przykładu, dane wyjściowe będą inne. Jest to spowodowane tym, że kompilator wykonuje ocenę czasu kompilacji, która nie korzysta z trybu sterowania.

// 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

Zobacz też

Dyrektywy Pragma i __pragma słowa kluczowe i _Pragma