_control87, _controlfp, __control87_2

Získá a nastaví řídicí slovo s plovoucí desetinou čárkou. Bezpečnější verze _controlfp je k dispozici; viz _controlfp_s.

Syntaxe

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 ovládacího prvku.

mask
Maska pro nové bity ovládacích prvků, které se mají nastavit.

x86_cw
Vyplní se slovem ovládacího prvku pro jednotku s plovoucí desetinou čárkou x87. Předáním 0 (NULL) nastavíte pouze ovládací slovo SSE2.

sse2_cw
Určuje slovo pro jednotku s plovoucí desetinou čárkou SSE. Předáním 0 (NULL) nastavíte pouze ovládací slovo x87.

Vrácená hodnota

Bity _control87 ve vrácené hodnotě označují _controlfpstav ovládacího prvku s plovoucí desetinou čárkou. Úplnou definici bitů, které jsou vráceny _control87, viz FLOAT.H.

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

Poznámky

Funkce _control87 získá a nastaví řídicí slovo s plovoucí desetinou čárkou. Řídicí slovo s plovoucí desetinnou čárkou umožňuje programu změnit režim přesnosti, zaokrouhlení a nekonečna v závislosti na platformě. Můžete také použít _control87 k maskování nebo odmaskování výjimek s plovoucí desetinou čárkou. Pokud je hodnota mask rovna 0, _control87 získá řídicí slovo s plovoucí desetinou čárkou. Pokud mask je nenulová, nastaví se nová hodnota pro slovo ovládacího prvku: Pro libovolný bit, který je zapnutý (tedy rovno 1) v mask, odpovídající bit se new použije k aktualizaci ovládacího prvku. Jinými slovy, fpcntrl = ((fpcntrl & ~mask) | (new & mask)) kde fpcntrl je řídicí slovo s plovoucí desetinou čárkou.

Poznámka

Ve výchozím nastavení maskují knihovny za běhu všechny výjimky s plovoucí desetinou čárkou.

_controlfp je nezávislá na platformě, přenosná verze _control87 , která je téměř identická s _control87 funkcí. Pokud váš kód cílí na více než jednu platformu, použijte _controlfp nebo _controlfp_s. Rozdíl mezi _control87 hodnotami a _controlfp je v tom, jak nakládá s DENORMAL hodnotami. U platforem _control87 x86, x64, ARM a ARM64 můžete nastavit a vymazat masku DENORMAL OPERAND výjimky. _controlfp neupravuje masku DENORMAL OPERAND výjimky. 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) se zobrazují v tabulce Masky slov a hodnoty ovládacího prvku. Jako argumenty těchto funkcí použijte přenosné konstanty uvedené níže (_MCW_EM_EM_INVALIDa tak dále) místo explicitního zadávání šestnáctkových hodnot.

Platformy odvozené od Intel x86 podporují DENORMAL vstupní a výstupní hodnoty hardwaru. Chování x86 je zachování DENORMAL hodnot. Platformy ARM a ARM64 a platformy x64, které mají podporu SSE2, umožňují DENORMAL vyprázdnění operandů a výsledků nebo vynucení nuly. _control87 Funkce _controlfp poskytují masku pro změnu tohoto chování. Následující příklad ukazuje 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 a ARM64 se _control87_controlfp funkce vztahují na registr FPSCR. Na platformách x64 je ovlivněno pouze ovládací slovo SSE2 uložené v registru MXCSR. Na platformě _control87 x86 a _controlfp vliv na řídicí slova pro x87 i SSE2, pokud jsou k dispozici.

Funkce __control87_2 umožňuje, aby jednotky s plovoucí desetinou čárkou x87 i SSE2 byly řízeny společně nebo samostatně. Chcete-li ovlivnit obě jednotky, předejte adresy dvou celých čísel do x86_cw a sse2_cw. Pokud chcete mít vliv jenom na jednu jednotku, předejte adresu pro tento parametr, ale předejte 0 (NULL) pro druhou. Pokud pro některý z těchto parametrů předáte hodnotu 0, funkce nemá na tuto jednotku s plovoucí desetinou čárkou žádný vliv. Je užitečné, když část kódu používá jednotku s plovoucí desetinou čárkou x87 a další část používá jednotku s plovoucí desetinou čárkou SSE2.

