Sdílet prostřednictvím


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

Viz také

Referenční dokumentace

Podpora s plovoucí desetinnou čárkou

_clear87 _clearfp

_status87, _statusfp, _statusfp2