Partilhar via


fenv_access pragma

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_access a menos que a semântica precisa esteja ativada. A semântica precisa pode ser ativada pelo float_controlpragmaou usando as opções /fp:precise ou /fp:strict compilador. O compilador assume como padrão /fp:precise se nenhuma outra opção de linha de comando de ponto flutuante for especificada.

  • Não é possível usar float_control para desativar semânticas precisas quando fenv_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(&currentControl, _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(&currentControl, _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

Ver também

diretivas Pragma e as palavras-chave __pragma e _Pragma