_control87
, _controlfp
__control87_2
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