_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