Udostępnij za pośrednictwem


_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

_clear87, _clearfp

_status87, _statusfp, _statusfp2

_controlfp_s