Udostępnij za pośrednictwem


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

Zobacz też

Informacje

Wsparcie zmiennoprzecinkowe

_clear87, _clearfp

_status87, _statusfp, _statusfp2