_controlfp_s
Pobiera i ustawia word kontroli zmiennoprzecinkowych.Jest to wersja z _control87, _controlfp, __control87_2 z rozszerzeń zabezpieczeń opisane w Funkcje zabezpieczeń w CRT.
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
Parametry
currentControl
Bieżąca wartość bit word kontroli.newControl
Nowe wartości bitowe word kontroli.mask
Maska dla nowych bitów word kontroli ustawić.
Wartość zwracana
Zero, jeśli kończy się pomyślnie, lub na errno wartość kodu błędu.
Uwagi
_controlfp_s Jest niezależny od platformy i bezpieczniejszej wersji _control87, który pobiera i ustawia word zmiennoprzecinkowych kontroli pod adres currentControl i newControl, odpowiednio.Bity wartości wskazują stan sterowania zmiennoprzecinkowych.Stan sterowania zmiennoprzecinkowych umożliwia program do zmiany precyzji, zaokrąglania oraz tryby nieskończoności w pakiecie math zmiennoprzecinkowych.Jeden maskę lub Usuń maskę wyjątków zmiennoprzecinkowe przy użyciu _controlfp_s.
Jeśli wartość dla mask jest równa 0, _controlfp_s pobiera word zmiennoprzecinkowych kontroli i przechowuje pobrana wartość w currentControl.
Jeśli mask jest różna od zera, nową wartość dla programu word formantu jest ustawiona: dla każdy bit, który znajduje się w (równą 1) w mask, odpowiadający mu bit w new jest używana do aktualizacji programu word kontroli.In other words, fpcntrl= ((fpcntrl& ~mask) | (new & mask)) gdy fpcntrl jest słowem kontroli zmiennoprzecinkowych. W tym scenariuszu currentControl jest ustawiona na wartość po zakończeniu zmian; nie jest stara wartość bit word kontroli.
[!UWAGA]
Biblioteki uruchomieniowej maski wszystkie wyjątki zmiennoprzecinkowych domyślnie.
_controlfp_sjest prawie identyczna z _control87 działać na platformach firmy Intel (x 86) i jest obsługiwany przez MCI i ALFA platformy.W celu zapewnienia, że zmiennoprzecinkowych kodu jest przenośny MIPS lub ALFA, należy użyć _controlfp_s.Jeśli są wyróżniane x 86 platformach, należy użyć _control87 lub _controlfp_s.
Różnica między _control87 i _controlfp_s sposób traktować te dwie funkcje DENORMAL wartości.Dla platform Intel (x 86) _control87 można ustawić i wyczyść maski wyjątek Brak reprezentacji ZMIENNOPRZECINKOWEJ ARGUMENTU.ALFA platform nie obsługują tego wyjątku i _controlfp_s nie powoduje modyfikowania maski wyjątek Brak reprezentacji ZMIENNOPRZECINKOWEJ ARGUMENTU.Poniższy przykład ilustruje różnicę:
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call.
_controlfp( _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged.
Możliwe wartości stałej maski (mask) i nowe wartości formantu (newControl) są pokazane w poniższej tabeli przedstawiono wartości szesnastkowe.Używanie stałych przenośne, wymienionych poniżej (_MCW_EM, _EM_INVALID, i tak dalej) jako argumenty do tych funkcji, zamiast dostarczanie szesnastkową wartości jawnie.
ALFA platformy obsługują dane wejściowe ZDENORMOWANA i wyjściowych wartości w oprogramowaniu.Domyślne zachowanie systemu Windows NT na tych platformach jest opróżnić ZDENORMOWANA dane wejściowe i wyjściowe wartości zero._controlfp_sudostępnia nowe maski do zachowania i opróżnić danych wejściowych i wyjściowych wartości ZDENORMOWANA.
Intel (x 86) platformach obsługują dane wejściowe ZDENORMOWANA i wyjściowych wartości w sprzęcie.Zachowanie jest, aby zachować wartości ZDENORMOWANA._control87nie zapewnia maski, aby zmienić to zachowanie.W poniższym przykładzie zademonstrowano tę różnicę:
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_swpływa na wyrazy kontroli zarówno x 87 i SSE2, jeśli jest obecna.Istnieje możliwość, że wyrazy dwóch kontroli uznane za niezgodne ze sobą (ze względu na poprzednie wywołanie __control87_2, na przykład); Jeśli istnieje niespójność między wyrazami dwóch kontroli _controlfp_s ustawia EM_AMBIGUOUS bandery w currentControl.Jest to ostrzeżenie, że word zwracane formant może nie reprezentują stan oba wyrazy zmiennoprzecinkowych kontroli dokładnie.
Na x64 nie jest obsługiwany przez architekturę, zmiana precyzji zmiennoprzecinkowych.Jeśli na tej platformie używana jest maska kontroli dokładności, nieprawidłowy parametr wywoływana jest funkcja obsługi, zgodnie z opisem w Sprawdzanie poprawności parametru.
Jeśli maska nie jest ustawiona poprawnie, ta funkcja generuje wyjątek nieprawidłowy parametr, jak opisano w Sprawdzanie poprawności parametru.Jeśli wykonanie mogą w dalszym ciągu, funkcja ta zwraca EINVAL i ustawia errno do EINVAL.
Funkcja ta została zaniechana podczas kompilacji z / CLR (kompilacja wspólnej Language Runtime) lub /clr:pure ponieważ common language runtime obsługuje tylko Domyślna precyzja zmiennoprzecinkowych.
Wartości szesnastkowe
Dla _MCW_EM maski, wyczyszczenie maski ustawia wyjątku, który umożliwia wyjątku sprzętu; ustawienie maski ukrywa wyjątek.Należy zauważyć, że jeśli _EM_UNDERFLOW lub _EM_OVERFLOW występuje nie sprzętu jest wyjątek do czasu następnej instrukcji zmiennoprzecinkowych jest wykonywany.Do generowania wyjątków sprzętu natychmiast po _EM_UNDERFLOW lub _EM_OVERFLOW, wywołanie instrukcji FWAIT MORGÓW.
Maska |
Wartość szesnastkowa |
Stała |
Wartość szesnastkowa |
---|---|---|---|
_MCW_DN(Brak reprezentacji zmiennoprzecinkowej sterowania) |
0x03000000 |
_DN_SAVE _DN_FLUSH |
0x00000000 0x01000000 |
_MCW_EM(Przerwanie maski wyjątek) |
0x0008001F |
_EM_INVALID _EM_DENORMAL _EM_ZERODIVIDE _EM_OVERFLOW _EM_UNDERFLOW _EM_INEXACT |
0x00000010 0X00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC(Kontrola nieskończoności) |
0X00040000 |
_IC_AFFINE _IC_PROJECTIVE |
0X00040000 0x00000000 |
_MCW_RC(Kontrola zaokrąglenia) |
0x00000300 |
_RC_CHOP _RC_UP _RC_DOWN _RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC(Precyzyjne sterowanie) |
0x00030000 |
_PC_24(24 bity) _PC_53(53 bitów) _PC_64(64 bity) |
0x00020000 0x00010000 0x00000000 |
Wymagania
Rozpoczęto wykonywanie procedury |
Wymaganego nagłówka |
---|---|
_controlfp_s |
<float.h> |
Informacji dotyczących zgodności, zobacz zgodności we wprowadzeniu.
Przykład
// 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 );
}
Dane wyjściowe
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 równoważne
Nie dotyczy.Aby wywołać standardowych funkcji C, należy użyć PInvoke.Aby uzyskać więcej informacji, zobacz Przykłady wywołać platformy.