Scroll to navigation

fenv(3) Library Functions Manual fenv(3)

NOME

feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag, fetestexcept, fegetenv, fegetround, feholdexcept, fesetround, fesetenv, feupdateenv, feenableexcept, fedisableexcept, fegetexcept - tratamento de exceção e arredondamento de ponto flutuante

BIBLIOTECA

Biblioteca matemática (libm, -lm)

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);

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 desnormalizado).

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.

Modo de arredondamento

O modo de arredondamento determina como o resultado de operações de ponto flutuante é tratado quando o resultado não pode ser representado exatamente no significando. Vários modos de arredondamento podem ser fornecidos: arredondar para o mais próximo (o padrão), arredondar para cima (em direção ao infinito positivo), arredondar para baixo (em direção ao infinito negativo) e arredondar para 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 e POSIX.1-2008 especificam um identificador, FLT_ROUNDS, definido em <float.h>, que indica o comportamento de arredondamento definido pela implementação para adição de ponto flutuante. Este identificador tem um dos seguintes valores:

-1
O modo de arredondamento não é determinável.
0
O arredondamento é para 0.
1
O arredondamento é para o número mais próximo.
2
O arredondamento é em direção ao infinito positivo.
3
O arredondamento é em direção ao infinito negativo.

Outros valores representam modos de arredondamento não padronizados e dependentes da máquina.

O valor de FLT_ROUNDS deve refletir o modo de arredondamento atual definido por fesetround() (mas veja 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

Essas funções retornam zero em caso de sucesso e diferente de zero se ocorrer um erro.

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

PADRÕES

C11, POSIX.1-2008, IEC 60559 (IEC 559:1989), ANSI/IEEE 854.

HISTÓRICO

C99, POSIX.1-2001. glibc 2.1.

NOTAS

Notas sobre glibc

Se possível, a Biblioteca C GNU define a macro FE_NOMASK_ENV a qual representa um ambiente em que toda exceção disparada causa a ocorrência de uma captura. Você pode testar por essa macro usando #ifdef. Ela só é definida se _GNU_SOURCE estiver definida. O padrão C99 não define uma forma de definir bits individuais na máscara de ponto flutuante, por exemplo, para capturar quando de indicadores específicos. glibc 2.2 suportará as funções feenableexcept() e fedisableexcept() para definir capturas de ponto flutuante individuais, e fegetexcept() para obter o estado.

#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 especifica que o valor de FLT_ROUNDS deve refletir alterações no modo de arredondamento atual, conforme definido por fesetround(). Atualmente, isso não ocorre: FLT_ROUNDS sempre tem o valor 1.

VEJA TAMBÉM

math_error(7)

TRADUÇÃO

A tradução para português brasileiro desta página man foi criada por Marcelo M. de Abreu <mmabreu@terra.com.br>, André Luiz Fassone <lonely_wolf@ig.com.br> e Rafael Fontenelle <rafaelff@gnome.org>.

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.

2 maio 2024 Linux man-pages 6.9.1