Freigeben über


_controlfp_s

Ruft das Gleitkommasteuerwort ab und legt es fest. Diese Version von _control87, _controlfp, __control87_2 enthält Sicherheitserweiterungen wie unter Sicherheitsfunktionen in der CRT beschrieben.

errno_t _controlfp_s(
    unsigned int *currentControl,
    unsigned int newControl,
    unsigned int mask
);

Parameter

  • currentControl
    Der aktuelle Bitwert des Steuerworts.

  • newControl
    Neue Bitwerte des Steuerworts.

  • mask
    Maske für festzulegende neue Steuerwortbits.

Rückgabewert

Null, wenn erfolgreich, oder ein Fehlercode des Wertes errno.

Hinweise

Die _controlfp_s-Funktion ist eine plattformunabhängige und sicherere Version von _control87, die das Gleitkommasteuerwort in die in currentControl gespeicherte Adresse einsetzt und mithilfe von newControl festlegt. Die Bits in den Werten geben den Zustand des Gleitkommasteuerelements an. Mit dem Zustand des Gleitkommasteuerelements kann das Programm die Genauigkeits-, Rundungs- und Unendlichkeitsmodi im mathematischen Gleitkommapaket je nach Plattform ändern. Sie können auch _controlfp_s verwenden, um Gleitkommaausnahmen zu maskieren bzw. die Maskierung aufzuheben.

Wenn der Wert für mask gleich 0 ist, ruft _controlfp_s das Gleitkommasteuerwort ab und speichert den abgerufenen Wert in currentControl.

Wenn mask ungleich 0 ist, wird ein neuer Wert für das Steuerwort festgelegt: Für jedes festgelegte 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. In diesem Szenario ist currentControl nach Abschluss der Änderung auf den Wert festgelegt; es ist nicht der alte Bitwert des Steuerworts.

Hinweis

Standardmäßig maskieren die Laufzeitbibliotheken alle Gleitkommaausnahmen.

_controlfp_s ist nahezu identisch mit der _control87-Funktion auf Plattformen von Intel (x86), x64 und ARM. Wenn die Plattformen x86, x64 oder ARM Ihr Zielobjekt sind, können Sie _control87 oder _controlfp_s verwenden.

Der Unterschied zwischen _control87 und _controlfp_s besteht in dem Verarbeiten der DENORMAL-Werte. Für Intel (x86)-, x64- und ARM-Plattformen kann _control87 die DENORMAL OPERAND-Ausnahmemaske festlegen und löschen. _controlfp_s ändert nicht die DENORMAL OPERAND-Ausnahmemaske. Dieses Beispiel veranschaulicht den Unterschied:

_control87( _EM_INVALID, _MCW_EM ); 
// DENORMAL is unmasked by this call.
unsigned int current_word = 0;
_controlfp_s( &current_word, _EM_INVALID, _MCW_EM ); 
// DENORMAL exception mask remains unchanged.

Die möglichen Werte für die Maskenkonstante (mask) und die neuen Steuerelementwerte (newControl) sind in der folgenden Hexadezimalwerttabelle aufgeführt. Verwenden die unten aufgeführten portablen Konstanten (_MCW_EM, _EM_INVALID usw.) als Argumente für diese Funktionen, anstatt den Hexadezimalwerten 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_s, _controlfp und _control87 stellen eine Maske zum Ändern dieses Verhaltens bereit. Das folgende Beispiel veranschaulicht die Verwendung dieser Maske:

unsigned int current_word = 0;
_controlfp_s(&current_word, _DN_SAVE, _MCW_DN);   
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(&current_word, _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 gilt die _controlfp_s-Funktion für das FPSCR-Register. Auf x64-Architekturen ist nur das SSE2-Steuerwort, das im MXCSR-Register gespeichert ist, betroffen. Auf Intel (x86)-Plattformen wirkt sich _controlfp_s sowohl bei x87 als auch bei SSE2 (sofern vorhanden) auf die Steuerworte aus. Es ist möglich, dass die zwei Steuerworte untereinander inkonsistent sind (z. B. aufgrund eines vorherigen Aufrufs von __control87_2). Falls es eine Inkonsistenz zwischen den zwei Steuerworten gibt, legt _controlfp_s das EM_AMBIGUOUS-Flag in currentControl fest. 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.

Wenn die Maske nicht ordnungsgemäß festgelegt ist, generiert diese Funktion eine Ausnahme wegen eines ungültigen Parameters, wie in Parametervalidierung beschrieben. Wenn die weitere Ausführung zugelassen wird, gibt diese Funktion EINVAL zurück und stellt errno auf EINVAL ein.

Diese Funktion wird ignoriert, wenn Sie /clr (Common Language Runtime-Kompilierung) oder /clr:pure zum Kompilieren verwenden, da die Common Language Runtime (CLR) nur eine standardmäßige Genauigkeit von Gleitkommawerten 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

_controlfp_s

<float.h>

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität in der Einführung.

Beispiel

// crt_contrlfp_s.c
// processor: x86
// This program uses _controlfp_s to output the FP 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;
    int err;

    // Show original FP control word and do calculation.
    err = _controlfp_s(&control_word, 0, 0);
    if ( err ) /* handle error here */;

    printf( "Original: 0x%.4x\n", control_word );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

    // Set precision to 24 bits and recalculate.
    err = _controlfp_s(&control_word, _PC_24, MCW_PC);
    if ( err ) /* handle error here */;

    printf( "24-bit:   0x%.4x\n", control_word );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

    // Restore default precision-control bits and recalculate.
    err = _controlfp_s(&control_word, _CW_DEFAULT, MCW_PC);
    if ( err ) /* handle error here */;

    printf( "Default:  0x%.4x\n", control_word );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}

Ausgabe

Original: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
24-bit:   0xa001f
0.1 * 0.1 = 9.999999776482582e-003
Default:  0x9001f
0.1 * 0.1 = 1.000000000000000e-002

Entsprechung in .NET Framework

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

_control87, _controlfp, __control87_2