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