_controlfp_s

Ruft das Gleitkommasteuerwort ab und legt ihn fest.Dies ist eine Version von _control87, _controlfp, __control87_2 mit unter Security Enhancements, wie in Sicherheitsfeatures im CRTbeschrieben.

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

Parameter

  • currentControl
    Der aktuelle Wert der Steuerwort bit.

  • newControl
    Neue Werte für Steuerwort bit.

  • mask
    Maske für neue Steuerwort festzulegenden Bits.

Rückgabewert

Beliebige wenn der Vorgang erfolgreich war oder ein errno-Werts entspricht.

Hinweise

_controlfp_s ist eine plattformunabhängige und sicherere Version von _control87, die das Gleitkommasteuerwort in die Adresse von currentControl und newControlstammt und festgelegt wird.Die Bits in den Steuerelementzustand Gleitkommazahlen geben den Werten an.Der Gleitkommawert Steuerelementzustand kann das Programm, um die Genauigkeit, die Unendlichkeits ändert und die mathematischen Gleitkommawert im Paket zu ändern.Es kann auch mithilfe von Gleitkommaausnahmen oder Maske _controlfp_szu entlarven.

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

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.In diesem Szenario wird currentControl auf den Wert festgelegt wird, nachdem die Änderung abgeschlossen ist. Es ist nicht der alte Wert der Steuerwort bit.

HinweisHinweis

Die Laufzeitbibliothek maske alle Gleitkommaausnahmen standardmäßig.

_controlfp_s entspricht der Funktion auf _control87 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_s.Wenn Sie x86-Plattformen abzielen, verwenden Sie _control87oder _controlfp_s.

Der Unterschied zwischen _control87und _controlfp_sist die Methode diese Festlichkeits- DENORMAL-Werte 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_sä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 (newControl) 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_s 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. Ignored on x86

_controlfp_s wirkt sich auf die Steuerworte für das x87 und SSE2-Anweisungen, falls vorhanden.Es ist möglich für die beiden Steuerworte, bestehen Inkonsistenzen untereinander (da es einen früheren Aufruf von __control87_2, z. B.), wenn es eine Inkonsequenz zwischen den beiden Steuerworten gibt EM_AMBIGUOUS legt _controlfp_s das Flag in currentControlfest.Dies ist eine Warnung, dass das zurückgegebene Steuerwort möglicherweise nicht genau den Status beider Gleitkommasteuerworte 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 der Ereignishandler aufgerufen, z. B. ungültige Parameter in Parametervalidierungbeschrieben.

Wenn die Maske nicht ordnungsgemäß festgelegt ist, generiert diese Funktion eine ungültige Parameter ausnahme, wie in Parametervalidierungbeschrieben.Wenn die Ausführung zulässig ist, um fortzufahren, gibt diese Funktion EINVAL zurück und legt ihn fest. EINVALzu errno

Diese Funktion wird beim Kompilieren 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

_controlfp_s

<float.h>

Weitere Informationen finden Sie unter Kompatibilität 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 );
}

Output

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

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