Sdílet prostřednictvím


_control87, _controlfp, __control87_2

Získá a nastaví slovo ovládacího prvku s plovoucí desetinnou čárkou.Bezpečnější verze _controlfp je k dispozici; viz _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
    Nové bitové hodnoty kontrolního slova.

  • mask
    Maska pro nové bity ovládacího slova, které se mají nastavit.

  • x86_cw
    Vyplněno řídicím slovem pro jednotku s plovoucí desetinnou čárkou x87.Předejte 0 (NULL), chcete-li nastavit pouze kontrolní slovo SSE2.

  • sse2_cw
    Řídicí slovo jednotky SSE s plovoucí desetinnou čárkou.Předejte 0 (NULL), chcete-li nastavit pouze kontrolní slovo x87.

Vrácená hodnota

Pro _control87 a _controlfp bity ve vrácené hodnotě označují stav ovládacího prvku s plovoucí desetinnou čárkou.Kompletní definici bitů, které jsou vráceny pomocí _control87, naleznete v FLOAT.H.

Pro __control87_2 je vrácená hodnota 1, což označuje úspěch.

Poznámky

Funkce _control87 získává a nastavuje řídicí slovo s plovoucí desetinnou čárkou.Řídicí slovo s plovoucí desetinnou čárkou umožňuje programu změnit přesnost, zaokrouhlení a režimy nekonečna matematickém balíčku s plovoucí desetinnou čárkou v závislosti na platformě.Můžete také použít _control87 k maskování nebo odmaskování výjimek s plovoucí desetinnou čárkou.Pokud hodnota pro mask se rovná 0, _control87 získá kontrolní slovo s plovoucí desetinnou čárkou.Pokud mask je nenulová, je nastavena nová hodnota pro řídicí slovo: pro všechny bity, v nichž se nachází (tzn. je rovno 1) v mask, odpovídající bit v new slouží k aktualizaci řídicího slova.Jinými slovy, fpcntrl = ((fpcntrl & ~mask) | (new & mask)), kde fpcntrl je řídicí slovo s plovoucí desetinnou čárkou.

[!POZNÁMKA]

Ve výchozím nastavení běhové knihovny maskují všechny výjimky s plovoucí desetinnou čárkou.

_controlfp je na platformě nezávislá, přenosná verze _control87.Je téměř shodná funkcí _control87 na platformách Intel (x86), x64a ARM.Pokud volíte platformy x86, x64, nebo ARM, použijte _control87 nebo _controlfp.

Rozdíl mezi _control87 a _controlfp je v tom, jak zachází s hodnotami DENORMAL.Pro Intel (x86), x64 a ARM platformy může _control87 nastavit a zrušit masku výjimka DENORMAL OPERAND._controlfp neupraví masku výjimky DENORMAL OPERAND.Tento příklad ukazuje rozdíl:

_control87( _EM_INVALID, _MCW_EM ); 
// DENORMAL is unmasked by this call
_controlfp( _EM_INVALID, _MCW_EM ); 
// DENORMAL exception mask remains unchanged

Možné hodnoty pro konstantu masky (mask) a nové hodnoty ovládacího prvku (new) jsou uvedeny v následující tabulce šestnáctkových hodnot.Použijte přenosné konstanty uvedené níže (_MCW_EM, _EM_INVALID a tak dále) jako argumenty pro tyto funkce místo poskytování šestnáctkových hodnot explicitně.

Platformy odvozené od platformy Intel (x86) podporují vstupní a výstupní hodnoty DENORMAL v hardwaru.Chování x86 je zachovat hodnoty DENORMAL.Platforma ARM platformy x64, které podporují SSE2, povolují operandy DENORMAL a zahození výsledků nebo jejich přepsání na nulu.Funkce _controlfp a _control87 poskytují masku ke změně tohoto chování.Následující příklad demonstruje použití této masky.

