float_control
pragma
Gibt Gleitkommaverhalten für eine Funktion an.
Syntax
#pragma float_control
#pragma float_control( precise,
{ }on
|off
[, push
])
#pragma float_control( except,
{ }on
|off
[, push
])
#pragma float_control(
{ }push
|pop
)
Optionen
precise
, on
| off
push
Gibt an, ob präzise Gleitkommasemantik aktiviert (on
) oder deaktiviert werdenoff
soll. Informationen zu Unterschieden mit der /fp:precise
Compileroption finden Sie im Abschnitt "Hinweise". Das optionale push
Token pusht die aktuelle Einstellung für float_control
den internen Compilerstapel.
except
, on
| off
push
Gibt an, ob Gleitkomma-Ausnahmesemantik aktiviert (on
) oder deaktiviert werdenoff
soll. Das optionale push
Token pusht die aktuelle Einstellung für float_control
den internen Compilerstapel.
except
kann nur festgelegt on
werden, wenn precise
sie auch auf on
.
push
Verschiebt die aktuelle float_control
Einstellung an den internen Compilerstapel.
pop
Entfernt die float_control
Einstellung vom oberen Rand des internen Compilerstapels und macht dies zur neuen float_control
Einstellung.
Hinweise
Das float_control
pragma Verhalten hat nicht dasselbe Verhalten wie die /fp
Compileroption. Der float_control
pragma einzige Teil des Gleitkommaverhaltens. Es muss mit fp_contract
und fenv_access
pragma Direktiven kombiniert werden, um die /fp
Compileroptionen neu zu erstellen. In der folgenden Tabelle sind die entsprechenden pragma Einstellungen für jede Compileroption aufgeführt:
Option | float_control(precise, *) |
float_control(except, *) |
fp_contract(*) |
fenv_access(*) |
---|---|---|---|---|
/fp:strict |
on |
on |
off |
on |
/fp:precise |
on |
off |
off * |
off |
/fp:fast |
off |
off |
on |
off |
* In Versionen von Visual Studio vor Visual Studio 2022 ist das /fp:precise
Verhalten standardmäßig auf fp_contract(on)
.
Option | float_control(precise, *) |
float_control(except, *) |
fp_contract(*) |
fenv_access(*) |
---|---|---|---|---|
/fp:strict |
on |
on |
off |
on |
/fp:precise |
on |
off |
off |
off |
/fp:fast |
off |
off |
on |
off |
Mit anderen Worten, Sie müssen möglicherweise mehrere pragma Direktiven in Kombination verwenden, um die /fp:fast
Optionen und /fp:precise
/fp:strict
Befehlszeilenoptionen zu emulieren.
Es gibt Einschränkungen bei der Verwendung der float_control
Gleitkommadirektiven pragma und fenv_access
Gleitkommadirektiven in Kombination:
Sie können nur verwenden
float_control
,on
um festzulegenexcept
, ob präzise Semantik aktiviert ist. Präzise Semantik kann entweder durch diefloat_control
pragmaoder die/fp:precise
/fp:strict
Compileroptionen aktiviert werden.Sie können das Deaktivieren nicht verwenden
float_control
, wenn die Ausnahmesemantik aktiviert ist, unabhängig davon, ob es sich um einepragmafloat_control
Compileroption oder um eine/fp:except
Compileroption handelt.precise
Sie können dies nur aktivieren
fenv_access
, wenn präzise Semantik aktiviert ist, unabhängig davon, ob es sich um einefloat_control
pragma Compileroption oder um eine Compileroption handelt.Sie können das Deaktivieren
precise
nicht verwendenfloat_control
, wennfenv_access
sie aktiviert ist.
Diese Einschränkungen bedeuten, dass die Reihenfolge einiger Gleitkommadirektiven pragma erheblich ist. Um von einem schnellen Modell zu einem strengen Modell mithilfe von pragma Direktiven zu wechseln, verwenden Sie den folgenden Code:
#pragma float_control(precise, on) // enable precise semantics
#pragma fenv_access(on) // enable environment sensitivity
#pragma float_control(except, on) // enable exception semantics
#pragma float_control(precise, on) // enable precise semantics
#pragma fenv_access(on) // enable environment sensitivity
#pragma float_control(except, on) // enable exception semantics
#pragma fp_contract(off) // disable contractions
Verwenden Sie den folgenden Code, um von einem strengen Modell zu einem schnellen Modell zu float_control
pragmawechseln:
#pragma float_control(except, off) // disable exception semantics
#pragma fenv_access(off) // disable environment sensitivity
#pragma float_control(precise, off) // disable precise semantics
#pragma fp_contract(on) // enable contractions
Wenn keine Optionen angegeben sind, float_control
hat dies keine Auswirkung.
Die float_control
Direktive deaktiviert Kontraktionen, wenn sie ein- oder except
ausschaltetprecise
. Die Verwendung, float_control
um die vorherige Einstellung für Kontraktionen zu deaktivieren precise
oder except
wiederherzustellen. Sie können die fp_contract
pragma Direktive verwenden, um das Compilerverhalten bei Kontraktionen zu ändern. float_control(push)
drücken und float_control(pop)
die Einstellung für Kontraktionen als Teil der float_control
Einstellung auf den internen Compilerstapel verschieben und auffüllen. Dieses Verhalten ist neu in Visual Studio 2022. Die float_control
Direktive in früheren Compilerversionen hat keine Auswirkungen auf Kontraktionseinstellungen.
Beispiel
Das folgende Beispiel zeigt, wie Sie eine Überlauf-Gleitkommaausnahme mithilfe von pragmafloat_control
.
// pragma_directive_float_control.cpp
// compile with: /EHa
#include <stdio.h>
#include <float.h>
double func( ) {
return 1.1e75;
}
#pragma float_control (except, on)
int main( ) {
float u[1];
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, ~_EM_OVERFLOW, _MCW_EM);
if (err != 0)
printf_s("_controlfp_s failed!\n");
try {
u[0] = func();
printf_s ("Fail");
return(1);
}
catch (...) {
printf_s ("Pass");
return(0);
}
}
Pass
Siehe auch
PragmaDirektiven und Schlüsselwörter __pragma
_Pragma
fenv_access
pragma
fp_contract
pragma