Freigeben über


_control87, _controlfp, __control87_2

Ruft das Gleitkommasteuerwort ab und legt es fest. Es ist eine sicherere Version von _controlfp verfügbar. Informationen dazu 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 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 zurückgegeben werden, finden Sie in 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 Gleitkommasteuerwort kann das Programm die Genauigkeits-, Rundungs- und Unendlichkeitsmodi im mathematischen Gleitkommapaket je nach Plattform ä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. Das bedeutet: fpcntrl = ((fpcntrl & ~mask) | (new & mask)), wobei fpcntrl das Gleitkommasteuerwort ist.

Hinweis

Standardmäßig maskieren die Laufzeitbibliotheken alle Gleitkommaausnahmen.

_controlfp ist eine plattformunabhängige, portable Version von _control87. Es ist nahezu identisch mit der _control87-Funktion auf Intel (x86)-, x64- und ARM-Plattformen. Wenn die Plattformen x86, x64 oder ARM Ihr Zielobjekt sind, verwenden Sie _control87 oder _controlfp.

Der Unterschied zwischen _control87 und _controlfp besteht im Verarbeiten der DENORMAL-Werte. Für Intel (x86)-, x64- und ARM-Plattformen kann _control87 die DENORMAL OPERAND-Ausnahmemaske festlegen und löschen. _controlfp ändert nicht die DENORMAL OPERAND-Ausnahmemaske. 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 die neuen Steuerelementwerte (new) sind in der folgenden Hexadezimalwerttabelle aufgeführt. Verwenden Sie die unten aufgeführten portablen Konstanten (_MCW_EM, _EM_INVALID usw.) als Argumente für diese Funktionen, anstatt die Hexadezimalwerte explizit anzugeben.

Von Intel (x86) abgeleitete Plattformen unterstützen die DENORMAL-Eingabe- und -Ausgabewerte in der Hardware. Das x86-Verhalten besteht darin, die DENORMAL-Werte beizubehalten. Die ARM-Plattform und die x64-Plattformen mit SSE2-Unterstützung ermöglichen es, dass DENORMAL-Operanden und -Ergebnisse gelöscht werden oder dass Null erzwungen wird. 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-Plattformen sind die Funktionen _control87 und _controlfp auf das FPSCR-Register anwendbar. Auf x64-Architekturen ist nur das SSE2-Steuerwort, das im MXCSR-Register gespeichert ist, betroffen. Auf Intel (x86)-Plattformen wirken sich _control87 und _controlfp sowohl bei x87 als auch bei SSE2 (sofern vorhanden) auf die Steuerworte aus. Die Funktion __control87_2 ermöglicht es, dass die x87- und die SSE2-Gleitkommaeinheiten zusammen oder getrennt gesteuert werden. Wenn dies für beide Einheiten gelten soll, übergeben Sie die Adressen von zwei ganzen Zahlen an x86_cw und sse2_cw. Wenn dies nur für eine Einheit gelten soll, übergeben Sie eine Adresse für diesen Parameter, aber 0 (NULL) für den anderen. Wenn 0 für einen dieser Parameter übergeben wird, hat die Funktion keine Auswirkungen auf diese Gleitkommaeinheit. Diese Funktionalität kann in Situationen nützlich sein, in denen ein Teil des Codes die x87-Gleitkommaeinheit und ein anderer Teil des Codes die SSE2-Gleitkommaeinheit verwendet. Wenn Sie __control87_2 in einem Teil eines Programms verwenden und verschiedene Werte für die Gleitkommasteuerworte festlegen und dann _control87 oder _controlfp verwenden, um das Steuerwort weiter zu bearbeiten, können _control87 und _controlfp möglicherweise kein einzelnes Steuerwort zurückgeben, um den Zustand beider Gleitkommaeinheiten darzustellen. In diesem Fall legen diese Funktionen das EM_AMBIGUOUS-Flag im zurückgegebenen ganzzahligen Wert fest, um anzugeben, dass eine Inkonsistenz zwischen den beiden Steuerworten besteht. Dies ist eine Warnung, dass das zurückgegebene Steuerwort den Zustand beider Gleitkommasteuerworte möglicherweise nicht genau dargestellt.

Auf der ARM- und der x64-Architektur wird das Ändern des Unendlichkeitsmodus oder der Genauigkeit der Gleitkommawerte nicht unterstützt. Wenn die Genauigkeitssteuermaske auf der x64-Plattform verwendet wird, führt die Funktion eine Assertion aus und der Handler für ungültige Parameter wird aufgerufen, wie in Parametervalidierung beschrieben.

Hinweis

__control87_2 wird auf der ARM- oder x64-Architektur nicht unterstützt.Wenn Sie __control87_2 verwenden und Ihr Programm für die ARM- oder die x64-Architektur kompilieren, generiert der Compiler einen Fehler.

Diese Funktionen werden ignoriert, wenn Sie zum Kompilieren /clr (Common Language Runtime-Kompilierung) oder /clr:pure verwenden, da die Common Language Runtime (CLR) nur die standardmäßige Gleitkommagenauigkeit unterstützt.

Hexadezimalwerte

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.

Format

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)

(Wird auf ARM- oder x64-Plattformen nicht unterstützt.)

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)

(Wird auf ARM- oder x64-Plattformen nicht unterstützt.)

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
// 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 );
}

Ausgabe

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. Mit PInvoke rufen Sie die Standard-C-Funktion auf. Weitere Informationen finden Sie unter Beispiele für Plattformaufrufe.

Siehe auch

Referenz

Gleitkommaunterstützung

_clear87, _clearfp

_status87, _statusfp, _statusfp2

_controlfp_s