Share via


fenv_access pragma

Deaktiviert () oder aktiviert (onoff) Optimierungen, die Gleitkomma-Umgebungskennzeichnungstests und Modusänderungen ändern können.

Syntax

#pragma fenv_access ( { on | off } )

Hinweise

fenv_access ist standardmäßig off. Der Compiler geht davon aus, dass Ihr Code nicht auf die Gleitkommaumgebung zugreift oder bearbeitet. Wenn der Umgebungszugriff nicht erforderlich ist, kann der Compiler mehr tun, um den Gleitkommacode zu optimieren.

Aktivieren Sie fenv_access , wenn Ihr Code Gleitkommastatuskennzeichnungen, Ausnahmen oder Steuerelementmoduskennzeichnungen testet. Der Compiler deaktiviert Gleitkommaoptimierungen, sodass Ihr Code konsistent auf die Gleitkommaumgebung zugreifen kann.

Die /fp:strict Befehlszeilenoption aktiviert fenv_accessautomatisch . Weitere Informationen zu diesem und anderen Gleitkommaverhalten finden Sie unter /fp (Angeben des Gleitkommaverhaltens).

Es gibt Einschränkungen für die Verwendungsmöglichkeiten fenv_accesspragma in Kombination mit anderen Gleitkommaeinstellungen:

  • Sie können dies nur aktivieren fenv_access , wenn präzise Semantik aktiviert ist. Präzise Semantik kann entweder durch die float_controlpragmaoder die /fp:precise/fp:strict Compileroptionen aktiviert werden. Der Compiler gibt standardmäßig an /fp:precise , ob keine andere Gleitkomma-Befehlszeilenoption angegeben ist.

  • Sie können keine float_control präzise Semantik deaktivieren, wenn fenv_access(on) sie festgelegt ist.

Die fenv_access(on) Direktive deaktiviert die Generierung von Gleitkommakontraktionen, Maschinenanweisungen, die Gleitkommavorgänge kombinieren. fenv_access(off) Stellt das vorherige Verhalten für Kontraktionen wieder her. Dieses Verhalten ist neu in Visual Studio 2022. In früheren Compilerversionen können Kontraktionen standardmäßig unter fenv_access(on). Weitere Informationen zu Gleitkommakontraktionen finden Sie unter /fp:contract.

Die Arten von Optimierungen, die fenv_access unterliegen, sind:

  • Globale allgemeine Teilausdruckbeseitigung

  • Codebewegung

  • Konstantenfaltung

Weitere Gleitkommadirektiven pragma sind:

Beispiele

In diesem Beispiel wird festgelegt fenv_access , dass on das Gleitkomma-Steuerelementregister für die 24-Bit-Genauigkeit festgelegt wird:

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

Wenn Sie aus dem vorherigen Beispiel herauskommentieren #pragma fenv_access (on) , unterscheidet sich die Ausgabe. Dies liegt daran, dass der Compiler die Kompilierungszeitauswertung durchführt, die den Steuerelementmodus nicht verwendet.

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

Siehe auch

Pragma-Direktiven und die __pragma und _Pragma Schlüsselwort (keyword)