Sdílet prostřednictvím


_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.

Viz také

Referenční dokumentace

Podpora s plovoucí desetinnou čárkou

_clear87 _clearfp

_status87, _statusfp, _statusfp2