_control87, _controlfp, __control87_2
Získává a nastavuje word řízení s plovoucí desetinnou čárkou.Bezpečnější verze _controlfp je k dispozici; see _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é hodnoty ovládacího prvku word bit.mask
Nové bity řízení word nastavit masku.x86_cw
Vyplní ovládací prvek word pro x 87, plovoucí bod jednotky.Předejte 0 (NULL) nastavit pouze slovo SSE2 ovládacího prvku.sse2_cw
Ovládací prvek aplikace word SSE jednotky s plovoucí desetinnou čárkou.Předejte 0 (NULL) nastavit pouze word x 87 řízení.
Vrácená hodnota
Pro _control87 a _controlfp, bity hodnoty vrácené označují stav řízení s plovoucí desetinnou čárkou.Pro úplnou definici bitů vrácené _control87, viz FLOAT.H.
Pro __control87_2, je vrácena hodnota 1, oznamující úspěch.
Poznámky
_control87 Funkce získává a nastavuje word řízení s plovoucí desetinnou čárkou.Aplikace word s plovoucí desetinnou čárkou řízení umožňuje programu změnit přesnost, zaokrouhlení a režimy nekonečna v balíčku matematiku s plovoucí desetinnou čárkou.Můžete maskovat nebo Odmaskovat s plovoucí desetinnou čárkou výjimek pomocí _control87.Pokud hodnota pro mask je rovna 0, _control87 získá word řízení s plovoucí desetinnou čárkou.Pokud mask je nenulová, je nastavit novou hodnotu ovládacího prvku aplikace word: pro každý bit na (je rovno 1) v mask, odpovídající bit v new slouží k aktualizaci ovládacího prvku aplikace word.In other words, fpcntrl= ((fpcntrl& ~mask) | (new & mask)) kde fpcntrl je slovo řízení s plovoucí desetinnou čárkou.
[!POZNÁMKA]
Knihovny runtime masky ve výchozím nastavení všechny výjimky s plovoucí desetinnou čárkou.
_controlfp je nezávislý na platformě, přenosné verze _control87.Je téměř stejný jako _control87 pracovat na platformách Intel (x 86) a je podporován MIPS a ALFA platformy.Chcete-li zajistit přenosné MIPS nebo ALFA kódu s plovoucí desetinnou čárkou, použijte _controlfp.Pokud volíte x 86 pomocí platformy, _control87 nebo _controlfp.
Rozdíl mezi _control87 a _controlfp je způsob, jakým tyto dvě funkce považovat hodnoty DENORMAL.Pro platformy Intel (x 86) _control87 lze nastavit a zrušte výjimky maska DENORMAL OPERAND.Platformy ALPHA nepodporují tuto výjimku a _controlfp nezmění maska DENORMAL OPERAND výjimku.Následující 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é hodnoty.Pomocí přenosného konstanty uvedené níže (_MCW_EM, _EM_INVALID, a tak dále) jako argumenty těchto funkcí, nikoli dodávající šestnáctkové hodnoty explicitně.
Platformy ALPHA podporu DENORMAL vstupní a výstupní hodnoty v softwaru.Výchozí chování systému Windows NT na těchto platformách je vyprázdnění DENORMAL vstupní a výstupní hodnoty na nulu._controlfpposkytuje novou masku zachovat a vyprázdnění vstupní a výstupní hodnoty DENORMAL.
Platformy Intel (x 86) podporují DENORMAL vstupní a výstupní hodnoty v hardwaru.Chování je zachovat hodnoty DENORMAL._control87neposkytuje maska toto chování změnit.Následující příklad ukazuje tento rozdíl:
_controlfp(_DN_SAVE, _MCW_DN);
// Denormal values preserved by software on ALPHA. NOP on x86.
_controlfp(_DN_FLUSH, _MCW_DN);
// Denormal values flushed to zero by hardware on ALPHA and x86
// processors with SSE2 support. Ignored on other x86 platforms.
I _control87 a _controlfp vliv řízení slova x 87 a SSE2, pokud je k dispozici.Funkce __control87_2 umožňuje x 87 a SSE2 plovoucí bod jednotky řízení společně nebo samostatně.Pokud chcete ovlivnit obou jednotek, předejte adresy dvou celých čísel na x86_cw a sse2_cw.Pokud chcete ovlivnit jednu jednotku, předání parametru v adrese, ale v 0 (nula) průchod pro ostatní.Je-li pro jeden z těchto parametrů 0, funkce má vliv na plovoucí tento bod jednotky.Tato funkce může být užitečné v situacích, kde část kódu používá x 87, plovoucí bod jednotky a jiné části kódu jednotky SSE2 plovoucí bod.Používáte-li __control87_2 v jedné části programu nastavit různé hodnoty pro plovoucí bod slova ovládací prvek a potom pomocí _control87 nebo _controlfp dále pak manipulace s word ovládací _control87 a _controlfp pravděpodobně nelze vrátit jednoho ovládacího prvku word představující stav obou plovoucí bod jednotek.V takovém případě tato funkce nastavena EM_AMBIGUOUS příznak hodnoty vrácené celé číslo označující, že existuje nekonzistence mezi slovy dva ovládací.Toto upozornění word vrácené řízení může představovat není stav obou plovoucí bod je přesně řídit slova.
Na x64 architektura, změna plovoucí přesnost bodu není podporována.Pokud maska přesnost řízení pro tuto platformu, nepravdivých a parametr neplatný popisovač je vyvolána, jak je popsáno v Ověření parametrů.
[!POZNÁMKA]
__control87_2není podporována na x64 architektury.Používáte-li __control87_2 a kompilace programu x64 architektura kompilátor vygeneruje chybu.
Tyto funkce jsou již nepoužívá při kompilaci s /CLR (kompilace společné Language Runtime) nebo /clr:pure protože společný jazykový modul runtime podporuje pouze výchozí přesnost s plovoucí desetinnou čárkou.
Hexadecimální hodnoty
Pro _MCW_EM nastaví masku, zrušením masku výjimky, která umožňuje hardwaru výjimku; Maska nastavení skryje výjimku.Pokud _EM_UNDERFLOW nebo _EM_OVERFLOW dojde, žádný hardware je výjimka je proveden další operace s plovoucí desetinnou čárkou.Generovat hardwarové výjimky bezprostředně po _EM_UNDERFLOW nebo _EM_OVERFLOW, volání jazyk MASM FWAIT instrukce.
Maska |
Šestnáctkové hodnoty |
Konstanta |
Šestnáctkové hodnoty |
---|---|---|---|
_MCW_DN(Denormal control) |
0x03000000 |
_DN_SAVE _DN_FLUSH |
0x00000000 0x01000000 |
_MCW_EM(Přerušit výjimku maska) |
0x0008001F |
_EM_INVALID _EM_DENORMAL _EM_ZERODIVIDE _EM_OVERFLOW _EM_UNDERFLOW _EM_INEXACT |
0x00000010 0x00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC(Kontrola nekonečno) |
0x00040000 |
_IC_AFFINE _IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RC(Kontrola zaokrouhlení) |
0x00000300 |
_RC_CHOP _RC_UP _RC_DOWN _RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC(Přesnost řízení) |
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ě v tématu Compatibility v úvodu.
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 Použijte volání funkce standardní C, PInvoke. Další informace naleznete v tématu Příklady vyvolat platformu.