_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 platformách ARM se funkce _control87 a _controlfp týkají registru FPSCR.Na architekturách x64 je ovlivněno pouze kontrolní slovo SSE2, které je uloženo v registru MXCSR.Na platformách Intel (x86) _control87 a _controlfp ovlivňují řídicí slova pro x87 i SSE2, pokud jsou přítomna.Funkce __control87_2 umožňuje ovládání jednotek s plovoucí desetinnou čárkou x87 i SSE2 společně nebo samostatně.Pokud chcete ovlivnit obě jednotky, předejte adresy dvou celých čísel do x86_cw a sse2_cw.Pokud chcete ovlivnit pouze jednu jednotku, předejte adresu pro tento parametr, ale předejte 0 (NULL) pro ostatní.Je-li 0 předána pro jeden z těchto parametrů, funkce nemá žádný vliv na tuto jednotku s plovoucí desetinnou čárkou.Tato funkce může být užitečná v situacích, kdy část kódu používá jednotku s plovoucí desetinnou čárkou x87 a jiná část kódu používá jednotku s plovoucí desetinnou čárkou SSE2.Použijete-li __control87_2 v jedné části programu a nastavíte jiné hodnoty pro řídicí slova s plovoucí desetinnou čárkou a pak použijete _control87 nebo _controlfp k další manipulaci s řídicím slovem, pak _control87 a _controlfp nemusí být schopny vrátit jedno řídicí slovo představující stav obou jednotek s plovoucí desetinnou čárkou.V takovém případě tato funkce nastaví příznak EM_AMBIGUOUSve vrácené celočíselné hodnotě k označení, že existuje nekonzistence mezi dvěma řídicími slovy.Toto je upozornění, že vrácené řídicí slovo nemusí přesně reprezentovat stav obou řídicích slov s plovoucí desetinnou čárkou.

V architekturách ARM a x64 není podporována změna režimu nekonečno ani přesnost s plovoucí desetinnou čárkou.Pokud se maska ovládacího prvku přesnosti používá v platformě x64, funkce vyvolá kontrolní výraz a obslužnou rutinu neplatného parametru, jak je popsáno v Ověření parametru.

[!POZNÁMKA]

__control87_2 není podporován v ARM nebo architekturách x64.Použijete-li __control87_2 a zkompilujete program pro ARM nebo x64 architektury, kompilátor vygeneruje chybu.

Tyto funkce jsou ignorovány při kompilaci s /clr (Common Language Runtime) nebo /clr:pure, protože modul CLR podporuje pouze základní přesnost s plovoucí desetinnou čárkou.

Šestnáctkové hodnoty

Pro masku _MCW_EM zrušení masky nastaví výjimku, která povoluje výjimku hardwaru; nastavení masky skryje výjimku.Pokud dojde k _EM_UNDERFLOW nebo _EM_OVERFLOW, není vyvolána žádná výjimka hardwaru, dokud není proveden další pokyn s plovoucí desetinnou čárkou.Chcete-li vygenerovat hardwarovou výjimku ihned po _EM_UNDERFLOW nebo _EM_OVERFLOW, zavolejte instrukci MASM FWAIT.

Maska

Šestnáctková hodnota

Konstanta

Šestnáctková hodnota

_MCW_DN (ovládací prvek denormal)

0x03000000

_DN_SAVE

_DN_FLUSH

0x00000000

0x01000000

_MCW_EM (přerušit masku výjimky)

0x0008001F

_EM_INVALID

_EM_DENORMAL

_EM_ZERODIVIDE

_EM_OVERFLOW

_EM_UNDERFLOW

_EM_INEXACT

0x00000010

0x00080000

0x00000008

0x00000004

0x00000002

0x00000001

_MCW_IC (ovládací prvek Nekonečno)

(Není podporováno na platformách ARM ani x64.)

0x00040000

_IC_AFFINE

_IC_PROJECTIVE

0x00040000

0x00000000

_MCW_RC (Ovládací prvek Zaokrouhlení)

0x00000300

_RC_CHOP

_RC_UP

_RC_DOWN

_RC_NEAR

0x00000300

0x00000200

0x00000100

0x00000000

_MCW_PC (Ovládací prvek Přesnost)

(Není podporováno na platformách ARM ani x64.)

0x00030000

_PC_24 (24 bitů)

_PC_53 (53 bitů)

_PC_64 (64 bitů)

0x00020000

0x00010000

0x00000000

Požadavky

Rutina

Požadované záhlaví

_control87, _controlfp, _control87_2

<float.h>

Další informace o kompatibilitě naleznete v tématu Kompatibilita.

Příklad

// 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 );
}

Výsledek

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

Ekvivalent v rozhraní .NET Framework

Nelze použít. Pokud chcete volat standardní funkci jazyka C, použijte PInvoke. Další informace naleznete v tématu Příklady vyvolání platformy.

Viz také

Referenční dokumentace

Podpora plovoucí desetinné čárky

_clear87, _clearfp

_status87, _statusfp, _statusfp2

_controlfp_s