FENV(3) | Manual do Programador do Linux | FENV(3) |
NOME¶
feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag, fetestexcept, fegetenv, fegetround, feholdexcept, fesetround, fesetenv, feupdateenv, feenableexcept, fedisableexcept, fegetexcept - floating-point rounding and exception handling
SINOPSE¶
#include <fenv.h>
int feclearexcept(int excepts); int fegetexceptflag(fexcept_t *flagp, int excepts); int feraiseexcept(int excepts); int fesetexceptflag(const fexcept_t *flagp, int excepts); int fetestexcept(int excepts);
int fegetround(void); int fesetround(int rounding_mode);
int fegetenv(fenv_t *envp); int feholdexcept(fenv_t *envp); int fesetenv(const fenv_t *envp); int feupdateenv(const fenv_t *envp);
Vincule com -lm.
DESCRIÇÃO¶
Estas onze funções foram definidas no C99, e descrevem o tratamento de arredondamento e exceções de ponto flutuante (estouro de representação, divisão por zero, etc.).
Exceções¶
A exceção divide-by-zero ocorre quando uma operação sobre números finitos produz infinito como resposta exata.
A exceção overflow ocorre quando um resultado tem de ser representado como um número de ponto flutuante, mas tem valor absoluto (muito) maior que o maior número de ponto flutuante (finito) que é representável.
A exceção underflow ocorre quando um resultado tem de ser representado como um número de ponto flutuante, mas tem valor absoluto menor que o menor número de ponto flutuante positivo normalizado (e perderia muita precisão se representado como um número denormalizado).
A exceção inexact ocorre quando o resultado arredondado de uma operação não é igual ao resultado de precisão infinita. Ela pode ocorrer quando quer que overflow ou underflow ocorram.
A exceção invalid ocorre quando não há resultado bem definido para uma operação, como para 0/0 ou infinito - infinito ou sqrt(-1).
Tratamento de Exceções¶
Exceções são representadas de duas formas: como um único bit (exceção presente/ausente), e esses bits correspondem em alguma forma definida pela implementação com posições de bit em um inteiro, e também como uma estrutura opaca que pode conter mais informação sobre a exceção (talvez o endereço de código onde ela ocorreu).
Cada uma das macros FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW é definida quando a implementação suporta tratamento da exceção correspondente, e, se sim, então define o(s) bit(s) correspondente(s), de forma que se possa chamar funções de tratamento de exceções, por exemplo, usando o argumento inteiro FE_OVERFLOW|FE_UNDERFLOW. Outras exceções podem ser suportadas. A macro FE_ALL_EXCEPT é o OR bit a bit de todos os bits correspondendo a exceções suportadas.
A função feclearexcept() desabilita as exceções suportadas representadas pelos bits no seu argumento.
A função fegetexceptflag() armazena uma representação do estado dos indicadores de exceção representados pelo argumento excepts no objeto opaco *flagp.
A função feraiseexcept() dispara as exceções suportadas representadas pelos bits em excepts.
A função fesetexceptflag() define o estado completo para as exceções representadas por excepts para o valor *flagp. Esse valor deve ter sido obtido por uma chamada anterior a fegetexceptflag() com um último argumento que contivesse todos os bits em excepts.
A função fetestexcept() retorna uma palavra na qual os bits definidos são os definidos no argumento excepts e para os quais a exceção correspondente está atualmente habilitada.
Rounding mode¶
The rounding mode determines how the result of floating-point operations is treated when the result cannot be exactly represented in the significand. Various rounding modes may be provided: round to nearest (the default), round up (toward positive infinity), round down (toward negative infinity), and round toward zero.
Cada uma das macros FE_TONEAREST, FE_UPWARD, FE_DOWNWARD e FE_TOWARDZERO é definida quando a implementação suporta obter e definir a direção de arredondamento correspondente.
A função fegetround() retorna a macro correspondente ao modo de arredondamento atual.
A função fesetround() define o modo de arredondamento como especificado por seu argumento e retorna zero quando for bem sucedida.
C99 and POSIX.1-2008 specify an identifier, FLT_ROUNDS, defined in <float.h>, which indicates the implementation-defined rounding behavior for floating-point addition. This identifier has one of the following values:
- -1
- The rounding mode is not determinable.
- 0
- Rounding is toward 0.
- 1
- Rounding is toward nearest number.
- 2
- Rounding is toward positive infinity.
- 3
- Rounding is toward negative infinity.
Other values represent machine-dependent, nonstandard rounding modes.
The value of FLT_ROUNDS should reflect the current rounding mode as set by fesetround() (but see BUGS).
Ambiente de Ponto Flutuante¶
O ambiente de ponto flutuante inteiro, incluindo modos de controle e indicadores de estado, pode ser tratado como um objeto opaco, de tipo fenv_t. O ambiente padrão é denotado por FE_DFL_ENV (de tipo const fenv_t *). Essa é a definição do ambiente ao início do programa e é definida por ISO C como tendo arredondamento para o mais próximo, todas as exceções desabilitadas e um modo 'non-stop' (continuar nas exceções).
A função fegetenv() salva o ambiente de ponto flutuante atual no objeto *envp.
A função feholdexcept() faz o mesmo, então zera todos indicadores de exceção, e define um modo 'non-stop' (continuar nas exceções), se disponível. Ela retorna zero quando bem sucedida.
A função fesetenv() restaura o ambiente de ponto flutuante do objeto *envp. Esse objeto deve ser reconhecidamente válido, por exemplo, o resultado de uma chamada a fegetenv() ou feholdexcept() ou igual a FE_DFL_ENV. Essa chamada não dispara exceções.
A função feupdateenv() instala o ambiente de ponto flutuante representado pelo objeto *envp, exceto que as exceções que estão atualmente disparadas não são desabilitadas. Depois de chamar essa função, as exceções disparadas serão o OR bit a bit daquelas previamente definidas com aquelas em *envp. Como antes, o objeto *envp deve ser reconhecido como sendo válido.
VALOR DE RETORNO¶
These functions return zero on success and nonzero if an error occurred.
VERSÕES¶
Estas funções apareceram pela primeira vez no glibc desde a versão 2.1.
ATRIBUTOS¶
Para uma explicação dos termos usados nesta seção, consulte attributes(7).
Interface | Atributo | Valor |
feclearexcept(), fegetexceptflag(), feraiseexcept(), fesetexceptflag(), fetestexcept(), fegetround(), fesetround(), fegetenv(), feholdexcept(), fesetenv(), feupdateenv(), feenableexcept(), fedisableexcept(), fegetexcept() | Thread safety | MT-Safe |
DE ACORDO COM¶
IEC 60559 (IEC 559:1989), ANSI/IEEE 854, C99, POSIX.1-2001.
NOTAS¶
Glibc notes¶
If possible, the GNU C Library defines a macro FE_NOMASK_ENV which represents an environment where every exception raised causes a trap to occur. You can test for this macro using #ifdef. It is defined only if _GNU_SOURCE is defined. The C99 standard does not define a way to set individual bits in the floating-point mask, for example, to trap on specific flags. Since version 2.2, glibc supports the functions feenableexcept() and fedisableexcept() to set individual floating-point traps, and fegetexcept() to query the state.
#define _GNU_SOURCE /* Veja feature_test_macros(7) */ #include <fenv.h>
int feenableexcept(int excepts); int fedisableexcept(int excepts); int fegetexcept(void);
As funções feenableexcept() e fedisableexcept() habilitam (desabilitam) capturas para cada uma das exceções representadas por excepts e retornam o conjunto anterior de exceções habilitadas quando bem sucedida, e -1 caso contrário. A função fegetexcept() retorna o conjunto de todas as exceções atualmente habilitadas.
BUGS¶
C99 specifies that the value of FLT_ROUNDS should reflect changes to the current rounding mode, as set by fesetround(). Currently, this does not occur: FLT_ROUNDS always has the value 1.
VEJA TAMBÉM¶
COLOFÃO¶
Esta página faz parte da versão 5.10 do projeto Linux man-pages. Uma descrição do projeto, informações sobre relatórios de bugs e a versão mais recente desta página podem ser encontradas em https://www.kernel.org/doc/man-pages/.
TRADUÇÃO¶
A tradução para português brasileiro desta página man foi criada por Marcelo M. de Abreu <mmabreu@terra.com.br> e André Luiz Fassone <lonely_wolf@ig.com.br>
Esta tradução é uma documentação livre; leia a Licença Pública Geral GNU Versão 3 ou posterior para as condições de direitos autorais. Nenhuma responsabilidade é aceita.
Se você encontrar algum erro na tradução desta página de manual, envie um e-mail para a lista de discussão de tradutores.
15 setembro 2017 | Linux |