Pokud používáte __control87_2 k nastavení různých hodnot pro řídicí slova s plovoucí desetinou čárkou, pak _control87 nebo _controlfp nemusí být možné vrátit jedno slovo ovládacího prvku, které představuje stav obou jednotek s plovoucí desetinou čárkou. V takovém případě tyto funkce nastaví EM_AMBIGUOUS příznak ve vrácené celočíselné hodnotě tak, aby označily nekonzistence mezi dvěma ovládacími slovy. Příznak EM_AMBIGUOUS je upozornění, že vrácené ovládací slovo nemusí představovat stav obou ovládacích slov s plovoucí desetinou čárkou přesně.

Na platformě ARM, ARM64 a x64 není změna režimu nekonečna nebo přesnost s plovoucí desetinnou čárkou podporována. Pokud se maska ovládacího prvku přesnosti používá na platformě x64, funkce vyvolá kontrolní výraz a vyvolá se neplatná obslužná rutina parametru, jak je popsáno v ověření parametru.

Poznámka

__control87_2 na platformách ARM, ARM64 nebo x64 se nepodporuje. Pokud používáte __control87_2 a kompilujete program pro platformy ARM, ARM64 nebo x64, kompilátor vygeneruje chybu.

Tyto funkce se ignorují při kompilaci /clr (Common Language Runtime Compilation). Modul CLR (Common Language Runtime) podporuje pouze výchozí přesnost s plovoucí desetinnou čárkou.

Řízení mask a hodnot slov

_MCW_EM Vymazáním masky nastavíte výjimku, která umožňuje výjimku hardwaru. Nastavení masky výjimku skryje. _EM_UNDERFLOW Pokud dojde k nějaké nebo _EM_OVERFLOW k chybě, není vyvolán žádná výjimka hardwaru, dokud se nespustí další instrukce s plovoucí desetinnou čárkou. Chcete-li vygenerovat výjimku hardwaru ihned po _EM_UNDERFLOW nebo _EM_OVERFLOW, zavolejte FWAIT instrukce MASM.

Maska Šestnáctkové hodnoty Konstanta Šestnáctkové hodnoty
_MCW_DN (Denormální řízení) 0x03000000 _DN_SAVE

_DN_FLUSH
0x00000000

0x01000000
_MCW_EM (Maska výjimky přerušení) 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čna)

(Nepodporuje se na platformách ARM nebo x64.)
0x00040000 _IC_AFFINE

_IC_PROJECTIVE
0x00040000

0x00000000
_MCW_RC (Ovládací prvek zaokrouhlování) 0x00000300 _RC_CHOP

_RC_UP

_RC_DOWN

_RC_NEAR
0x00000300

0x00000200

0x00000100

0x00000000
_MCW_PC (Ovládací prvek přesnosti)

(Nepodporuje se na platformách ARM nebo x64.)
0x00030000 _PC_24 (24 bitů)

_PC_53 (53 bitů)

_PC_64 (64 bitů)
0x00020000

0x00010000

0x00000000

Požadavky

Rutina Požadovaný hlavičkový soubor
_control87, _controlfp, _control87_2 <float.h>

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

Příklad

// crt_cntrl87.c
// processor: x86
// compile by using: cl /W4 /arch:IA32 crt_cntrl87.c
// 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 = 0;
    int result;

    // Show original x87 control word and do calculation.
    result = __control87_2(0, 0, &control_word_x87, 0 );
    printf( "Original: 0x%.8x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

    // Set precision to 24 bits and recalculate.
    result = __control87_2(_PC_24, MCW_PC, &control_word_x87, 0 );
    printf( "24-bit:   0x%.8x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

    // Restore default precision-control bits and recalculate.
    result = __control87_2( _CW_DEFAULT, MCW_PC, &control_word_x87, 0 );
    printf( "Default:  0x%.8x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Original: 0x0009001f
0.1 * 0.1 = 1.000000000000000e-02
24-bit:   0x000a001f
0.1 * 0.1 = 9.999999776482582e-03
Default:  0x0009001f
0.1 * 0.1 = 1.000000000000000e-02

Viz také

Podpora pro matematiku a plovoucí desetinou čárku
_clear87, _clearfp
_status87, _statusfp, _statusfp2
_controlfp_s