_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í _controlfp
stav 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_INVALID
a 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