_controlfp_s
Pobiera i ustawia słowo sterujące zmiennoprzecinkowe.Ta wersja _control87, _controlfp, __control87_2 ma wzmocnienia zabezpieczeń, jak opisano w Funkcje zabezpieczeń w CRT.
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
Parametry
currentControl
Bieżąca wartość słowa kontrolnego.newControl
Nowe wartości bitowe słowa sterującego.mask
Maska dla nowych bitów słowa kontrolującego do ustawienia.
Wartość zwracana
Zero, jeśli operacja się powiedzie; errno w przeciwnym razie, kod błędu.
Uwagi
_controlfp_s funkcja jest niezależna od platformy i bezpieczniejszej wersji _control87, która pobiera słowo kontrolne zmiennoprzecinkowe na adres, który jest przechowywany w currentControl i ustawia je za pomocą newControl.Bity w wartości wskazują stan sterowania zmiennoprzecinkowego.Stan sterowania zmiennoprzecinkowego włącza program do zmiany precyzji, zaokrąglania oraz trybu nieskończoności w pakiecie zmiennoprzecinkowym zapisu matematycznego, w zależności od platformy.Można również użyć _controlfp_s do zamaskowania lub usunięcia maski wyjątków zmiennoprzecinkowych.
Jeśli wartość dla mask jest równa 0, _controlfp_s pobiera słowo sterujące zmiennoprzecinkowe i przechowuje pobraną wartość w currentControl.
Jeśli mask jest różna od zera, ustawiono nową wartość dla słowa sterującego: dla każdego bitu, który jest ustawiony (tzn., wynosi 1) w mask, odpowiadający mu bit w new jest używany do aktualizacji słowa sterującego.Innymi słowy, fpcntrl = ((fpcntrl & ~mask) | (new & mask)) gdzie fpcntrl jest słowem sterującym zmiennoprzecinkowym.W tym scenariuszu currentControl jest ustawiona na wartość po zakończeniu zmiany; nie jest to stara wartość bitowa słowa kontrolnego.
[!UWAGA]
Domyślnie biblioteki środowiska uruchomieniowego maskują wszystkie wyjątki zmiennoprzecinkowe.
_controlfp_s jest prawie identyczna z funkcją _control87 na procesorze Intel (x 86), x64 i platformach ARM.Jeśli masz na celu platformy x86, x64 lub platformy ARM, można użyć _control87 lub _controlfp_s.
Różnica między _control87 i _controlfp_s polega na tym, w jaki sposób traktuje DENORMAL wartości.W przypadku procesora Intel (x 86) x64 i platform ARM, _control87 można ustawić lub wyczyścić maskę wyjątku ZDENORMALIZOWANY OPERAND._controlfp_s nie modyfikuje maski wyjątku z powodu DENORMALIZACJI OPERANDUTen przykład ilustruje różnicę:
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call.
unsigned int current_word = 0;
_controlfp_s( ¤t_word, _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged.
Możliwe wartości dla stałej maski (mask) i nowe wartości formantu (newControl) są pokazane w poniższej tabeli wartości szesnastkowych.Używanie przenośnych stałych wymienionych poniżej (_MCW_EM, _EM_INVALID, i tak dalej) jako argumenty tych funkcji, a nie dostarczanie szesnastkowych wartości jawnie.
Platformy oparte na procesorze Intel (x 86) obsługują ZDENORMALIZOWANE wartości wejściowe i wyjściowe na sprzęcie.Wartość x86, ma zachować wartości DENORMAL.Platforma ARM i x64 platform, które obsługują SSE2 wspierają włączenie orepand DENORMAL i wyników do stanu opróżnienia , lub wymuszają zero._controlfp_s_controlfp, i _control87 funkcje zapewniają maskę, aby zmienić to zachowanie.Poniższy przykład demonstruje użycie tej maski:
unsigned int current_word = 0;
_controlfp_s(¤t_word, _DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(¤t_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.
Na platformach ARM _controlfp_s funkcja odnosi się do rejestru FPSCR.W architekturach x64, tylko wyraz kontroli SSE2, który jest przechowywany w MXCSR rejestru ma wpływ.Na platformach firmy Intel (x86) _controlfp_s wpływa na wyrazy sterowania zarówno dla x 87 i SSE2, jeśli jest obecny.Istnieje możliwość, że dwa słowa sterujące będą sprzeczne ze sobą (ze względu na poprzednie wywołanie __control87_2, na przykład); jeśli istnieje niespójność między dwoma słowami sterującymi _controlfp_s ustawia EM_AMBIGUOUS flagę w currentControl.Jest to ostrzeżenie, że wyraz zwróconego formantu może nie reprezentować dokładnie stanu obu wyrazów zmiennoprzecinkowych formantu.
Na ARM i x64 architektury, zmiana trybu nieskończoności lub zwiększanie dokładności nie są obsługiwane.Jeśli używana jest maska kontroli dokładności na platformie x64, funkcja wywołuje potwierdzenie i procedura obsługi nieprawidłowego parametru jest wywoływana, zgodnie z opisem w Sprawdzanie poprawności parametru.
Jeśli maska nie jest ustawiona poprawnie, ta funkcja generuje wyjątek nieprawidłowego parametru, zgodnie z opisem w Sprawdzanie poprawności parametru.Jeśli wykonanie może być kontynuowane, funkcja ta zwraca EINVAL i ustawia errno jako EINVAL.
Ta funkcja jest ignorowane w /clr (Kompilacja środowiska uruchomieniowego języka wspólnego) lub /clr:pure do kompilacji ponieważ środowisko uruchomieniowe języka wspólnego (CLR) obsługuje tylko domyślną precyzję zmiennoprzecinkową.
Wartości szesnastkowe
W przypadku maski _MCW_EM, czyszczenie maski ustawia wyjątek, który umożliwia wyjątek sprzętowy; ustawienie jej ukrywa wyjątek.Jeśli występuje _EM_UNDERFLOW lub _EM_OVERFLOW, żaden wyjątek sprzętowy nie zostanie wyrzucony do momentu wykonania następnej instrukcji zmiennoprzecinkowejDo generowania wyjątków sprzętowych natychmiast po _EM_UNDERFLOW lub _EM_OVERFLOW, wywołaj instrukcję FWAIT MASM.
Maska |
Wartość szesnastkowa |
Stała |
Wartość szesnastkowa |
---|---|---|---|
_MCW_DN (Formant zdenormalizowany) |
0x03000000 |
_DN_SAVE _DN_FLUSH |
0x00000000 0x01000000 |
_MCW_EM (Maska wyjątku przerwania) |
0x0008001F |
_EM_INVALID _EM_DENORMAL _EM_ZERODIVIDE _EM_OVERFLOW _EM_UNDERFLOW _EM_INEXACT |
0x00000010 0x00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC (Formant nieskończoność) (Nie jest obsługiwana na ARM lub x64 platformy.) |
0x00040000 |
_IC_AFFINE _IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RC (Formant zaokrąglenia) |
0x00000300 |
_RC_CHOP _RC_UP _RC_DOWN _RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC (Formant precyzji) (Nie jest obsługiwana na ARM lub x64 platformy.) |
0x00030000 |
_PC_24 (24 bity) _PC_53 (53 bity) _PC_64 (64 bity) |
0x00020000 0x00010000 0x00000000 |
Wymagania
Procedura |
Wymagany nagłówek |
---|---|
_controlfp_s |
<float.h> |
Aby uzyskać więcej informacji na temat zgodności, zobacz Zgodność we Wstępie.
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
Równoważne z .NET Framework
Nie dotyczy.Aby wywołać standardową funkcję C, należy użyć PInvoke.Aby uzyskać więcej informacji, zobacz Przykłady wywołań platformy.
Zobacz też
Informacje
Obsługa liczb zmiennoprzecinkowych