_control87, _controlfp, __control87_2
Ruft das Gleitkommasteuerwort ab und legt ihn fest.Eine sicherere Version von _controlfp verfügbar ist. Weitere Informationen 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 Werte für Steuerwort bit.mask
Maske für neue Steuerwort festzulegenden Bits.x86_cw
Wird mit dem Steuerwort für das Gerät des Gleitkommas x87.Übergeben SieNULL(0) wenn nur der Steuerworts SSE2-Anweisungen festzulegen.sse2_cw
Steuerwort für das SSE-Gleitkomma, oder legt diese fest.Übergeben SieNULL(0) wenn nur der Steuerworts x87 festzulegen.
Rückgabewert
Für _control87 und _controlfpgeben die Bits im Steuerelementzustand float den zurückgegebenen Wert an.Eine vollständige Definition der Bits, die von _control87zurückgegeben werden, finden Sie unter FLOAT.H.
Für __control87_2ist der Rückgabewert 1 und gibt Erfolg angezeigt.
Hinweise
Die Funktion ruft _control87das Gleitkommasteuerwort ab und legt ihn fest.Das Gleitkommasteuerwort kann das Programm, um die Genauigkeit, die Unendlichkeits ändert und die mathematischen Gleitkommawert im Paket zu ändern.Sie können auch mithilfe von Gleitkommaausnahmen oder Maske _control87zu entlarven.Wenn der Wert für mask gleich 0 ist, wird _control87das Gleitkommasteuerwort ab.Wenn mask ungleich 0 (null) ist, wird ein neuer Wert für das Steuerwort festgelegt: Für jedes Bit, das gleich ist (1) in mask, das entsprechende Bit in new , wird das Steuerwort zu aktualisieren.Das heißt, fpcntrl = ((fpcntrl & ~mask) | (new & mask)) Dabei fpcntrl das Gleitkommasteuerwort ist.
Hinweis |
---|
Die Laufzeitbibliothek maske alle Gleitkommaausnahmen standardmäßig. |
_controlfpist eine plattformunabhängige, portable Version von _control87.Es ist mit der _control87Funktion auf Intel Plattformen (x86) fast identisch und wird vom MIPS ALPHA und - plattformen unterstützt.Um sicherzustellen, dass der Code float oder MIPS ALPHA übertragbar ist, verwenden Sie _controlfp.Wenn Sie x86-Plattformen abzielen, verwenden Sie _control87oder _controlfp.
Der Unterschied zwischen _control87und diese Werte ist die Methode _controlfpbehandeln DENORMAL mit zwei Funktionen.Für Plattformen (x86) _control87Intel kann die DENORMAL-OPERANDEN-Ausnahme maske festlegen und löschen.plattformen ALPHA und diese Ausnahme nicht unterstützt _controlfpändert nicht die DENORMAL-OPERANDEN-Ausnahme maske.Im folgenden Beispiel wird der 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 Masken Zeichenfolgenkonstante (mask) und die neuen Werte von Steuerelementen (new) Hexadezimalwerte sind in der folgenden Tabelle gezeigt.Verwenden Sie die portablen Konstanten, die unten aufgeführten (_MCW_EM, _EM_INVALIDusw.) als Argumente an diese Funktionen, anstatt die Hexadezimalwerte explizit anzugeben.
ALPHA und - plattformen unterstützen die DENORMAL-Eingabe- Ausgabewerte in der Software.Das Standardverhalten von Windows NT auf diesen Plattformen ist, die DENORMAL-Eingabe- und Ausgabewerte auf Null zu leeren._controlfp stellt eine neue Maske, um die Ein- und Ausgabe denormal Werte beizubehalten und zu leeren.
Intel Plattformen (x86) unterstützen die DENORMAL-Eingabe- und der Ausgabewerte an der Hardware.Das Verhalten ist, DENORMAL-Werte beizubehalten._control87 stellt keine Maske, um dieses Verhalten zu ändern.Das folgende Beispiel veranschaulicht den Unterschied:
_controlfp(_DN_SAVE, _MCW_DN);
// Denormal values preserved by software on ALPHA. NOP on x86.
_controlfp(_DN_FLUSH, _MCW_DN);
// Denormal values flushed to zero by hardware on ALPHA and x86
// processors with SSE2 support. Ignored on other x86 platforms.
_control87 auswirken und _controlfp die Steuerworte für das x87 und SSE2-Anweisungen, falls vorhanden.Die Funktion __control87_2 können einzeln oder zusammen gesteuert werden x87 SSE2-Anweisungen und Einheiten von Gleitkommas.Wenn Sie beide Geräte beeinflussen möchten, übergeben Sie die Adressen von zwei ganzen Zahlen x86_cw und sse2_cw.Wenn Sie nur ein Gerät beeinflussen möchten, übergeben Sie in eine Adresse für diesen Parameter übergeben Sie jedoch 0 (null) zum anderen.Wenn 0 für einen dieser Parameter übergeben wurde, hat die Funktion keine Auswirkungen auf dieses Float, oder legt diese fest.Diese Funktion kann in Situationen nützlich sein, in denen der Teil des Codes die Einheit des Gleitkommas x87 verwendet und ein anderer Teil des Codes die Einheit des Gleitkommas SSE2-Anweisungen verwendet.Wenn Sie __control87_2 in einem Teil eines Programms, und legen Sie verschiedene Werte für die steuerworte float und verwenden dann _control87 oder _controlfp , um das Steuerwort weiter zu bearbeiten, verwenden _control87 und _controlfp möglicherweise nicht in der Lage, ein einzelnes Steuerwort zurückzugeben, um den Status beider Float Einheiten dargestellt werden.In einem solchen Fall legen Sie diese Funktionen EM_AMBIGUOUS das Flag im zurückgegebenen ganzzahligen Wert fest, um anzugeben, dass es sich um eine Inkonsequenz zwischen den beiden Steuerworten vorhanden ist.Dies ist eine Warnung, dass das zurückgegebene Steuerwort möglicherweise nicht genau den Status beider float steuerworte Klasse dargestellten.
Auf der x64 Architektur wird das Ändern der Float genauigkeit nicht unterstützt.Wenn die Genauigkeit steuer maske auf dieser Plattform verwendet wird, wird eine Assertion und der ungültige Parameter Handler aufgerufen, wie in Parametervalidierungbeschrieben.
Hinweis |
---|
__control87_2 ist nicht für die x64 Architektur unterstützt.Wenn Sie __control87_2 verwenden und das Programm für die x64 Architektur kompiliert wird, generiert der Compiler einen Fehler. |
Diese Funktionen werden bei der Kompilierung mit /clr (Common Language Runtime-Kompilierung) oder /clr:pure veraltet, weil die Common Language Runtime unterstützt nur die standardmäßigen Float Genauigkeit.
Hexadezimalwerte
Für die _MCW_EM Maske wird das Löschen der Maske die Ausnahme ab, die die Hardware ausnahme zulässig. Festlegen der Maske blendet sie aus.Beachten Sie, dass beim Auftreten _EM_OVERFLOW oder _EM_UNDERFLOW keine Hardware ausnahme ausgelöst wird, wenn die folgenden Gleitkommaanweisung ausgeführt wurde.Um eine Hardware ausnahme unmittelbar nach _EM_UNDERFLOW oder _EM_OVERFLOWzu generieren, rufen Sie die Anweisung FWAIT MASM an.
Format |
Hexadezimalwerte |
Konstante |
Hexadezimalwerte |
---|---|---|---|
_MCW_DN (Denormal-Steuerelement) |
0x03000000 |
_DN_SAVE _DN_FLUSH |
0x00000000 0x01000000 |
ausnahme Unterbrechungen (_MCW_EM maske) |
0x0008001F |
_EM_INVALID _EM_DENORMAL _EM_ZERODIVIDE _EM_OVERFLOW _EM_UNDERFLOW _EM_INEXACT |
0x00000010 0x00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC (Unendlichkeits die Steuerung) |
0x00040000 |
_IC_AFFINE _IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RC-Steuerelement (aufgerundet) |
0x00000300 |
_RC_CHOP _RC_UP _RC_DOWN _RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
Genauigkeit (_MCW_PC die Steuerung) |
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 finden Sie unter Kompatibilität Kompatibilität in der Einführung.
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 );
}
Output
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. Um die Standard-C-Funktion aufrufen, verwenden Sie PInvoke. Weitere Informationen finden Sie unter Plattformaufruf-Beispiele.