_controlfp_s
Obtém e define a palavra de controle de ponto flutuante.Esta é uma versão de _control87 _controlfp, __control87_2 com aprimoramentos de segurança conforme descrito em Aprimoramentos de segurança no CRT.
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
Parâmetros
currentControl
O valor de bit de palavras de controle corrente.newControl
Novo controle-palavra valores de bits.mask
Os novos bits de palavras de controle conjunto máscara.
Valor de retorno
Zero se for bem-sucedido ou um errno código de erro de valor.
Comentários
The _controlfp_s é uma versão independente de plataforma e mais segura do _control87, que obtém e define a palavra de controle de ponto flutuante no endereço de currentControl e newControl, respectivamente. Os bits nos valores indicam o estado do 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 encapsulamento de ponto flutuante.Um também pode mascarar ou unmask exceções de ponto flutuante usando _controlfp_s.
Se o valor de mask é igual a 0, _controlfp_sobté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_s é quase idêntico a _control87 funciona em plataformas Intel (x86) e é suportado pelo MIPS e alfa plataformas. Para garantir que o código de ponto flutuante é portátil MIPS ou alfa, use _controlfp_s. Se o objetivo for o x86 plataformas, use _control87 ou _controlfp_s.
A diferença entre _control87 e _controlfp_s é a maneira de que tratam essas duas funções DENORMAL valores. 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_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 novo controle valores ()newControl) 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_s 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. Ignored on x86
_controlfp_s afeta as palavras de controle para 87 x e o SSE2 se estiver presente. É possível que as palavras de dois controle estar divergente entre si (por causa de uma telefonar anterior a __control87_2, por exemplo); se há uma inconsistência entre as duas palavras, de controle_controlfp_s Define o EM_AMBIGUOUS sinalizar na currentControl. Este é um aviso de que a palavra controle retornado 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 arquitetura, alterando a precisão de ponto flutuante. Se a precisão controle msistema autônomok for usado nessa plataforma, o manipulador de parâmetro inválido é invocado, sistema autônomo descrito em Validação de parâmetro.
In Visual C++ 2005, _controlfp_s foi otimizado para um melhor desempenho em todas as arquiteturas de computador.
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 for permitida para continuar, esta função retorna EINVAL e conjuntos errno para EINVAL.
Esta função é preterida 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 |
---|---|
_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
Equivalente .NET estrutura
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.