_controlfp_s
Získá a nastaví slovo ovládacího prvku s plovoucí desetinnou čárkou.Tato verze _control87, _controlfp, __control87_2 má rozšíření zabezpečení popsané v tématu Funkce zabezpečení v CRT.
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
Parametry
currentControl
Aktuální bitová hodnota kontrolního slova.newControl
Nové bitové hodnoty kontrolního slova.mask
Maska pro nové bity ovládacího slova, které se mají nastavit.
Vrácená hodnota
Nula v případě úspěchu; jinak kód chyby hodnoty errno.
Poznámky
Funkce _controlfp_s je nezávislá na platformě a bezpečnější verze _control87, která dostává řídicí slovo s plovoucí desetinnou čárkou do adresy, která je uložena v currentControl, a nastavuje ho pomocí newControl.Bity v hodnotách označují stav ovládacího prvku s plovoucí desetinnou čárkou.Řídicí stav 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 _controlfp_s k maskování nebo odmaskování výjimky s plovoucí desetinnou čárkou.
Pokud hodnota pro mask se rovná 0, _controlfp_s získá kontrolní slovo s plovoucí desetinnou čárkou a uloží získanou hodnotu v currentControl.
Pokud mask je nenulová, je nastavena nová hodnota pro řídicí slovo: pro všechny nastavené bity (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.V tomto scénáři je currentControl nastavena na hodnotu po dokončení změny; nejde o původní bitovou hodnotu kontrolního slova.
[!POZNÁMKA]
Ve výchozím nastavení běhové knihovny maskují všechny výjimky s plovoucí desetinnou čárkou.
_controlfp_s je téměř shodná funkcí _control87 na platformách Intel (x86), x64 a ARM.Pokud cílíte platformy x86, x64, nebo ARM, můžete použít _control87 nebo _controlfp_s.
Rozdíl mezi _control87 a _controlfp_s 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_s neupraví masku výjimky DENORMAL OPERAND.Tento příklad ukazuje rozdíl:
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call.
unsigned int current_word = 0;
_controlfp_s( ¤t_word, _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ý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_s, _controlfpa _control87 poskytují masku ke změně tohoto chování.Následující příklad demonstruje použití této masky:
unsigned int current_word = 0;
_controlfp_s(¤t_word, _DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(¤t_word, _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 _controlfp_s a týká 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) _controlfp_s ovlivňuje řídicí slova pro x87 i SSE2, pokud jsou přítomna.Je možné, aby dvě řídicí slova byla vzájemně nekompatibilní (například z důvodu předchozího volání __control87_2). Pokud existuje nekonzistence mezi dvěma řídicími slovy, _controlfp_s nastaví příznak EM_AMBIGUOUS v currentControl.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.
Pokud maska není nastavena správně, tato funkce generuje výjimku neplatného parametru, jak je popsáno v Ověření parametru.Pokud provádění může pokračovat, tato funkce vrátí EINVAL a nastaví errno na EINVAL.
Tato funkce je ignorována 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í nastaví výjimku, která povoluje výjimku hardwaru; nastavení 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í |
---|---|
_controlfp_s |
<float.h> |
Další informace o kompatibilitě naleznete v úvodu tématu Kompatibilita.
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í .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