Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Obtém e define a palavra de controle de ponto flutuante. Esta versão do , _control87_controlfp, tem aprimoramentos de__control87_2 segurança, conforme descrito em Recursos de segurança no CRT.
Sintaxe
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
Parâmetros
currentControl
O valor de bit de palavra de controle atual.
newControl
Novos valores de bit de palavra de controle.
mask
Máscara para novos bits de palavra de controle a serem definidos.
Valor de retorno
Zero se for bem-sucedido ou um código de erro de errno valor.
Observações
A _controlfp_s função é uma versão independente de plataforma e mais segura do , que obtém a palavra de _control87controle de ponto flutuante no endereço armazenado e currentControl a define usando newControl. Os bits nos valores indicam o estado de controle de ponto flutuante. O estado de controle de ponto flutuante permite que o programa altere os modos de precisão, arredondamento e infinito no pacote matemático de ponto flutuante, dependendo da plataforma. Você também pode usar _controlfp_s para mascarar ou desmascarar exceções de ponto flutuante.
Se o valor for mask igual a 0, _controlfp_s obterá a palavra de controle de ponto flutuante e armazenará o valor recuperado em currentControl.
Se mask for diferente de zero, um novo valor para a palavra de controle será definido: Para qualquer bit definido (ou seja, igual a 1) no mask, o bit correspondente em new é usado para atualizar a palavra de controle. Em outras palavras, fpcntrl = ((fpcntrl & ~mask) | (newControl & mask)) onde fpcntrl está a palavra de controle de ponto flutuante. Nesse cenário, é definido como o valor após a conclusão da alteração, currentControl não é o antigo valor de bit de palavra de controle.
Observação
Por padrão, as bibliotecas de tempo de execução mascaram todas as exceções de ponto flutuante.
_controlfp_s é quase idêntica à _control87 função nas plataformas Intel (x86), x64 e ARM. Se você estiver segmentando plataformas x86, x64 ou ARM, poderá usar _control87 ou _controlfp_s.
A diferença entre _control87 e _controlfp_s está na forma como tratam os valores anormais. Para plataformas Intel (x86), x64 e ARM, _control87 pode definir e limpar a máscara de DENORMAL OPERAND exceção.
_controlfp_s não modifica a DENORMAL OPERAND máscara de exceção. Este exemplo demonstra a diferença:
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call.
unsigned int current_word = 0;
_controlfp_s( ¤t_word, _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged.
Os valores possíveis para a constante de máscara (mask) e novos valores de controle (newControl) são mostrados na tabela Valores hexadecimais a seguir. Use as constantes portáteis listadas abaixo (_MCW_EM, _EM_INVALID, e assim por diante) como argumentos para essas funções, em vez de fornecer os valores hexadecimais explicitamente.
As plataformas derivadas da Intel (x86) suportam os valores de DENORMAL entrada e saída no hardware. O comportamento x86 é preservar DENORMAL valores. A plataforma ARM e as plataformas x64 que têm suporte a SSE2 permitem que DENORMAL operandos e resultados sejam liberados ou forçados a zero. As _controlfp_sfunções , _controlfpe _control87 fornecem uma máscara para alterar esse comportamento. O exemplo a seguir demonstra o uso dessa máscara:
unsigned int current_word = 0;
_controlfp_s(¤t_word, _DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(¤t_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.
Essa função é ignorada quando você usa /clr (Common Language Runtime Compilation) para compilar porque o Common Language Runtime (CLR) suporta apenas a precisão de ponto flutuante padrão.
Em x64, apenas a palavra de controle SSE2 armazenada no registro MXCSR é afetada. Não há suporte para alterar o modo infinito ou a precisão de ponto flutuante. Se a máscara de controle de precisão for usada na plataforma x64, a função gerará uma asserção e o manipulador de parâmetros inválido será invocado conforme descrito em Validação de parâmetro.
Em x86, _controlfp_s afeta as palavras de controle para x87 e SSE2, se presentes. É possível que as duas palavras de controle sejam inconsistentes uma com a outra (por causa de uma chamada anterior para __control87_2, por exemplo); se houver uma inconsistência entre as duas palavras de controle, _controlfp_s define a EM_AMBIGUOUS bandeira em currentControl. É um aviso de que a palavra de controle retornada pode não representar o estado de ambas as palavras de controle de ponto flutuante com precisão.
Se a máscara não estiver definida corretamente, essa função gerará uma exceção de parâmetro inválida, conforme descrito em Validação de parâmetro. Se a execução for permitida para continuar, essa função retornará EINVAL e será definida errno como EINVAL.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, consulte Estado global na CRT.
Plataformas de braço
- Não há suporte para alterar o modo infinito ou a precisão de ponto flutuante. Se a máscara de controle de precisão for usada na plataforma x64, a função gerará uma asserção e o manipulador de parâmetros inválido será invocado, conforme descrito em Validação de parâmetros.
- No ARM32 (descontinuado), o Windows não suporta exceções de FP.
- No ARM64, desmascarar o todo
_MCW_EMou quaisquer bits dele (_EM_INEXACT,_EM_UNDERFLOW,_EM_OVERFLOW,_EM_ZERODIVIDE, e_EM_INVALID) altera corretamente o registro FPCR. Exceções de ponto flutuante geradas por funções matemáticas padrão, como operação inválida destd::acos, estão isentas desse comportamento e podem ser ignoradas ou geradas corretamente, dependendo do registro FPCR. Para obter mais informações, consulte Visão geral das convenções ARM32 ABI. - No ARM64EC, o Windows captura exceções de ponto flutuante do processador e as desabilita no registro FPCR. Isso garante um comportamento consistente em diferentes variantes de processador.
Mascarar constantes e valores
Para a _MCW_EM máscara, limpá-la define a exceção, o que permite a exceção de hardware, definindo-a oculta a exceção. Se ocorrer um _EM_UNDERFLOW ou _EM_OVERFLOW , nenhuma exceção de hardware será lançada até que a próxima instrução de ponto flutuante seja executada. Para gerar uma exceção de hardware imediatamente após _EM_UNDERFLOW ou _EM_OVERFLOW, chame a FWAIT MASM instrução.
| Máscara | Valor hexadecimal | Constante | Valor hexadecimal |
|---|---|---|---|
_MCW_DN (Controlo anormal) |
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 infinito)(Não suportado em plataformas ARM ou x64.) |
0x00040000 | _IC_AFFINE_IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RC (Controlo de arredondamento) |
0x00000300 | _RC_CHOP_RC_UP_RC_DOWN_RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC (Controlo de precisão)(Não suportado em plataformas ARM ou x64.) |
0x00030000 |
_PC_24 (24 bits)_PC_53 (53 bits)_PC_64 (64 bits) |
0x00020000 0x00010000 0x00000000 |
Requerimentos
| Rotina | Cabeçalho obrigatório |
|---|---|
_controlfp_s |
<float.h> |
Para obter mais informações sobre compatibilidade, consulte Compatibilidade.
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 );
}
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
Ver também
Suporte matemático e de ponto flutuante
_clear87, _clearfp
_status87, _statusfp, _statusfp2
_control87, _controlfp, __control87_2