Compartilhar via


_control87 _controlfp, __control87_2

Obtém e define a palavra de controle de ponto flutuante.Uma versão mais segura de _controlfp está disponível; consulte _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
);

Parâmetros

  • new
    Novo controle-palavra valores de bits.

  • mask
    Os novos bits de palavras de controle conjunto máscara.

  • x86_cw
    Preenchido com a palavra de controle para o 87 x, unidade de ponto flutuante.Passe em 0 (NULL) para conjunto somente a palavra de controle SSE2.

  • sse2_cw
    Palavra de controle para a unidade de ponto flutuante do SSE.Passe em 0 (NULL) para conjunto somente a palavra de controle 87 x.

Valor de retorno

For _control87 e _controlfp, os bits no valor retornado indicam o estado do controle de ponto flutuante. Para obter uma definição completa dos bits retornado por _control87, consulte FLOAT.H.

For __control87_2, o valor retornado é 1, indicando sucesso.

Comentários

The _control87 função obtém e define a palavra de controle de ponto flutuante. A palavra de ponto flutuante de controle permite que o programa alterar a precisão, arredondamento e modos de infinito no encapsulamento de ponto flutuante.Também pode mascarar ou unmask exceções de ponto flutuante usando _control87. Se o valor de mask é igual a 0, _control87 obtém a palavra de controle de ponto flutuante. If mask é diferente de zero, um novo valor para a palavra de controle é conjunto: Para qualquer bit está ligado (igual a 1) no mask, o bit correspondente em new é usado para atualizar a palavra de controle. In other words, fpcntrl = ((fpcntrl & ~mask) | (new & mask)) where fpcntrl is the floating-point control word.

Observação:

As bibliotecas de time de execução máscara todas as exceções de ponto flutuante por padrão.

_controlfp é uma versão independente de plataforma e portáteis do _control87. É quase idêntica a _control87 funciona em plataformas Intel (x86) e é suportado pelo MIPS e alfa plataformas. Para garantir que seu código de ponto flutuante seja portátil, MIPS ou alfa, use _controlfp. Se o objetivo for o x86 plataformas, use _control87 ou _controlfp.

A diferença entre _control87 e _controlfp é a maneira que DENORMAL valores de tratar essas duas funções. Para plataformas Intel (x86), _control87 Defina e desmarcar a máscara de exceção OPERANDO DESNORMALIZADO. Plataformas alfa não oferecem suporte a essa exceção e _controlfp não modifica a máscara de exceção OPERANDO DESNORMALIZADO. O exemplo a seguir demonstra a diferença:

_control87( _EM_INVALID, _MCW_EM ); 
// DENORMAL is unmasked by this call
_controlfp( _EM_INVALID, _MCW_EM ); 
// DENORMAL exception mask remains unchanged

Os valores possíveis para a constante de máscara (mask) e novo controle valores ()new) são mostrado na tabela a seguir hexadecimal de valores. Usar sistema autônomo constantes portáteis listadas abaixo (_MCW_EM, _EM_INVALIDe assim por diante) sistema autônomo argumentos para essas funções, em vez de fornecer o hexadecimal valores explicitamente.

ALFA plataformas oferecem suporte à entrada DENORMAL e valores no software de saída.O comportamento padrão do Windows NT nessas plataformas é liberar o DENORMAL de entrada e saída valores como zero._controlfp Fornece uma nova máscara de preservar e liberar a entrada e saída DENORMAL valores.

Plataformas Intel (x86) oferecem suporte à entrada DENORMAL e valores no hardware de saída.O comportamento é preservar valores DENORMAL._control87 não fornece uma máscara para alterar esse comportamento. O exemplo a seguir demonstra essa diferença:

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

