Freigeben über


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 | offpush
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 | offpush
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_controlpragma Verhalten hat nicht dasselbe Verhalten wie die /fp Compileroption. Der float_controlpragma einzige Teil des Gleitkommaverhaltens. Es muss mit fp_contract und fenv_accesspragma 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:fastOptionen 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 verwendenfloat_control, on um festzulegenexcept, ob präzise Semantik aktiviert ist. Präzise Semantik kann entweder durch die float_controlpragmaoder die /fp:precise /fp:strict Compileroptionen aktiviert werden.

  • Sie können das Deaktivieren nicht verwendenfloat_control, wenn die Ausnahmesemantik aktiviert ist, unabhängig davon, ob es sich um einepragma float_controlCompileroption 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 eine float_controlpragma Compileroption oder um eine Compileroption handelt.

  • Sie können das Deaktivieren precise nicht verwendenfloat_control, wenn fenv_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_controlpragmawechseln:

#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 exceptausschaltetprecise. Die Verwendung, float_control um die vorherige Einstellung für Kontraktionen zu deaktivieren precise oder except wiederherzustellen. Sie können die fp_contractpragma 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(&currentControl, ~_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