Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Inaktiverar (on) eller aktiverar (off) optimeringar som kan ändra flyttalsmiljöns flaggtester och lägesändringar.
Syntax
#pragma fenv_access ({on|off})
Anmärkningar
Som standard är fenv_accessoff. Kompilatorn förutsätter att koden inte kommer åt eller manipulerar flyttalsmiljön. Om miljöåtkomst inte krävs kan kompilatorn göra mer för att optimera flyttalskoden.
Aktivera fenv_access om koden testar flyttalsstatusflaggor, undantag eller anger flaggor för kontrollläge. Kompilatorn inaktiverar optimeringar av flyttalser så att koden kan komma åt flyttalsmiljön konsekvent.
Kommandoradsalternativet /fp:strict aktiverar automatiskt fenv_access. Mer information om detta och andra flyttalsbeteenden finns i /fp (Ange Floating-Point beteende).
Det finns begränsningar för hur du kan använda fenv_accesspragma i kombination med andra flyttalsinställningar:
Du kan inte aktivera
fenv_accessom inte exakta semantik är aktiverade. Exakta semantik kan aktiveras antingen avfloat_controlpragmaeller med hjälp av/fp:preciseeller/fp:strictkompilatoralternativ. Kompilatorn använder som standard/fp:preciseom inget annat kommandoradsalternativ för flyttals har angetts.Du kan inte använda
float_controlför att inaktivera exakta semantik närfenv_access(on)har angetts.
fenv_access(on)-direktivet inaktiverar generering av flyttal sammandragningar, datorinstruktioner som kombinerar flyttalsåtgärder.
fenv_access(off) återställer det tidigare beteendet för sammandragningar. Det här beteendet är nytt i Visual Studio 2022. Tidigare kompilatorversioner kan generera sammandragningar som standard under fenv_access(on). Mer information om flyttalskontraktioner finns i /fp:contract.
De typer av optimeringar som omfattas av fenv_access är:
Global gemensam eliminering av underuttryck
Kodrörelse
Konstant vikning
Andra flyttalsdirektiv pragma omfattar:
Exempel
I det här exemplet anges fenv_access till on för att ange flyttalskontrollregistret för 24-bitars precision:
// 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
Om du kommenterar ut #pragma fenv_access (on) från föregående exempel är utdata annorlunda. Det beror på att kompilatorn utför kompileringstidsutvärdering, som inte använder kontrollläget.
// 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