feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag, fetestexcept,
fegetenv, fegetround, feholdexcept, fesetround, fesetenv, feupdateenv,
feenableexcept, fedisableexcept, fegetexcept - redondeo de coma flotante y
gestión de excepciones
Biblioteca Matemática (
libm,
-lm)
#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);
Estas once funciones fueron definidas dentro de C99 y describen el manejo del
redondeo y de las excepciones (desbordamiento por arriba, dividir-entre-cero
etc.) en coma flotante.
La excepción «dividir entre cero» (
divide-by-zero)
ocurre cuando una operación sobre números finitos produce
infinito como resultado exacto.
La excepción «desbordamiento por arriba» (
overflow)
ocurre cuando un resultado tiene que ser representado como un número en
coma flotante, pero su valor absoluto es (mucho) más grande.
La excepción «desbordamiento por abajo» (
underflow)
ocurre cuando un resultado tiene que ser representado como un número en
coma flotante, pero su valor absoluto es más pequeño que el
número positivo en coma flotante normalizado más pequeño
(y se perdería mucha precisión si se representara como un
número desnormalizado).
The exception «inexacto» (
Inexact) se produce cuando el
resultado redondeado de una operación no es igual al resultado de
precisión infinita. Puede ocurrir siempre que se produzca un
desbordamiento por arriba (
overflow) o por abajo (
underflow).
La excepción «inválido» (
invalid) ocurre
cuando no hay un resultado definido para una operación, como por
ejemplo 0/0 o infinito - infinito o sqrt(-1).
Las excepciones se representan de dos maneras: como un bit individual
(excepción presente/ausente), que se sitúa dentro de un entero
de alguna manera definida por la implementación, y también como
una estructura opaca que puede contener más información sobre la
excepción (tal vez la dirección dentro del código donde
se produjo).
Cada una de las macros
FE_DIVBYZERO,
FE_INEXACT,
FE_INVALID,
FE_OVERFLOW,
FE_UNDERFLOW se define cuando la
implementación soporta el manejo de la correspondiente
excepción, definiendose también el bit correspondiente, de forma
que se pueda llamar a las funciones de manejo de excepciones usando p.e. el
argumento entero
FE_OVERFLOW|
FE_UNDERFLOW. Otras excepciones
pueden estar soportadas. La macro
FE_ALL_EXCEPT está formada
mediante un OR lógico con todos los bits que se corresponden con
excepciones soportadas.
La función
feclearexcept() limpia las excepciones soportadas
representadas por los bits de su argumento.
La función
fegetexceptflag() almacena una representación
del estado de las banderas de excepción representadas por el argumento
excepts en el objeto opaco
*flagp.
La función
feraiseexcept() lanza las excepciones soportadas
representadas por los bits en
excepts.
La función
fesetexceptflag() configura por completo la
situación de las excepciones representadas por
excepts
según el valor dado por
*flagp. Este valor debe haber sido
obtenido mediante una llamada previa a
fegetexceptflag() con un
último argumento que tuviera todos los bits en
excepts.
La función
fetestexcept() devuelve una palabra en la que los bits
activos son aquellos que estaban activos en el argumento
excepts y para
los que la excepción correspondiente está activa actualmente.
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 una de las macros
FE_TONEAREST,
FE_UPWARD,
FE_DOWNWARD, y
FE_TOWARDZERO se define cuando la
implementación soporta el obtener y establecer la correspondiente
dirección de redondeo.
La función
fegetround() devuelve la macro correspondiente al modo
actual de redondeo.
La función
fesetround() fija el modo de redondeo según
especifique su argumento y devuelve cero cuando tiene éxito.
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
- No se puede determinar el modo de redondeo.
- 0
- El redondeo tiende a 0.
- 1
- El redondeo tiende al número más
próximo.
- 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).
El entorno de coma flotante por completo, incluyendo los modos de control y las
banderas de estado, puede ser manejado como un objeto opaco, de tipo
fenv_t. El entorno por defecto se denota por
FE_DFL_ENV (de tipo
const fenv_t *). El entorno por defecto determina la
configuración del entorno al inicio de la ejecución de un
programa y, según establece el ISO C, equivale a redondear al
más cercano, tener todas las expeciones desactivadas y usar un modo de
no-parada (continuar en excepciones).
La función
fegetenv() guarda el entorno de coma flotante actual en
el objeto
*envp.
La función
feholdexcept() hace lo mismo y a continuación
limpia todas las banderas de excepción y establece un modo de no-parada
(continuar en excepciones), si ésto es posible. Devuelve cero cuando
tiene éxito.
La función
fesetenv() restablece el entorno de coma flotante
según el objeto
*envp. Debemos asegurarnos de que este objeto es
válido, es decir, de que es el resultado de una llamada a
fegetenv() o
feholdexcept() o de que es igual a
FE_DFL_ENV. Ésta llamada no provoca excepciones.
La función
feupdateenv() instala el entorno de coma flotante
representado por el objeto
*envp, pero no desactiva las excepciones
actualmente lanzadas. Tras llamar a esta función, las excepciones
lanzadas vendrán dadas por el resultado de un O-lógico entre
aquellas previamente activas y las que haya en
*envp. Como antes,
debemos asegurarnos de que el objeto
*envp es válido.
Estas funciones devuelven cero si no ocurre ningún error y un valor
distinto de cero si ocurre algún error.
Estas funciones han sido añadidas en la versión 2.1 de glibc.
Para obtener una explicación de los términos usados en esta
sección, véase
attributes(7).
Interfaz |
Atributo |
Valor |
feclearexcept(), fegetexceptflag(),
feraiseexcept(), fesetexceptflag(), fetestexcept(),
fegetround(), fesetround(), fegetenv(),
feholdexcept(), fesetenv(), feupdateenv(),
feenableexcept(), fedisableexcept(),
fegetexcept() |
Seguridad del hilo |
Multi-hilo seguro |
IEC 60559 (IEC 559:1989), ANSI/IEEE 854, C99, POSIX.1-2001.
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 glibc 2.2, glibc supports the functions
feenableexcept()
and
fedisableexcept() to set individual floating-point traps, and
fegetexcept() to query the state.
#define _GNU_SOURCE /* Vea feature_test_macros(7) */
#include <fenv.h>
int feenableexcept(int excepts);
int fedisableexcept(int excepts);
int fegetexcept(void);
Las funciones
feenableexcept() y
fedisableexcept() habilitan
(deshabilitan) trampas para cada excepción representada por
excepts y devuelven el conjunto previo de excepciones habilitadas
cuando tienen éxito y -1 en caso contrario. La función
fegetexcept() devuelve el conjunto de todas las excepciones habilitadas
actualmente.
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.
math_error(7)
La traducción al español de esta página del manual fue
creada por Miguel Pérez Ibars <
[email protected]> y Marcos
Fouces <
[email protected]>
Esta traducción es documentación libre; lea la
GNU
General Public License Version 3 o posterior con respecto a las
condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.
Si encuentra algún error en la traducción de esta página
del manual, envíe un correo electrónico a
[email protected]