Freigeben über


_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.

HinweisHinweis

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.

HinweisHinweis

__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.

Siehe auch

Referenz

Gleitkommaunterstützung

_clear87, _clearfp

_status87, _statusfp, _statusfp2