fenv_access
pragma
Deaktiviert () oder aktiviert (on
off
) 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_access
automatisch . Weitere Informationen zu diesem und anderen Gleitkommaverhalten finden Sie unter /fp (Angeben des Gleitkommaverhaltens).
Es gibt Einschränkungen für die Verwendungsmöglichkeiten fenv_access
pragma 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 diefloat_control
pragmaoder 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, wennfenv_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(¤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);
}
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(¤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);
}
out=1.000000000000000e-02