fenv_access
pragma
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_access
off
. 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_access
pragma i kombination med andra flyttalsinställningar:
Du kan inte aktivera
fenv_access
om inte exakta semantik är aktiverade. Exakta semantik kan aktiveras antingen avfloat_control
pragmaeller med hjälp av/fp:precise
eller/fp:strict
kompilatoralternativ. Kompilatorn använder som standard/fp:precise
om inget annat kommandoradsalternativ för flyttals har angetts.Du kan inte använda
float_control
fö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