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 _control87
diesem 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