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