Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ruft das Gleitkommasteuerwort ab und legt es fest. Eine sicherere Version von _controlfp ist verfügbar; siehe _controlfp_s.
Syntax
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 _control87diesem zurückgegeben werden, finden Sie unter 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 Gleitkommasteuerungswort kann das Programm je nach Plattform die Genauigkeits-, Rundungs- und Unendlichkeitsmodi ä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. Mit anderen Worten: fpcntrl = ((fpcntrl & ~mask) | (new & mask)) Wo fpcntrl befindet sich das Gleitkomma-Steuerelementwort.
Hinweis
Standardmäßig maskieren die Laufzeitbibliotheken alle Gleitkommaausnahmen.
_controlfp ist eine plattformunabhängige, tragbare Version davon, die _control87 fast identisch mit der _control87 Funktion ist. Wenn Ihr Code auf mehrere Plattformen ausgerichtet ist, verwenden _controlfp Oder _controlfp_s. Der Unterschied zwischen _control87 und _controlfp besteht in dem Verarbeiten der DENORMAL-Werte. Für x86-, x64-, ARM- und ARM64-Plattformen _control87 kann die DENORMAL OPERAND Ausnahmemaske festgelegt und gelöscht werden. _controlfp ändert das DENORMAL OPERAND Ausnahmeformat nicht. 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 neue Steuerelementwerte (new) werden in der Steuerelementwortmasken und -wertetabelle angezeigt. Verwenden Sie die unten aufgeführten portablen Konstanten (_MCW_EM, _EM_INVALID usw.) als Argumente für diese Funktionen, anstatt die Hexadezimalwerte explizit anzugeben.
Intel x86 abgeleitete Plattformen unterstützen die Eingabe- und Ausgabewerte in der DENORMAL Hardware. Das x86-Verhalten besteht darin, Werte beizubehalten DENORMAL . Die ARM- und ARM64-Plattformen und die x64-Plattformen mit SSE2-Unterstützung ermöglichen DENORMAL es Operanden und Ergebnissen zu leeren oder auf Null zu zwingen. 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- und ARM64-Plattformen gelten die _control87 Funktionen und _controlfp Funktionen für das FPSCR-Register. Nur das SSE2-Steuerelementwort, das im MXCSR-Register gespeichert ist, ist auf x64-Plattformen betroffen. Auf x86-Plattformen _control87 und _controlfp wirken sich auf die Steuerwörter für x87 und SSE2 aus, falls vorhanden.
Die Funktion __control87_2 ermöglicht es, dass die x87- und die SSE2-Gleitkommaeinheiten zusammen oder getrennt gesteuert werden. Um beide Einheiten zu beeinflussen, übergeben Sie die Adressen von zwei ganzzahligen Zahlen an x86_cw und sse2_cw. Wenn Sie sich nur auf eine Einheit auswirken möchten, übergeben Sie eine Adresse für diesen Parameter, übergeben sie jedoch 0 (NULL) für die andere. Wenn 0 für einen dieser Parameter übergeben wird, hat die Funktion keine Auswirkungen auf diese Gleitkommaeinheit. Es ist nützlich, wenn Ein Teil des Codes die x87-Gleitkommaeinheit verwendet, und ein anderer Teil verwendet die SSE2-Gleitkommaeinheit.
Wenn Sie __control87_2 unterschiedliche Werte für die Gleitkomma-Steuerelementwörter festlegen, kann ein _controlfp einzelnes Steuerelementwort nicht zurückgegeben werden, _control87 um den Zustand beider Gleitkommaeinheiten darzustellen. In einem solchen Fall legen diese Funktionen das EM_AMBIGUOUS Kennzeichen im zurückgegebenen ganzzahligen Wert fest, um eine Inkonsistenz zwischen den beiden Steuerelementwörtern anzugeben. Bei EM_AMBIGUOUS der Kennzeichnung handelt es sich um eine Warnung, dass das zurückgegebene Steuerelementwort möglicherweise nicht den Status beider Gleitkomma-Steuerwörter genau darstellt.
Auf den Plattformen ARM, ARM64 und x64 wird das Ändern des Unendlichkeitsmodus oder der Gleitkommagenauigkeit nicht unterstützt. Wenn die Genauigkeitssteuerungsmaske auf der x64-Plattform verwendet wird, löst die Funktion eine Assertion aus, und der ungültige Parameterhandler wird aufgerufen, wie in der Parameterüberprüfung beschrieben.
Hinweis
__control87_2 wird auf den Plattformen ARM, ARM64 oder x64 nicht unterstützt. Wenn Sie Ihr Programm für die ARM-, ARM64- oder x64-Plattformen verwenden __control87_2 und kompilieren, generiert der Compiler einen Fehler.
Diese Funktionen werden ignoriert, wenn Sie (Common Language Runtime Compilation) zum Kompilieren verwenden./clr Die Common Language Runtime (CLR) unterstützt nur die standardmäßige Gleitkommagenauigkeit.
Steuern von Wortformaten und Werten
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.
| Maske | 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)(Nicht unterstützt auf ARM- oder x64-Plattformen.) |
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)(Nicht unterstützt auf ARM- oder x64-Plattformen.) |
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
// compile by using: cl /W4 /arch:IA32 crt_cntrl87.c
// 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 = 0;
int result;
// Show original x87 control word and do calculation.
result = __control87_2(0, 0, &control_word_x87, 0 );
printf( "Original: 0x%.8x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Set precision to 24 bits and recalculate.
result = __control87_2(_PC_24, MCW_PC, &control_word_x87, 0 );
printf( "24-bit: 0x%.8x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Restore default precision-control bits and recalculate.
result = __control87_2( _CW_DEFAULT, MCW_PC, &control_word_x87, 0 );
printf( "Default: 0x%.8x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Original: 0x0009001f
0.1 * 0.1 = 1.000000000000000e-02
24-bit: 0x000a001f
0.1 * 0.1 = 9.999999776482582e-03
Default: 0x0009001f
0.1 * 0.1 = 1.000000000000000e-02
Siehe auch
Mathematische Unterstützung und Gleitkommaunterstützung
_clear87, _clearfp
_status87, _statusfp_statusfp2
_controlfp_s