Ambos os _control87 e _controlfp afetam as palavras de controle para 87 x e o SSE2 se estiver presente. A função __control87_2 permite que tanto 87 x SSE2 ponto flutuante unidades a ser controlado juntos ou separadamente. Se você deseja afetar as duas unidades, passe nos endereços dos dois inteiros para x86_cw e sse2_cw. Se você apenas deseja afetar uma unidade, passe em um endereço para esse parâmetro mas passar em 0 (nulo) para o Outros.Se 0 é passado para um desses parâmetros, a função não tem efeito sobre isso ponto flutuante unidade.Essa funcionalidade pode ser útil em situações em que parte do código usa o 87 x, unidade de ponto flutuante e outra parte do código usa a unidade de ponto flutuante SSE2.Se você usar __control87_2 em uma parte de um programa e conjunto valores diferentes do ponto flutuante de palavras de controle e, em seguida, utilizar _control87 ou _controlfp para manipular ainda mais a palavra de controle, em seguida _control87 e _controlfp Talvez não consiga retornar uma palavra de controle único para representar o estado de ambas as flutuantes aponte unidades. Nesse caso, essas funções conjunto o EM_AMBIGUOUS sinalizar no valor de número inteiro retornado para indicar que há é uma inconsistência entre as palavras de controle de dois. Este é um aviso a palavra controle retornado pode não representar o estado de ponto flutuante de ambas as palavras de controle com precisão.

Sobre o x64 arquitetura, alterando o flutuante aponte precisão não é suportado. Se a precisão controle msistema autônomok for usado nessa plataforma, um sertion sistema autônomo e o manipulador de parâmetro inválido é invocado, sistema autônomo descrito em Validação de parâmetro.

In Visual C++ 2005, _controlfp foi otimizado para um melhor desempenho em todas as arquiteturas de computador.

Essas funções são preterido durante a compilação de o CLR (ComComummon Idioma Tempo de execução ComComumpilation) ou /clr:pure como o common linguagem tempo de execução só oferece suporte a precisão de ponto flutuante padrão.

Valores hexadecimais

O _MCW_EM máscara, limpando a máscara define a exceção, que permite que a exceção de hardware; Configurando a máscara oculta a exceção. Observe que, se um _EM_UNDERFLOW ou _EM_OVERFLOW ocorre, nenhuma exceção de hardware é lançada até que a próxima instrução de ponto flutuante é executada. Para gerar uma exceção de hardware imediatamente após _EM_UNDERFLOW ou _EM_OVERFLOW, chamar a instrução FWAIT MASM.

Máscara

Valor hex

Constante

Valor hex

_MCW_DN (Controle desnormalizado)

0x03000000

_DN_SAVE

_DN_FLUSH

0 x 00000000

0x01000000

_MCW_EM (Exceção de máscara de interrupção)

0x0008001F

_EM_INVALID

_EM_DENORMAL

_EM_ZERODIVIDE

_EM_OVERFLOW

_EM_UNDERFLOW

_EM_INEXACT

0 x 00000010

0 x 00080000

0 x 00000008

0 x 00000004

0 x 00000002

0 x 00000001

_MCW_IC (Controle infinito)

0 x 00040000

_IC_AFFINE

_IC_PROJECTIVE

0 x 00040000

0 x 00000000

_MCW_RC (Controle de arredondamento)

0x00000300

_RC_CHOP

_RC_UP

_RC_DOWN

_RC_NEAR

0x00000300

0x00000200

0 x 00000100

0 x 00000000

_MCW_PC (Controle de precisão)

0x00030000

_PC_24 (24 bits)

_PC_53 (53 bits)

_PC_64 (64 bits)

0x00020000

0 x 00010000

0 x 00000000

Requisitos

Rotina

Cabeçalho necessário

_control87, _controlfp, _control87_2

<float.h>

Para obter mais informações de compatibilidade, consulte Compatibilidade na introdução.

Exemplo

// 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 );
}

Saída

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

Equivalente do NET Framework

Não aplicável. Para telefonar a função C padrão, use PInvoke. Para obter mais informações, consulte Exemplos de invocação de plataforma.

Consulte também

Referência

Suporte de ponto flutuante

_clear87, _clearfp

_status87 _statusfp, _statusfp2