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.
Desabilita (on) ou habilita (off) otimizações que podem alterar testes de sinalizadores de ambiente de ponto flutuante e alterações de modo.
Sintaxe
#pragma fenv_access ({on|off})
Comentários
Por padrão, fenv_access é off. O compilador assume que seu código não acessa ou manipula o ambiente de ponto flutuante. Se o acesso ao ambiente não for necessário, o compilador pode fazer mais para otimizar seu código de ponto flutuante.
Habilite fenv_access se seu código testar sinalizadores de status de ponto flutuante, exceções ou definir sinalizadores de modo de controle. O compilador desabilita otimizações de ponto flutuante, para que seu código possa acessar o ambiente de ponto flutuante de forma consistente.
A opção de linha de comando /fp:strict habilita automaticamente fenv_access. Para obter mais informações sobre esse e outros comportamentos de ponto flutuante, consulte /fp (Especificar comportamento Floating-Point).
Há restrições sobre as maneiras de usar o fenv_accesspragma em combinação com outras configurações de ponto flutuante:
Não é possível ativar
fenv_accessa menos que a semântica precisa esteja ativada. A semântica precisa pode ser ativada pelofloat_controlpragmaou usando as opções/fp:preciseou/fp:strictcompilador. O compilador assume como padrão/fp:precisese nenhuma outra opção de linha de comando de ponto flutuante for especificada.Não é possível usar
float_controlpara desativar semânticas precisas quandofenv_access(on)é definida.
A diretiva fenv_access(on) desativa a geração de contrações de de ponto flutuanteinstruções de máquina que combinam operações de ponto flutuante.
fenv_access(off) restaura o comportamento anterior para contrações. Esse comportamento é novo no Visual Studio 2022. As versões anteriores do compilador podiam gerar contrações por padrão em fenv_access(on). Para obter mais informações sobre contrações de ponto flutuante, consulte /fp:contract.
Os tipos de otimizações que estão sujeitos a fenv_access são:
Eliminação global de subexpressões comuns
Movimento de código
Dobragem constante
Outras diretivas pragma de ponto flutuante incluem:
Exemplos
Este exemplo define fenv_access como on para definir o registro de controle de ponto flutuante para precisão de 24 bits:
// pragma_directive_fenv_access_x86.cpp
// compile with: /O2 /arch:IA32
// processor: x86
#include <stdio.h>
#include <float.h>
#include <errno.h>
#pragma fenv_access (on)
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=9.999999776482582e-03
Se você comentar #pragma fenv_access (on) do exemplo anterior, a saída será diferente. É porque o compilador faz avaliação em tempo de compilação, que não usa o modo de controle.
// pragma_directive_fenv_access_2.cpp
// compile with: /O2 /arch:IA32
#include <stdio.h>
#include <float.h>
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=1.000000000000000e-02