_control87, _controlfp, __control87_2
Pobiera i ustawia słowo sterujące zmiennoprzecinkowe.Bardziej bezpieczna wersja _controlfp jest dostępna w _controlfp_s.
unsigned int _control87(
unsigned int new,
unsigned int mask
);
unsigned int _controlfp(
unsigned int new,
unsigned int mask
);
int __control87_2(
unsigned int new,
unsigned int mask,
unsigned int* x86_cw,
unsigned int* sse2_cw
);
Parametry
new
Nowe wartości bitowe słowa sterującego.mask
Maska dla nowych bitów słowa kontrolującego do ustawienia.x86_cw
Wypełniony wyrazem sterującym dla jednostki zmiennoprzecinkowej x87.Przenieść 0 (NULL) ustawić słowa kontrolne SSE2.sse2_cw
Słowo sterujące dla jednostki zmiennoprzecinkowej SSE.Przenieść 0 (NULL) ustawić słowa kontrolne x87.
Wartość zwracana
W przypadku _control87 i _controlfp, bity w wartości zwracanej wskazują stan sterowania zmiennoprzecinkowego.Aby uzyskać pełną definicję bitów, które są zwracane przez _control87, zobacz FLOAT.H.
Dla __control87_2, wartość zwracana wynosi 1, co wskazuje sukces.
Uwagi
Ta _control87 funkcja pobiera i ustawia wyraz kierowany zmiennoprzecinkowo.Słowo 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ć _control87 do zamaskowania lub usunięcia maski wyjątków zmiennoprzecinkowych.Jeśli wartość dla mask jest równa 0, _control87 pobiera słowo sterujące zmiennoprzecinkowe.Jeśli mask jest różna od zera, ustawiono nową wartość dla słowa sterującego: dla każdego bitu, który jest włączony (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.
[!UWAGA]
Domyślnie biblioteki środowiska uruchomieniowego maskują wszystkie wyjątki zmiennoprzecinkowe.
_controlfp jest niezależną od platformy, przenośną wersją _control87.Jest prawie identyczna z funkcją _control87 na procesorze Intel (x 86), x64 i platformami ARM.Jeśli masz na celu platformy x86, x64 lub platformy ARM, użyj _control87 lub _controlfp.
Różnica między _control87 i _controlfp polega na tym, w jaki sposób traktuje wartości DENORMAL.W przypadku procesora Intel (x 86) x64 i platform ARM, _control87 można ustawić lub wyczyścić maskę wyjątku ZDENORMALIZOWANY OPERAND._controlfp nie modyfikuje maski wyjątku DENORMALIZACJA OPERANDUTen 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 dla stałej maski (mask) i nowe wartości formantu (new) 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 i _control87 funkcje zapewniają maskę, aby zmienić to zachowanie.Poniższy przykład demonstruje użycie tej maski.
_controlfp(_DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp(_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 _control87 i _controlfp funkcje odnoszą 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) _control87 i _controlfp wpływa na wyrazy sterowania zarówno dla x 87 i SSE2, jeśli jest obecny.Funkcja __control87_2 umożliwia jednostkom zmiennoprzecinkowym zarówno x87 jak i SSE2, że będą kontrolowane, razem lub oddzielnie.Jeśli chcesz mieć wpływ na obie jednostki, przejdź w adresach dwóch liczb całkowitych do x86_cw i sse2_cw.Jeśli chcesz mieć wpływ tylko na jedną jednostkę, przekaż adres dla tego parametru, ale przekaż 0 (NULL) dla innego.Jeśli dla jednego z tych parametrów jest przekazywane 0, funkcja nie ma wpływu na tę jednostkę zmiennoprzecinkową.Ta funkcja może być przydatna w sytuacjach, gdzie jednostka zmiennoprzecinkowa x 87 używa kodu i inna część kodu używa jednostki zmiennoprzecinkowej SSE2.Jeśli używasz __control87_2 w jednej części programu i ustawiasz różne wartości dla słów sterujących zmiennoprzecinkowych, a następnie korzystasz z _control87 lub _controlfp do dalszych manipulacji na słowach sterujących, wówczas _control87 i _controlfp może nie być w stanie zwrócić pojedynczego słowa sterującego do reprezentowania stanu obu jednostek zmiennoprzecinkowych.W takim przypadku te funkcje ustawiają znacznik EM_AMBIGUOUS w zwracanej wartości liczby całkowitej, aby wskazać, że istnieje niezgodność pomiędzy dwoma słowami sterującymi.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.
[!UWAGA]
__control87_2 nie jest obsługiwany na ARM lub architekturach x64.Jeśli używasz __control87_2 i kompilujesz program dla ARM lub architektur x64, kompilator generuje błąd.
Funkcje te są 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 maski 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 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 |
---|---|
_control87, _controlfp, _control87_2 |
<float.h> |
Aby uzyskać więcej informacji na temat zgodności, zobacz Zgodność.
Przykład
// crt_cntrl87.c
// processor: x86
// This program uses __control87_2 to output the x87 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_x87;
// Show original x87 control word and do calculation.
control_word_x87 = __control87_2(0, 0,
&control_word_x87, 0);
printf( "Original: 0x%.4x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Set precision to 24 bits and recalculate.
control_word_x87 = __control87_2(_PC_24, MCW_PC,
&control_word_x87, 0);
printf( "24-bit: 0x%.4x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Restore default precision-control bits and recalculate.
control_word_x87 = __control87_2( _CW_DEFAULT, MCW_PC,
&control_word_x87, 0 );
printf( "Default: 0x%.4x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Dane wyjściowe
Original: 0x0001
0.1 * 0.1 = 1.000000000000000e-002
24-bit: 0x0001
0.1 * 0.1 = 9.999999776482582e-003
Default: 0x0001
0.1 * 0.1 = 1.000000000000000e-002
Odpowiednik w programie .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