Share via


_controlfp_s

Obtém e define a palavra de controle de ponto flutuante.Esta é uma versão do _control87, _controlfp, __control87_2 com aprimoramentos de segurança, conforme descrito em Recursos de segurança no CRT.

errno_t _controlfp_s(
    unsigned int *currentControl,
    unsigned int newControl,
    unsigned int mask
);

Parâmetros

  • currentControl
    O valor atual de bits de palavra de controle.

  • newControl
    Novos valores de bit da palavra de controle.

  • mask
    Máscara de bits de nova palavra de controle definir.

Valor de retorno

Zero se for bem sucedida ou um errno código de erro de valor.

Comentários

O _controlfp_s é uma versão mais segura e independentes de plataforma do _control87, que obtém e define a palavra de controle de ponto flutuante para o endereço do currentControl e newControl, respectivamente.Os bits nos valores indicam o estado de controle de ponto flutuante.O estado do controle de ponto flutuante permite que o programa alterar a precisão, arredondamento e modos de infinito no pacote de matemática de ponto flutuante.Também uma máscara ou unmask exceções de ponto flutuante usando _controlfp_s.

Se o valor de mask é igual a 0, _controlfp_s obtém a palavra de controle de ponto flutuante e armazena o valor recuperado no currentControl.

Se mask é diferente de zero, um novo valor para a palavra do controle é definido: para qualquer bit que em (igual a 1) mask, o bit correspondente em new é usado para atualizar a palavra de controle.In other words, fpcntrl= ((fpcntrl& ~mask) | (new & mask)) onde fpcntrl é a palavra de controle de ponto flutuante.  Nesse cenário, currentControl é definida como o valor após a alteração ser concluída; não é o valor de bit de controle-word antigo.

ObservaçãoObservação

As bibliotecas de tempo de execução mask todas as exceções de ponto flutuante por padrão.

_controlfp_sé quase idêntico do _control87 funcione em plataformas Intel (x86) e é suportado pelo MIPS e ALPHA plataformas.Para garantir que o código de ponto flutuante é portátil, MIPS ou ALPHA, use _controlfp_s.Se você estiver direcionando x86 plataformas, use _control87 ou _controlfp_s.

A diferença entre _control87 e _controlfp_s é a maneira de tratam a essas duas funções DENORMAL valores.Para plataformas Intel (x86), _control87 pode definir e limpar a máscara de exceção OPERANDO DESNORMALIZADO.ALFA plataformas não suportam essa exceção, e _controlfp_s 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 os novos valores de controle (newControl) são mostrados na tabela a seguir de valores hexadecimais.Use as constantes portátil listadas abaixo (_MCW_EM, _EM_INVALIDe assim por diante) como argumentos para essas funções, em vez de fornecer o hexadecimal valores explicitamente.

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

Plataformas Intel (x86) oferecem suporte a entrada de denormal e saída de valores no hardware.O comportamento é preservar os valores DENORMAL._control87nã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. Ignored on x86

_controlfp_safeta as palavras de controle para o 87 x e o SSE2, se presente.É possível que as palavras de controle seja inconsistente entre si (por causa de uma chamada anterior a __control87_2, por exemplo); Se houver uma inconsistência entre as palavras de controle de dois _controlfp_s define o EM_AMBIGUOUS sinalizador na currentControl.Este é um aviso de que a palavra de controle retornadas pode não representar o estado de ambas as palavras de controle de ponto flutuante com precisão.

Sobre o x64 não há suporte para a arquitetura, alterando a precisão de ponto flutuante.Se a máscara de controle de precisão é usada nessa plataforma, o manipulador de parâmetro inválido é invocado, conforme descrito em Validação de parâmetro.

Se a máscara não está definida corretamente, esta função gera uma exceção de parâmetro inválido, conforme descrito em Validação de parâmetro.Se a execução terá permissão para continuar, esta função retorna EINVAL e define errno para EINVAL.

Esta função é preterida quando compilando com /CLR (common Language Runtime Compilation) ou /clr:pure como o common language runtime oferece suporte apenas a precisão de ponto flutuante do padrão.

Valores hexadecimais

Para o _MCW_EM a máscara, limpando a máscara define a exceção, 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 a _EM_UNDERFLOW ou _EM_OVERFLOW, chamar a instrução FWAIT MASM.

Máscara

Valor hex

Constante

Valor hex

_MCW_DN(Desnormalizado de controle)

0x03000000

_DN_SAVE

_DN_FLUSH

0x00000000

0x01000000

_MCW_EM(Máscara de exceção de interrupção)

0x0008001F

_EM_INVALID

_EM_DENORMAL

_EM_ZERODIVIDE

_EM_OVERFLOW

_EM_UNDERFLOW

_EM_INEXACT

0x00000010

0x00080000

0x00000008

0x00000004

0x00000002

0x00000001

_MCW_IC(Controle de infinito)

0x00040000

_IC_AFFINE

_IC_PROJECTIVE

0x00040000

0x00000000

_MCW_RC(Controle de arredondamento)

0x00000300

_RC_CHOP

_RC_UP

_RC_DOWN

_RC_NEAR

0x00000300

0x00000200

0x00000100

0x00000000

_MCW_PC(Controle de precisão)

0x00030000

_PC_24(24 bits)

_PC_53(53 bits)

_PC_64(64 bits)

0x00020000

0x00010000

0x00000000

Requisitos

Rotina

Cabeçalho necessário

_controlfp_s

<float.h>

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

Exemplo

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

Saída

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

NET Framework equivalente

Não aplicável.Para chamar 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