Sdílet prostřednictvím


_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( &current_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(&current_word, _DN_SAVE, _MCW_DN);   
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(&current_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

_clear87, _clearfp

_status87, _statusfp, _statusfp2

_control87, _controlfp, __control87_2