_control87, _controlfp, __control87_2
Ruft das Gleitkommasteuerwort ab und legt es fest. Es ist eine sicherere Version von _controlfp verfügbar. Informationen dazu finden Sie unter _controlfp_s.
unsigned int _control87(
unsigned int new,
unsigned int mask
);
unsigned int _controlfp(
unsigned int new,
unsigned int mask
);
int __control87_2(
unsigned int new,
unsigned int mask,
unsigned int* x86_cw,
unsigned int* sse2_cw
);
Parameter
new
Neue Bitwerte des Steuerworts.mask
Maske für festzulegende neue Steuerwortbits.x86_cw
Gefüllt mit dem Steuerwort für die x87-Gleitkommaeinheit. Übergeben Sie 0 (NULL), um nur das SSE2-Steuerwort festzulegen.sse2_cw
Steuerwort für die SSE-Gleitkommaeinheit. Übergeben Sie 0 (NULL), um nur das x87-Steuerwort festzulegen.
Rückgabewert
Für _control87 und _controlfp geben die Bits im zurückgegebenen Wert den Zustand des Gleitkommasteuerelements an. Eine vollständige Definition der Bits, die von _control87 zurückgegeben werden, finden Sie in FLOAT.H.
Für __control87_2 ist der Rückgabewert 1, was den Erfolg angibt.
Hinweise
Die _control87-Funktion ruft das Gleitkommasteuerwort ab und legt es fest. Mit dem Gleitkommasteuerwort kann das Programm die Genauigkeits-, Rundungs- und Unendlichkeitsmodi im mathematischen Gleitkommapaket je nach Plattform ändern. Sie können auch _control87 verwenden, um Gleitkommaausnahmen zu maskieren bzw. die Maskierung aufzuheben. Wenn der Wert für mask gleich 0 ist, ruft _control87 das Gleitkommasteuerwort ab. Wenn mask ungleich 0 ist, wird ein neuer Wert für das Steuerwort festgelegt: Für jedes aktivierte Bit (d. h. gleich 1) in mask wird das entsprechende Bit in new verwendet, um das Steuerwort zu aktualisieren. Das bedeutet: fpcntrl = ((fpcntrl & ~mask) | (new & mask)), wobei fpcntrl das Gleitkommasteuerwort ist.
Hinweis
Standardmäßig maskieren die Laufzeitbibliotheken alle Gleitkommaausnahmen.
_controlfp ist eine plattformunabhängige, portable Version von _control87. Es ist nahezu identisch mit der _control87-Funktion auf Intel (x86)-, x64- und ARM-Plattformen. Wenn die Plattformen x86, x64 oder ARM Ihr Zielobjekt sind, verwenden Sie _control87 oder _controlfp.
Der Unterschied zwischen _control87 und _controlfp besteht im Verarbeiten der DENORMAL-Werte. Für Intel (x86)-, x64- und ARM-Plattformen kann _control87 die DENORMAL OPERAND-Ausnahmemaske festlegen und löschen. _controlfp ändert nicht die DENORMAL OPERAND-Ausnahmemaske. Dieses Beispiel veranschaulicht den Unterschied:
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call
_controlfp( _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged
Die möglichen Werte für die Maskenkonstante (mask) und die neuen Steuerelementwerte (new) sind in der folgenden Hexadezimalwerttabelle aufgeführt. Verwenden Sie die unten aufgeführten portablen Konstanten (_MCW_EM, _EM_INVALID usw.) als Argumente für diese Funktionen, anstatt die Hexadezimalwerte explizit anzugeben.
Von Intel (x86) abgeleitete Plattformen unterstützen die DENORMAL-Eingabe- und -Ausgabewerte in der Hardware. Das x86-Verhalten besteht darin, die DENORMAL-Werte beizubehalten. Die ARM-Plattform und die x64-Plattformen mit SSE2-Unterstützung ermöglichen es, dass DENORMAL-Operanden und -Ergebnisse gelöscht werden oder dass Null erzwungen wird. Die Funktionen _controlfp und _control87 stellen eine Maske zum Ändern dieses Verhaltens bereit. Das folgende Beispiel veranschaulicht die Verwendung dieser Maske.
_controlfp(_DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp(_DN_FLUSH, _MCW_DN);
// Denormal values flushed to zero by hardware on ARM platforms
// and x64 processors with SSE2 support. Ignored on other x86 platforms.
Auf ARM-Plattformen sind die Funktionen _control87 und _controlfp auf das FPSCR-Register anwendbar. Auf x64-Architekturen ist nur das SSE2-Steuerwort, das im MXCSR-Register gespeichert ist, betroffen. Auf Intel (x86)-Plattformen wirken sich _control87 und _controlfp sowohl bei x87 als auch bei SSE2 (sofern vorhanden) auf die Steuerworte aus. Die Funktion __control87_2 ermöglicht es, dass die x87- und die SSE2-Gleitkommaeinheiten zusammen oder getrennt gesteuert werden. Wenn dies für beide Einheiten gelten soll, übergeben Sie die Adressen von zwei ganzen Zahlen an x86_cw und sse2_cw. Wenn dies nur für eine Einheit gelten soll, übergeben Sie eine Adresse für diesen Parameter, aber 0 (NULL) für den anderen. Wenn 0 für einen dieser Parameter übergeben wird, hat die Funktion keine Auswirkungen auf diese Gleitkommaeinheit. Diese Funktionalität kann in Situationen nützlich sein, in denen ein Teil des Codes die x87-Gleitkommaeinheit und ein anderer Teil des Codes die SSE2-Gleitkommaeinheit verwendet. Wenn Sie __control87_2 in einem Teil eines Programms verwenden und verschiedene Werte für die Gleitkommasteuerworte festlegen und dann _control87 oder _controlfp verwenden, um das Steuerwort weiter zu bearbeiten, können _control87 und _controlfp möglicherweise kein einzelnes Steuerwort zurückgeben, um den Zustand beider Gleitkommaeinheiten darzustellen. In diesem Fall legen diese Funktionen das EM_AMBIGUOUS-Flag im zurückgegebenen ganzzahligen Wert fest, um anzugeben, dass eine Inkonsistenz zwischen den beiden Steuerworten besteht. Dies ist eine Warnung, dass das zurückgegebene Steuerwort den Zustand beider Gleitkommasteuerworte möglicherweise nicht genau dargestellt.
Auf der ARM- und der x64-Architektur wird das Ändern des Unendlichkeitsmodus oder der Genauigkeit der Gleitkommawerte nicht unterstützt. Wenn die Genauigkeitssteuermaske auf der x64-Plattform verwendet wird, führt die Funktion eine Assertion aus und der Handler für ungültige Parameter wird aufgerufen, wie in Parametervalidierung beschrieben.
Hinweis
__control87_2 wird auf der ARM- oder x64-Architektur nicht unterstützt.Wenn Sie __control87_2 verwenden und Ihr Programm für die ARM- oder die x64-Architektur kompilieren, generiert der Compiler einen Fehler.
Diese Funktionen werden ignoriert, wenn Sie zum Kompilieren /clr (Common Language Runtime-Kompilierung) oder /clr:pure verwenden, da die Common Language Runtime (CLR) nur die standardmäßige Gleitkommagenauigkeit unterstützt.
Hexadezimalwerte
Durch das Aufheben der _MCW_EM-Maske wird die Ausnahme festgelegt, was die Hardwareausnahme ermöglicht. Das Festlegen der Maske blendet die Ausnahme aus. Wenn _EM_UNDERFLOW oder _EM_OVERFLOW auftritt, wird keine Hardwareausnahme ausgelöst, bis die nächste Gleitkommaanweisung ausgeführt wird. Um eine Hardwareausnahme direkt nach _EM_UNDERFLOW oder _EM_OVERFLOW zu generieren, rufen Sie die Anweisung FWAIT MASM auf.
Format |
Farbtonwert |
Konstante |
Farbtonwert |
---|---|---|---|
_MCW_DN (Nicht normale Steuerung) |
0x03000000 |
_DN_SAVE _DN_FLUSH |
0x00000000 0x01000000 |
_MCW_EM (Unterbrechungsausnahmemaske) |
0x0008001F |
_EM_INVALID _EM_DENORMAL _EM_ZERODIVIDE _EM_OVERFLOW _EM_UNDERFLOW _EM_INEXACT |
0x00000010 0x00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC (Unendlichkeitssteuerung) (Wird auf ARM- oder x64-Plattformen nicht unterstützt.) |
0x00040000 |
_IC_AFFINE _IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RC (Rundungssteuerung) |
0x00000300 |
_RC_CHOP _RC_UP _RC_DOWN _RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC (Genauigkeitssteuerung) (Wird auf ARM- oder x64-Plattformen nicht unterstützt.) |
0x00030000 |
_PC_24 (24 Bits) _PC_53 (53 Bits) _PC_64 (64 Bits) |
0x00020000 0x00010000 0x00000000 |
Anforderungen
Routine |
Erforderlicher Header |
---|---|
_control87, _controlfp, _control87_2 |
<float.h> |
Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Beispiel
// crt_cntrl87.c
// processor: x86
// This program uses __control87_2 to output the x87 control
// word, set the precision to 24 bits, and reset the status to
// the default.
//
#include <stdio.h>
#include <float.h>
#pragma fenv_access (on)
int main( void )
{
double a = 0.1;
unsigned int control_word_x87;
// Show original x87 control word and do calculation.
control_word_x87 = __control87_2(0, 0,
&control_word_x87, 0);
printf( "Original: 0x%.4x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Set precision to 24 bits and recalculate.
control_word_x87 = __control87_2(_PC_24, MCW_PC,
&control_word_x87, 0);
printf( "24-bit: 0x%.4x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Restore default precision-control bits and recalculate.
control_word_x87 = __control87_2( _CW_DEFAULT, MCW_PC,
&control_word_x87, 0 );
printf( "Default: 0x%.4x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Ausgabe
Original: 0x0001
0.1 * 0.1 = 1.000000000000000e-002
24-bit: 0x0001
0.1 * 0.1 = 9.999999776482582e-003
Default: 0x0001
0.1 * 0.1 = 1.000000000000000e-002
.NET Framework-Entsprechung
Nicht zutreffend. Mit PInvoke rufen Sie die Standard-C-Funktion auf. Weitere Informationen finden Sie unter Beispiele für Plattformaufrufe.