_controlfp_s
Získává a nastavuje word řízení s plovoucí desetinnou čárkou.Toto je verze _control87, _controlfp, __control87_2 s vylepšení zabezpečení popsaným v Funkce zabezpečení v CRT.
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
Parametry
currentControl
Aktuální hodnota ovládacího prvku word bit.newControl
Nové hodnoty ovládacího prvku word bit.mask
Nové bity řízení word nastavit masku.
Vrácená hodnota
Nula, pokud je úspěšná nebo aplikaci errno hodnotu kódu chyby.
Poznámky
_controlfp_s Je nezávislý na platformě a bezpečnější verzí _control87, který získá a nastaví aplikace word s plovoucí desetinnou čárkou řízení na adresu currentControl a newControl, resp..Bity hodnoty označují stav řízení s plovoucí desetinnou čárkou.Stát 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.Jeden můžete maskovat nebo Odmaskovat s plovoucí desetinnou čárkou výjimek pomocí _controlfp_s.
Pokud hodnota pro mask je rovna 0, _controlfp_s získá word řízení s plovoucí desetinnou čárkou a ukládá získanou hodnotu v currentControl.
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. V tomto případě currentControl je nastavena na hodnotu po dokončení změny; původní hodnota ovládacího prvku word bit není.
[!POZNÁMKA]
Knihovny runtime masky ve výchozím nastavení všechny výjimky s plovoucí desetinnou čárkou.
_controlfp_sje 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_s.Pokud volíte x 86 pomocí platformy, _control87 nebo _controlfp_s.
Rozdíl mezi _control87 a _controlfp_s způsobem považovat tyto dvě funkce DENORMAL hodnoty.Pro platformy Intel (x 86) _control87 lze nastavit a zrušte výjimky maska DENORMAL OPERAND.Platformy ALPHA nepodporují tuto výjimku a _controlfp_s 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 (newControl) 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._controlfp_sposkytuje 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. Ignored on x86
_controlfp_sovlivňuje ovládací slova x 87 a SSE2, pokud je k dispozici.Je možné, že dva ovládací slova vzájemně neslučitelné (z důvodu předchozí volání k __control87_2, například); Pokud existuje nekonzistence mezi slovy dva ovládací _controlfp_s nastaví EM_AMBIGUOUS příznak v currentControl.To je upozornění, že slovo vrácené řízení může nepředstavují stavu obě slova s plovoucí desetinnou čárkou řízení přesně.
Na x64 není podporována architektura, Změna přesnosti s plovoucí desetinnou čárkou.Pokud maska přesnost řízení pro tuto platformu, je vyvolána neplatný parametr popisovače, jak je popsáno v Ověření parametrů.
Pokud maska není správně nastaven, tato funkce generuje výjimku neplatného parametru popsaným v Ověření parametrů.Pokud je povoleno spuštění pokračovat, vrátí funkce hodnotu EINVAL a errno na EINVAL.
Tato funkce se 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í |
---|---|
_controlfp_s |
<float.h> |
Další informace o kompatibilitě v tématu Compatibility v úvodu.
Příklad
// crt_contrlfp_s.c
// processor: x86
// This program uses _controlfp_s to output the FP 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;
int err;
// Show original FP control word and do calculation.
err = _controlfp_s(&control_word, 0, 0);
if ( err ) /* handle error here */;
printf( "Original: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Set precision to 24 bits and recalculate.
err = _controlfp_s(&control_word, _PC_24, MCW_PC);
if ( err ) /* handle error here */;
printf( "24-bit: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Restore default precision-control bits and recalculate.
err = _controlfp_s(&control_word, _CW_DEFAULT, MCW_PC);
if ( err ) /* handle error here */;
printf( "Default: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Výsledek
Original: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
24-bit: 0xa001f
0.1 * 0.1 = 9.999999776482582e-003
Default: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
Ekvivalent rozhraní.
Nelze použítPoužijte volání funkce standardní C, PInvoke.Další informace naleznete v tématu Příklady vyvolat platformu.