_control87, _controlfp, __control87_2
Pobiera i ustawia word kontroli zmiennoprzecinkowych.Najbezpieczniejsza wersja _controlfp jest dostępna; see _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 word kontroli.mask
Maska dla nowych bitów word kontroli ustawić.x86_cw
Wypełniane word kontroli 87 x pkt jednostki pływające.Przenieść 0 (NULL) Aby ustawić wyraz kontroli SSE2.sse2_cw
Koprocesor SSE sterujące programu word.Przenieść 0 (NULL) Aby ustawić wyraz kontroli 87 x.
Wartość zwracana
Dla _control87 i _controlfp, bity wartości zwracane wskazują stan sterowania zmiennoprzecinkowych.Kompletne definicji usługi bits, zwrócony przez _control87, zobacz PŁYWAKA.H.
Dla __control87_2, zwracana jest wartość 1, wskazująca sukcesu.
Uwagi
_control87 Funkcja pobiera i ustawia word kontroli zmiennoprzecinkowych.Word zmiennoprzecinkowych kontroli umożliwia program do zmiany precyzji, zaokrąglania oraz tryby nieskończoności w pakiecie math zmiennoprzecinkowych.Można także maskę lub Usuń maskę wyjątków zmiennoprzecinkowe przy użyciu _control87.Jeśli wartość dla mask jest równa 0, _control87 pobiera word kontroli zmiennoprzecinkowych.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.
[!UWAGA]
Biblioteki uruchomieniowej maski wszystkie wyjątki zmiennoprzecinkowych domyślnie.
_controlfp jest to niezależne od platformy, przenośne wersja _control87.Jest niemal identyczny jak _control87 działać na platformach firmy Intel (x 86) i jest obsługiwany przez MCI i ALFA platformy.W celu zapewnienia, że kod zmiennoprzecinkowych jest przenośny MIPS lub ALFA, należy użyć _controlfp.Jeśli są wyróżniane x 86 platformach, należy użyć _control87 lub _controlfp.
Różnica między _control87 i _controlfp jest sposobem te dwie funkcje traktował wartości ZDENORMOWANA.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 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 (new) są pokazane w poniższej tabeli przedstawiono wartości szesnastkowe.Używanie stałych przenośne, wymienionych poniżej (_MCW_EM, _EM_INVALID, itd) 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._controlfpudostę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 and x86
// processors with SSE2 support. Ignored on other x86 platforms.
Obie _control87 i _controlfp wpływają na wyrazy kontroli zarówno x 87 i SSE2, jeśli jest obecna.Funkcja __control87_2 umożliwia zarówno x 87 i SSE2 ruchomy punkt jednostki kontrolowane, razem lub oddzielnie.Jeśli chcesz wpływają na obie jednostki przechodzą w adresach dwóch liczb całkowitych, aby x86_cw i sse2_cw.Jeśli chce wpłynąć na jedną jednostkę, przekazać adresu dla tego parametru, ale przekazać 0 (NULL) dla innych.Jeśli 0 jest przekazywana z jednej z tych parametrów, funkcja nie ma wpływu na tego przestawne pkt jednostki.Ta funkcja może być przydatna w sytuacji, kiedy część kod używa 87 x pkt jednostki pływające i pływające jednostki punkt SSE2 korzysta z innej części kodu.Jeśli korzystasz z __control87_2 w jednej części programu i ustawić inne wartości zmiennoprzecinkowych kontroli wyrazy, a następnie użyj _control87 lub _controlfp do dalszego następnie manipulować word kontroli _control87 i _controlfp może być niemożliwe do zwracania word pojedynczego formantu do reprezentowania Państwa zarówno przestawne pkt jednostek.W takim przypadku ustawić te funkcje EM_AMBIGUOUS flagi wartość zwrócona liczba całkowita, aby wskazać, że jest niespójność między wyrazami dwóch kontroli.Jest to ostrzeżenie, że word zwracane kontroli nie może reprezentować Państwo zarówno zmiennoprzecinkowych dokładnie kontrolować wyrazy.
Na x64 architektury, zmiana unoszące się na dokładność punkt nie jest obsługiwany.Jeśli na tej platformie używana jest maska kontroli dokładności, potwierdzenia i obsługi nieprawidłowy parametr jest wywoływany, zgodnie z opisem w Sprawdzanie poprawności parametru.
[!UWAGA]
__control87_2nie jest obsługiwana na x64 architektury.Jeśli korzystasz z __control87_2 i skompiluj program dla x64 architektury, kompilator generuje błąd.
Funkcje te są przestarzałe 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 |
---|---|
_control87, _controlfp, _control87_2 |
<float.h> |
Informacji dotyczących zgodności, zobacz zgodności we wprowadzeniu.
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ć standardowych funkcji C, należy użyć PInvoke. Aby uzyskać więcej informacji, zobacz Przykłady wywołać platformy.