Teilen über


_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 _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 Dauerhaft 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 und Gleitkommaunterstützung
_clear87, _clearfp
_status87, _statusfp, _statusfp2
_controlfp_s