Udostępnij za pośrednictwem


_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( &current_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(&current_word, _DN_SAVE, _MCW_DN);   
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(&current_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

_clear87, _clearfp

_status87, _statusfp, _statusfp2

_control87, _controlfp, __control87_2