Udostępnij za pośrednictwem


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

Zobacz też

Informacje

Wsparcie zmiennoprzecinkowe

_clear87, _clearfp

_status87, _statusfp, _statusfp2